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 2a ommand to eval *
1360: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
1370: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
1380: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
1390: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 ck);. Tcl_Lis
13a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
13b0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
13c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
13d0: 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b bj("info", -1));
13e0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
13f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1400: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
1410: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
1420: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
1430: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
1440: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 >self), -1));.
1450: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1460: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1470: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
1480: 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f ewStringObj(majo
1490: 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c r, -1));. Tcl
14a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
14b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
14c0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
14d0: 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 ingObj(minor, -1
14e0: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 ));.. if (whe
14f0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 re & SSL_CB_ALER
1500: 54 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 T) {..Tcl_ListOb
1510: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1520: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
1530: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
1540: 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 64 gObj(SSL_alert_d
1550: 65 73 63 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 esc_string_long(
1560: 72 65 74 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ret), -1));..Tcl
1570: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1580: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
1590: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
15a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
15b0: 61 6c 65 72 74 5f 74 79 70 65 5f 73 74 72 69 6e alert_type_strin
15c0: 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 g_long(ret), -1)
15d0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
15e0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
15f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
1600: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
1610: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1620: 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 SSL_state_string
1630: 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 _long(ssl), -1))
1640: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
1650: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
1660: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
1670: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e NewStringObj("in
1680: 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d fo", -1));. }
1690: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
16a0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
16b0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
16c0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
16d0: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b EvalCallback
16e0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
16f0: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 r, cmdPtr);.
1700: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
1710: 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a (cmdPtr);.}.../*
1720: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1760: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 ------. *. * Mes
1770: 73 61 67 65 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a sageCallback --.
1780: 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 *. *.Monitors S
1790: 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 SL protocol mess
17a0: 61 67 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ages. *. * Resul
17b0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
17c0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
17d0: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
17e0: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
17f0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e -------. */.#ifn
1840: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 def OPENSSL_NO_S
1850: 53 4c 5f 54 52 41 43 45 0a 73 74 61 74 69 63 20 SL_TRACE.static
1860: 76 6f 69 64 0a 4d 65 73 73 61 67 65 43 61 6c 6c void.MessageCall
1870: 62 61 63 6b 28 69 6e 74 20 77 72 69 74 65 5f 70 back(int write_p
1880: 2c 20 69 6e 74 20 76 65 72 73 69 6f 6e 2c 20 69 , int version, i
1890: 6e 74 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c nt content_type,
18a0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 75 66 const void *buf
18b0: 2c 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 , size_t len, SS
18c0: 4c 20 2a 73 73 6c 2c 20 76 6f 69 64 20 2a 61 72 L *ssl, void *ar
18d0: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a g) {. State *
18e0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
18f0: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f e*)arg;. Tcl_
1900: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d Interp *interp.=
1910: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
1920: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
1930: 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 cmdPtr;. char
1940: 20 2a 76 65 72 2c 20 2a 74 79 70 65 3b 0a 20 20 *ver, *type;.
1950: 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 BIO *bio;.
1960: 63 68 61 72 20 62 75 66 66 65 72 5b 31 35 30 30 char buffer[1500
1970: 30 5d 3b 0a 20 20 20 20 62 75 66 66 65 72 5b 30 0];. buffer[0
1980: 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 ] = 0;.. dpri
1990: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
19a0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
19b0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
19c0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 cl_Obj*)NULL)..r
19d0: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 77 69 74 eturn;.. swit
19e0: 63 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23 69 ch(version) {.#i
19f0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
1a00: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
1a10: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 00000L && !defin
1a20: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 ed(NO_SSL2) && !
1a30: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
1a40: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 NO_SSL2). cas
1a50: 65 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a e SSL2_VERSION:.
1a60: 09 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b 0a .ver = "SSLv2";.
1a70: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
1a80: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 if !defined(NO_S
1a90: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
1aa0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
1ab0: 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ). case SSL3_
1ac0: 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 VERSION:..ver =
1ad0: 22 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b 3b "SSLv3";..break;
1ae0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 .#endif. case
1af0: 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 TLS1_VERSION:..
1b00: 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a 09 ver = "TLSv1";..
1b10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1b20: 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a TLS1_1_VERSION:.
1b30: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31 22 .ver = "TLSv1.1"
1b40: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1b50: 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 4f se TLS1_2_VERSIO
1b60: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 N:..ver = "TLSv1
1b70: 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 .2";..break;.
1b80: 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45 52 case TLS1_3_VER
1b90: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c SION:..ver = "TL
1ba0: 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b 0a Sv1.3";..break;.
1bb0: 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65 72 case 0:..ver
1bc0: 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 = "none";..brea
1bd0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a k;. default:.
1be0: 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 .ver = "unknown"
1bf0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a ;..break;. }.
1c00: 0a 20 20 20 20 73 77 69 74 63 68 20 28 63 6f 6e . switch (con
1c10: 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20 20 tent_type) {.
1c20: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 45 case SSL3_RT_HE
1c30: 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22 48 ADER:..type = "H
1c40: 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a eader";..break;.
1c50: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 case SSL3_RT
1c60: 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 _INNER_CONTENT_T
1c70: 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49 6e YPE:..type = "In
1c80: 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70 65 ner Content Type
1c90: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 ";..break;. c
1ca0: 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 4e ase SSL3_RT_CHAN
1cb0: 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a 0a GE_CIPHER_SPEC:.
1cc0: 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65 20 .type = "Change
1cd0: 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b 3b Cipher";..break;
1ce0: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1cf0: 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d T_ALERT:..type =
1d00: 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61 6b "Alert";..break
1d10: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ;. case SSL3_
1d20: 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 RT_HANDSHAKE:..t
1d30: 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 ype = "Handshake
1d40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 ";..break;. c
1d50: 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c ase SSL3_RT_APPL
1d60: 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 ICATION_DATA:..t
1d70: 79 70 65 20 3d 20 22 41 70 70 20 44 61 74 61 22 ype = "App Data"
1d80: 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20 4f 50 ;..break;.#if OP
1d90: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
1da0: 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
1db0: 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54 4c 53 0L. case DTLS
1dc0: 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54 3a 0a 1_RT_HEARTBEAT:.
1dd0: 09 74 79 70 65 20 3d 20 22 48 65 61 72 74 62 65 .type = "Heartbe
1de0: 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e at";..break;.#en
1df0: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a dif. default:
1e00: 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 ..type = "unknow
1e10: 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f n";. }.. /
1e20: 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 20 * Needs compile
1e30: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e 61 time option "ena
1e40: 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e 20 ble-ssl-trace".
1e50: 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f 20 */. if ((bio
1e60: 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f = BIO_new(BIO_s_
1e70: 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c 29 mem())) != NULL)
1e80: 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f {..int n;..SSL_
1e90: 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20 76 trace(write_p, v
1ea0: 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f ersion, content_
1eb0: 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 type, buf, len,
1ec0: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 6f ssl, (void *)bio
1ed0: 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 64 );..n = BIO_read
1ee0: 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 49 (bio, buffer, BI
1ef0: 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20 3c O_pending(bio) <
1f00: 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 65 6e 15000 ? BIO_pen
1f10: 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 39 39 ding(bio) : 1499
1f20: 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 9);..n = (n<0) ?
1f30: 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 0 : n;..buffer[
1f40: 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 n] = 0;..(void)B
1f50: 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 IO_flush(bio);..
1f60: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 BIO_free(bio);.
1f70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
1f80: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
1f90: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 al */. cmdPtr
1fa0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
1fb0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
1fc0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c llback);. Tcl
1fd0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1fe0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
1ff0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
2000: 69 6e 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 ingObj("message"
2010: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
2020: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2030: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
2040: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
2050: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
2060: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
2070: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
2080: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
2090: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
20a0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
20b0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
20c0: 62 6a 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 bj(write_p ? "Se
20d0: 6e 74 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 nt" : "Received"
20e0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
20f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2100: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
2110: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
2120: 6e 67 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b ngObj(ver, -1));
2130: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2140: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2150: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
2160: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 l_NewStringObj(t
2170: 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 ype, -1));. T
2180: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2190: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
21a0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
21b0: 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c tringObj(buffer,
21c0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 -1));.. /* E
21d0: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d val callback com
21e0: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f mand */. Tcl_
21f0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
2200: 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 Ptr);. EvalCa
2210: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 llback(interp, s
2220: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 tatePtr, cmdPtr)
2230: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 ;. Tcl_DecrRe
2240: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
2250: 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a }.#endif.../*. *
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22a0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 ---. *. * Verify
22b0: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 Callback --. *.
22c0: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 *.Monitors SSL c
22d0: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 ertificate valid
22e0: 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 ation process. U
22f0: 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 sed to control t
2300: 68 65 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 he. *.behavior w
2310: 68 65 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 hen the SSL_VERI
2320: 46 59 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 FY_PEER flag is
2330: 73 65 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c set. This is cal
2340: 6c 65 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 led. *.whenever
2350: 61 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 a certificate is
2360: 20 69 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 inspected or de
2370: 63 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 cided invalid. C
2380: 61 6c 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 alled for. *.eac
2390: 68 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e h certificate in
23a0: 20 74 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e the cert chain.
23b0: 0a 20 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 . *. * Checks:.
23c0: 2a 09 63 65 72 74 69 66 69 63 61 74 65 20 63 68 *.certificate ch
23d0: 61 69 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 ain is checked s
23e0: 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 tarting with the
23f0: 20 64 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 deepest nesting
2400: 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 level. *. (the
2410: 20 72 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 root CA certifi
2420: 63 61 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 cate) and worked
2430: 20 75 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 upward to the p
2440: 65 65 72 27 73 20 63 65 72 74 69 66 69 63 61 74 eer's certificat
2450: 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 e.. *.All signat
2460: 75 72 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 ures are valid,
2470: 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 current time is
2480: 77 69 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 within first and
2490: 20 6c 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 last validity t
24a0: 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 ime.. *.Check th
24b0: 61 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61 at the certifica
24c0: 74 65 20 69 73 20 69 73 73 75 65 64 20 62 79 20 te is issued by
24d0: 74 68 65 20 69 73 73 75 65 72 20 63 65 72 74 69 the issuer certi
24e0: 66 69 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 ficate issuer..
24f0: 2a 09 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f *.Check the revo
2500: 63 61 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f cation status fo
2510: 72 20 65 61 63 68 20 63 65 72 74 69 66 69 63 61 r each certifica
2520: 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 te.. *.Check the
2530: 20 76 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 validity of the
2540: 20 67 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 given CRL and t
2550: 68 65 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 he cert revocati
2560: 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 on status.. *.Ch
2570: 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 eck the policies
2580: 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 of all the cert
2590: 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 ificates. *. * A
25a0: 72 67 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 rgs. *.preverify
25b0: 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 _ok indicates wh
25c0: 65 74 68 65 72 20 74 68 65 20 63 65 72 74 69 66 ether the certif
25d0: 69 63 61 74 65 20 76 65 72 69 66 69 63 61 74 69 icate verificati
25e0: 6f 6e 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 on passed (1) or
25f0: 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 not (0). *. * R
2600: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c esults:. *.A cal
2610: 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 lback bound to t
2620: 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 he socket may re
2630: 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 turn one of:. *.
2640: 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 0...- the ce
2650: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 rtificate is dee
2660: 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e med invalid, sen
2670: 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 d verification.
2680: 2a 09 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 *.... failure a
2690: 6c 65 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e lert to peer, an
26a0: 64 20 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 d terminate hand
26b0: 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 shake.. *. 1.
26c0: 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 ..- the certific
26d0: 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 ate is deemed va
26e0: 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 lid, continue wi
26f0: 74 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a th handshake.. *
2700: 09 20 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e . empty strin
2710: 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f g.- no change to
2720: 20 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c certificate val
2730: 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 idation. *. * Si
2740: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 de effects:. *.T
2750: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 he err field of
2760: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 the currently op
2770: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73 erative State is
2780: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 set. *. to a s
2790: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 tring describing
27a0: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 the SSL negotia
27b0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 tion failure rea
27c0: 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d son. *. *-------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
2810: 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 .static int.Veri
2820: 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f fyCallback(int o
2830: 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 k, X509_STORE_CT
2840: 58 20 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 X *ctx) {. Tc
2850: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
2860: 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d SSL *ssl..=
2870: 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 (SSL*)X509_STOR
2880: 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 E_CTX_get_ex_dat
2890: 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 a(ctx, SSL_get_e
28a0: 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 x_data_X509_STOR
28b0: 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 E_CTX_idx());.
28c0: 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d X509 *cert..=
28d0: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f X509_STORE_CTX_
28e0: 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 get_current_cert
28f0: 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 (ctx);. State
2900: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 *statePtr.= (St
2910: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 ate*)SSL_get_app
2920: 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 _data(ssl);.
2930: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
2940: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
2950: 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 nterp;. int d
2960: 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f epth..= X509_STO
2970: 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 RE_CTX_get_error
2980: 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 _depth(ctx);.
2990: 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 int err..= X509
29a0: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 _STORE_CTX_get_e
29b0: 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 rror(ctx);..
29c0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
29d0: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 );. dprintf("
29e0: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 VerifyCallback:
29f0: 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 %d", ok);.. i
2a00: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d f (statePtr->vcm
2a10: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e d == (Tcl_Obj*)N
2a20: 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f ULL) {../* Use o
2a30: 6b 20 76 61 6c 75 65 20 69 66 20 76 65 72 69 66 k value if verif
2a40: 69 63 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 ication is requi
2a50: 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 red */..if (stat
2a60: 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 ePtr->vflags & S
2a70: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 SL_VERIFY_FAIL_I
2a80: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 F_NO_PEER_CERT)
2a90: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b {.. return ok
2aa0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
2ab0: 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 return 1;..}.
2ac0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 } else if (cer
2ad0: 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c t == NULL || ssl
2ae0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
2af0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 urn 0;. }..
2b00: 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 dprintf("Verif
2b10: 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c 20 yCallback: eval
2b20: 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20 callback");..
2b30: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
2b40: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
2b50: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
2b60: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
2b70: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
2b80: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2b90: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2ba0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
2bb0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 wStringObj("veri
2bc0: 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 fy", -1));. T
2bd0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2be0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2bf0: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 cmdPtr,..Tcl_New
2c00: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 StringObj(Tcl_Ge
2c10: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
2c20: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
2c30: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2c40: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2c50: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2c60: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 Tcl_NewIntObj(d
2c70: 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f epth));. Tcl_
2c80: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2c90: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
2ca0: 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 Ptr, Tls_NewX509
2cb0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 Obj(interp, cert
2cc0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2cd0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2ce0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2cf0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f Tcl_NewIntObj(o
2d00: 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 k));. Tcl_Lis
2d10: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2d20: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2d30: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 ,..Tcl_NewString
2d40: 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f Obj((char*)X509_
2d50: 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f verify_cert_erro
2d60: 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d r_string(err), -
2d70: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 1));.. /* Pre
2d80: 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 vent I/O while c
2d90: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72 allback is in pr
2da0: 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a ogress */. /*
2db0: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 statePtr->flags
2dc0: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c |= TLS_TCL_CALL
2dd0: 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a BACK; */.. /*
2de0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 Eval callback c
2df0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 ommand */. Tc
2e00: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
2e10: 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d mdPtr);. ok =
2e20: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e EvalCallback(in
2e30: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
2e40: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c cmdPtr);. Tcl
2e50: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
2e60: 64 50 74 72 29 3b 0a 0a 20 20 20 20 64 70 72 69 dPtr);.. dpri
2e70: 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 ntf("VerifyCallb
2e80: 61 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72 65 73 ack: command res
2e90: 75 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29 3b 0a ult = %d", ok);.
2ea0: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 . /* statePtr
2eb0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 ->flags &= ~(TLS
2ec0: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 _TCL_CALLBACK);
2ed0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b */. return(ok
2ee0: 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 );./* By default
2ef0: 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 , leave verifica
2f00: 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 tion unchanged.
2f10: 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d */.}.../*. *----
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2f60: 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 *. * Tls_Error
2f70: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 --. *. *.Calls c
2f80: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 allback with lis
2f90: 74 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a t of errors.. *.
2fa0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
2fb0: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c . *.The err fiel
2fc0: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 d of the current
2fd0: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 ly operative Sta
2fe0: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 te is set. *. t
2ff0: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 o a string descr
3000: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 ibing the SSL ne
3010: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 gotiation failur
3020: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d e reason. *. *--
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3070: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 -. */.void.Tls_E
3080: 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 rror(State *stat
3090: 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 ePtr, char *msg)
30a0: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 {. Tcl_Inter
30b0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
30c0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
30d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
30e0: 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 r, *listPtr;.
30f0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 unsigned long e
3100: 72 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 rr;. statePtr
3110: 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 ->err = msg;..
3120: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
3130: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
3140: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
3150: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
3160: 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 LL)..return;..
3170: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
3180: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 and to eval */.
3190: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
31a0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
31b0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
31c0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
31d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
31e0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
31f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3200: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 "error", -1));.
3210: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3220: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3230: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
3240: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3250: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
3260: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
3270: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
3280: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 if (msg != NULL)
3290: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
32a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
32b0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
32c0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 _NewStringObj(ms
32d0: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 g, -1));.. }
32e0: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 else if ((msg =
32f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
3300: 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 mObj(Tcl_GetObjR
3310: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 28 esult(interp), (
3320: 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c Tcl_Size *) NULL
3330: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 )) != NULL) {..T
3340: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3350: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3360: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
3370: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 tringObj(msg, -1
3380: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 ));.. } else
3390: 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c {..listPtr = Tcl
33a0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
33b0: 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65 ULL);..while ((e
33c0: 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 rr = ERR_get_err
33d0: 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20 or()) != 0) {..
33e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
33f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3400: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c rp, listPtr, Tcl
3410: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52 _NewStringObj(ER
3420: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 R_reason_error_s
3430: 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 tring(err), -1))
3440: 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 ;..}..Tcl_ListOb
3450: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3460: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c nterp, cmdPtr, l
3470: 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a istPtr);. }..
3480: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
3490: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
34a0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
34b0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
34c0: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 EvalCallback(i
34d0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
34e0: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 cmdPtr);. Tc
34f0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
3500: 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 mdPtr);.}.../*.
3510: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3550: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f ----. *. * KeyLo
3560: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a gCallback --. *.
3570: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 *.Write receive
3580: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f d key data to lo
3590: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 g file.. *. * Si
35a0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
35b0: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3600: 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c .void KeyLogCall
3610: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a back(const SSL *
3620: 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 ssl, const char
3630: 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 *line) {. cha
3640: 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 r *str = getenv(
3650: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a SSLKEYLOGFILE);.
3660: 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 FILE *fd;..
3670: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
3680: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
3690: 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 tr) {..fd = fope
36a0: 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 n(str, "a");..fp
36b0: 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 rintf(fd, "%s\n"
36c0: 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 ,line);..fclose(
36d0: 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f fd);. }.}.../
36e0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3720: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 -------. *. * Pa
3730: 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 ssword Callback
3740: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
3750: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 when a password
3760: 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65 for a private ke
3770: 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69 6e y loading/storin
3780: 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 74 69 g a PEM. *.certi
3790: 66 69 63 61 74 65 20 77 69 74 68 20 65 6e 63 72 ficate with encr
37a0: 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 yption. Evals ca
37b0: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 61 6e llback script an
37c0: 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 68 65 d returns. *.the
37d0: 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 70 result as the p
37e0: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69 assword string i
37f0: 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 n buf.. *. * Res
3800: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
3810: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
3820: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
3830: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
3840: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
3850: 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65 *.Password size
3860: 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20 in bytes or -1
3870: 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a for an error.. *
3880: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
3890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
38d0: 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 c int.PasswordCa
38e0: 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 llback(char *buf
38f0: 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 , int size, int
3900: 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 rwflag, void *ud
3910: 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 ata) {. State
3920: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 *statePtr.= (St
3930: 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 ate *) udata;.
3940: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
3950: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
3960: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
3970: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
3980: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 int code;..
3990: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
39a0: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e ");.. /* If n
39b0: 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 o callback, use
39c0: 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b default callback
39d0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
39e0: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
39f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 = NULL) {..if (T
3a00: 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 cl_EvalEx(interp
3a10: 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 , "tls::password
3a20: 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f ", -1, TCL_EVAL_
3a30: 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f GLOBAL) == TCL_O
3a40: 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a K) {.. char *
3a50: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 ret = (char *) T
3a60: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 cl_GetStringResu
3a70: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 lt(interp);..
3a80: 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 strncpy(buf, re
3a90: 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 t, (size_t) size
3aa0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 );.. return (
3ab0: 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b int)strlen(ret);
3ac0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
3ad0: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 return -1;..}.
3ae0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
3af0: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
3b00: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 al */. cmdPtr
3b10: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
3b20: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 Obj(statePtr->pa
3b30: 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c ssword);. Tcl
3b40: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3b50: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3b60: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
3b70: 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64 ingObj("password
3b80: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
3b90: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3ba0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3bb0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 dPtr, Tcl_NewInt
3bc0: 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20 Obj(rwflag));.
3bd0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
3be0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3bf0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
3c00: 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b ewIntObj(size));
3c10: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 .. Tcl_Preser
3c20: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
3c30: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c interp);. Tcl
3c40: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
3c50: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
3c60: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
3c70: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
3c80: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
3c90: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
3ca0: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f . code = Tcl_
3cb0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 EvalObjEx(interp
3cc0: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 , cmdPtr, TCL_EV
3cd0: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 AL_GLOBAL);.
3ce0: 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f if (code != TCL_
3cf0: 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d OK) {.#if (TCL_M
3d00: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 AJOR_VERSION ==
3d10: 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 8) && (TCL_MINOR
3d20: 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 _VERSION < 6)..T
3d30: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 cl_BackgroundErr
3d40: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 or(interp);.#els
3d50: 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e e..Tcl_Backgroun
3d60: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 dException(inter
3d70: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 p, code);.#endif
3d80: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
3d90: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
3da0: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 tr);.. Tcl_Re
3db0: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
3dc0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
3dd0: 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73 /* If success
3de0: 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70 ful, pass back p
3df0: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61 assword string a
3e00: 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66 20 74 nd truncate if t
3e10: 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 oo long */. i
3e20: 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f f (code == TCL_O
3e30: 4b 29 20 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c K) {..Tcl_Size l
3e40: 65 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d en;..char *ret =
3e50: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 (char *) Tcl_Ge
3e60: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 tStringFromObj(T
3e70: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
3e80: 69 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a interp), &len);.
3e90: 09 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f .if (len > (Tcl_
3ea0: 53 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a Size) size-1) {.
3eb0: 09 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f . len = (Tcl_
3ec0: 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d Size) size-1;..}
3ed0: 0a 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 ..strncpy(buf, r
3ee0: 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e et, (size_t) len
3ef0: 29 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 );..buf[len] = '
3f00: 5c 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 \0';..Tcl_Releas
3f10: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
3f20: 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 nterp);..return(
3f30: 28 69 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20 20 (int) len);.
3f40: 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 }. Tcl_Releas
3f50: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
3f60: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 nterp);. retu
3f70: 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a rn -1;.}.../*. *
3f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fc0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f ---. *. * Sessio
3fd0: 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 n Callback for C
3fe0: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 lients --. *. *.
3ff0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 Called when a ne
4000: 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64 w session is add
4010: 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e ed to the cache.
4020: 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 In TLS 1.3. *.t
4030: 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 69 his may be recei
4040: 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d ved multiple tim
4050: 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61 6e es after the han
4060: 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 dshake. For. *.e
4070: 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c arlier versions,
4080: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 this will be re
4090: 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 68 ceived during th
40a0: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 e handshake.. *.
40b0: 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65 66 This is the pref
40c0: 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74 erred way to obt
40d0: 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20 ain a resumable
40e0: 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 session.. *. * R
40f0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
4100: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
4110: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
4120: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
4130: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 d). *. * Return
4140: 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 codes:. *.0 = er
4150: 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 6f ror where sessio
4160: 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 n will be immedi
4170: 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 ately removed fr
4180: 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 om the internal
4190: 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 cache.. *.1 = su
41a0: 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70 20 ccess where app
41b0: 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 retains session
41c0: 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65 in session cache
41d0: 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 , and must call
41e0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 SSL_SESSION_free
41f0: 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a () when done.. *
4200: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4240: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
4250: 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c c int.SessionCal
4260: 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 lback(SSL *ssl,
4270: 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 SSL_SESSION *ses
4280: 73 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 sion) {. Stat
4290: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
42a0: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 tate*)SSL_get_ap
42b0: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 p_data((SSL *)ss
42c0: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 l);. Tcl_Inte
42d0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
42e0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
42f0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
4300: 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e tr;. const un
4310: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 signed char *tic
4320: 6b 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 ket;. const u
4330: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 nsigned char *se
4340: 73 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 ssion_id;. si
4350: 7a 65 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 ze_t len2;. u
4360: 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e nsigned int ulen
4370: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
4380: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
4390: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
43a0: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
43b0: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 j*)NULL) {..retu
43c0: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
43d0: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 R_OK;. } else
43e0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
43f0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
4400: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
4410: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
4420: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
4430: 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d o eval */. cm
4440: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
4450: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
4460: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 ->callback);.
4470: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4480: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4490: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
44a0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 wStringObj("sess
44b0: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ion", -1));.
44c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
44d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
44e0: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
44f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 l_NewStringObj(T
4500: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
4510: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
4520: 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a ), -1));.. /*
4530: 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 Session id */.
4540: 20 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 session_id =
4550: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
4560: 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 id(session, &ule
4570: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 n);. Tcl_List
4580: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
4590: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
45a0: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 Tcl_NewByteArra
45b0: 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c yObj(session_id,
45c0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e (Tcl_Size) ulen
45d0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 ));.. /* Sess
45e0: 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a 20 20 ion ticket */.
45f0: 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 SSL_SESSION_ge
4600: 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f t0_ticket(sessio
4610: 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e n, &ticket, &len
4620: 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 2);. Tcl_List
4630: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
4640: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
4650: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 Tcl_NewByteArra
4660: 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 54 63 yObj(ticket, (Tc
4670: 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 29 3b 0a l_Size) len2));.
4680: 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 . /* Lifetime
4690: 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 - number of sec
46a0: 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f onds */. Tcl_
46b0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
46c0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
46d0: 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e Ptr,..Tcl_NewLon
46e0: 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f gObj((long) SSL_
46f0: 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b SESSION_get_tick
4700: 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 et_lifetime_hint
4710: 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 (session)));..
4720: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
4730: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
4740: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
4750: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
4760: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
4770: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
4780: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
4790: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
47a0: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
47b0: 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 0;.}.../*. *---
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4800: 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c . *. * ALPN Call
4810: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 back for Servers
4820: 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 and NPN Callbac
4830: 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d k for Clients --
4840: 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 . *. *.Perform p
4850: 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e rotocol (http/1.
4860: 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 1, h2, h3, etc.)
4870: 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 selection for t
4880: 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 he. *.incoming c
4890: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 onnection. Calle
48a0: 64 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e d after Hello an
48b0: 64 20 73 65 72 76 65 72 20 63 61 6c 6c 62 61 63 d server callbac
48c0: 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 ks.. *.Where 'ou
48d0: 74 27 20 69 73 20 73 65 6c 65 63 74 65 64 20 70 t' is selected p
48e0: 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 rotocol and 'in'
48f0: 20 69 73 20 74 68 65 20 70 65 65 72 20 61 64 76 is the peer adv
4900: 65 72 74 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a ertised list.. *
4910: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
4920: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
4930: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
4940: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
4950: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 efined). *. * Re
4960: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 turn codes:. *.S
4970: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
4980: 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 : ALPN protocol
4990: 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f selected. The co
49a0: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
49b0: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es.. *.SSL_TLSEX
49c0: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 T_ERR_ALERT_FATA
49d0: 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 L: There was no
49e0: 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 overlap between
49f0: 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 the client's. *.
4a00: 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c 69 73 supplied lis
4a10: 74 20 61 6e 64 20 74 68 65 20 73 65 72 76 65 72 t and the server
4a20: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 configuration.
4a30: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 The connection w
4a40: 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 2e 0a ill be aborted..
4a50: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
4a60: 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 R_NOACK: ALPN pr
4a70: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 otocol not selec
4a80: 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 ted, e.g., becau
4a90: 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 se no ALPN. *.
4aa0: 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 protocols are
4ab0: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 configured for t
4ac0: 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 his connection.
4ad0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
4ae0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d ontinues.. *. *-
4af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b30: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
4b40: 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 53 t.ALPNCallback(S
4b50: 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 SL *ssl, const u
4b60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f nsigned char **o
4b70: 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ut, unsigned cha
4b80: 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 r *outlen,..cons
4b90: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
4ba0: 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e *in, unsigned in
4bb0: 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 t inlen, void *a
4bc0: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 rg) {. State
4bd0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
4be0: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c te*)arg;. Tcl
4bf0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
4c00: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
4c10: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
4c20: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 *cmdPtr;. int
4c30: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 code, res;..
4c40: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
4c50: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c ");.. if (ssl
4c60: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 == NULL || arg
4c70: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
4c80: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
4c90: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a R_NOACK;. }..
4ca0: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 70 72 /* Select pr
4cb0: 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 otocol */. if
4cc0: 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 (SSL_select_nex
4cd0: 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 67 6e 65 t_proto((unsigne
4ce0: 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 74 2c 20 d char **) out,
4cf0: 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 outlen, statePtr
4d00: 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 ->protos, stateP
4d10: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a tr->protos_len,.
4d20: 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f .in, inlen) == O
4d30: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 PENSSL_NPN_NEGOT
4d40: 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74 IATED) {../* Mat
4d50: 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73 ch found */..res
4d60: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 = SSL_TLSEXT_ER
4d70: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 R_OK;. } else
4d80: 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e {../* OPENSSL_N
4d90: 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20 PN_NO_OVERLAP =
4da0: 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75 No overlap, so u
4db0: 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 66 72 se first item fr
4dc0: 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63 om client protoc
4dd0: 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20 ol list */..res
4de0: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 = SSL_TLSEXT_ERR
4df0: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
4e00: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
4e10: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 >vcmd == (Tcl_Ob
4e20: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 j*)NULL) {..retu
4e30: 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20 rn res;. }..
4e40: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
4e50: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a mand to eval */.
4e60: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
4e70: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
4e80: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 atePtr->vcmd);.
4e90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4ea0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4eb0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
4ec0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c NewStringObj("al
4ed0: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 pn", -1));. T
4ee0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
4ef0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
4f00: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
4f10: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
4f20: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
4f30: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
4f40: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
4f50: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
4f60: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
4f70: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
4f80: 6e 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 ngObj((const cha
4f90: 72 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b r *) *out, -1));
4fa0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4fb0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4fc0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
4fd0: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 l_NewBooleanObj(
4fe0: 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 res == SSL_TLSEX
4ff0: 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 T_ERR_OK));..
5000: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 /* Eval callbac
5010: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 k command */.
5020: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
5030: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 t(cmdPtr);. i
5040: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 f ((code = EvalC
5050: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
5060: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
5070: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d )) > 1) {..res =
5080: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5090: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 NOACK;. } els
50a0: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 e if (code == 1)
50b0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
50c0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
50d0: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
50e0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
50f0: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 ALERT_FATAL;.
5100: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 }. Tcl_DecrR
5110: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
5120: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b . return res;
5130: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
5180: 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 . * Advertise Pr
5190: 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b otocols Callback
51a0: 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 for Next Protoc
51b0: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 ol Negotiation (
51c0: 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 NPN) in ServerHe
51d0: 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c llo --. *. *.cal
51e0: 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 led when a TLS s
51f0: 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 erver needs a li
5200: 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 st of supported
5210: 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 protocols for Ne
5220: 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e xt. *.Protocol N
5230: 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 egotiation.. *.
5240: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
5250: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
5260: 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 fects:. *. * Ret
5270: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
5280: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a L_TLSEXT_ERR_OK:
5290: 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 NPN protocol se
52a0: 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e lected. The conn
52b0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
52c0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
52d0: 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 ERR_NOACK: NPN p
52e0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 rotocol not sele
52f0: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 cted. The connec
5300: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a tion continues..
5310: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 --------. */.#if
5360: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 def USE_NPN.stat
5370: 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 ic int.NPNCallba
5380: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 ck(const SSL *ss
5390: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 l, const unsigne
53a0: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e d char **out, un
53b0: 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c signed int *outl
53c0: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b en, void *arg) {
53d0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
53e0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
53f0: 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 rg;.. dprintf
5400: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
5410: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
5420: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 || arg == NULL)
5430: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
5440: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
5450: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
5460: 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 et protocols lis
5470: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 t */. if (sta
5480: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d tePtr->protos !=
5490: 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d NULL) {..*out =
54a0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
54b0: 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 s;..*outlen = st
54c0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c atePtr->protos_l
54d0: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b en;. } else {
54e0: 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 ..*out = NULL;..
54f0: 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 *outlen = 0;..re
5500: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
5510: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
5520: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f . return SSL_
5530: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d TLSEXT_ERR_OK;.}
5540: 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d .#endif.../*. *-
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5590: 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c --. *. * SNI Cal
55a0: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 lback for Server
55b0: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f s --. *. *.Perfo
55c0: 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 rm server-side S
55d0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 NI hostname sele
55e0: 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 ction after rece
55f0: 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 iving SNI extens
5600: 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 ion. *.in Client
5610: 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 Hello. Called a
5620: 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 fter hello callb
5630: 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 ack but before A
5640: 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a LPN callback.. *
5650: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
5660: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
5670: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
5680: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
5690: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 efined). *. * Re
56a0: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 turn codes:. *.S
56b0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
56c0: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 : SNI hostname i
56d0: 73 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 s accepted. The
56e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
56f0: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
5700: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 EXT_ERR_ALERT_FA
5710: 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d TAL: SNI hostnam
5720: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 e is not accepte
5730: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f d. The connectio
5740: 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 n. *. is abor
5750: 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 ted. Default for
5760: 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 alert is SSL_AD
5770: 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 _UNRECOGNIZED_NA
5780: 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 ME.. *.SSL_TLSEX
5790: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e T_ERR_ALERT_WARN
57a0: 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d ING: SNI hostnam
57b0: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 e is not accepte
57c0: 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 d, warning alert
57d0: 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f . *. sent (no
57e0: 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 t supported in T
57f0: 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e LSv1.3). The con
5800: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
5810: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s.. *.SSL_TLSEXT
5820: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 _ERR_NOACK: SNI
5830: 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 hostname is not
5840: 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 accepted and not
5850: 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 acknowledged,.
5860: 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e *. e.g. if SN
5870: 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 I has not been c
5880: 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 onfigured. The c
5890: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
58a0: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ues.. *. *------
58b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
58f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 /.static int.SNI
5900: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
5910: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c SL *ssl, int *al
5920: 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 ert, void *arg)
5930: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
5940: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
5950: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 arg;. Tcl_Int
5960: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
5970: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
5980: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
5990: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 Ptr;. int cod
59a0: 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 e, res;. cons
59b0: 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 t char *serverna
59c0: 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 me = NULL;..
59d0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
59e0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 );.. if (ssl
59f0: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d == NULL || arg =
5a00: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
5a10: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
5a20: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
5a30: 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 /* Only works
5a40: 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 for TLS 1.2 and
5a50: 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 earlier */.
5a60: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c servername = SSL
5a70: 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 _get_servername(
5a80: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 ssl, TLSEXT_NAME
5a90: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b TYPE_host_name);
5aa0: 0a 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72 . if (!server
5ab0: 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 name || serverna
5ac0: 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b me[0] == '\0') {
5ad0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
5ae0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
5af0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
5b00: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 atePtr->vcmd ==
5b10: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 (Tcl_Obj*)NULL)
5b20: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
5b30: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
5b40: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
5b50: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
5b60: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 l */. cmdPtr
5b70: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
5b80: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d bj(statePtr->vcm
5b90: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
5ba0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
5bb0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
5bc0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
5bd0: 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 j("sni", -1));.
5be0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5bf0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5c00: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
5c10: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
5c20: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
5c30: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
5c40: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
5c50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
5c60: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
5c70: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
5c80: 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 StringObj(server
5c90: 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 name , -1));..
5ca0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
5cb0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
5cc0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
5cd0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
5ce0: 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c if ((code = Eval
5cf0: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c Callback(interp,
5d00: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 statePtr, cmdPt
5d10: 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 r)) > 1) {..res
5d20: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 = SSL_TLSEXT_ERR
5d30: 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3b 0a _ALERT_WARNING;.
5d40: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 .*alert = SSL_AD
5d50: 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 _UNRECOGNIZED_NA
5d60: 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f ME; /* Not suppo
5d70: 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33 20 rted by TLS 1.3
5d80: 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 */. } else if
5d90: 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 (code == 1) {..
5da0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
5db0: 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 _ERR_OK;. } e
5dc0: 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c lse {..res = SSL
5dd0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 _TLSEXT_ERR_ALER
5de0: 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 72 74 T_FATAL;..*alert
5df0: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f = SSL_AD_UNRECO
5e00: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 GNIZED_NAME; /*
5e10: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 Not supported by
5e20: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 TLS 1.3 */.
5e30: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 }. Tcl_DecrRe
5e40: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
5e50: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a return res;.
5e60: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
5e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
5eb0: 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 48 * ClientHello H
5ec0: 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 61 63 andshake Callbac
5ed0: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d k for Servers --
5ee0: 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 73 . *. *.Used by s
5ef0: 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 6e 65 erver to examine
5f00: 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 the server name
5f10: 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 indication (SNI
5f20: 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 ) extension. *.p
5f30: 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 63 rovided by the c
5f40: 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 lient in order t
5f50: 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 70 72 o select an appr
5f60: 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 69 63 opriate certific
5f70: 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e ate to. *.presen
5f80: 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65 t, and make othe
5f90: 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 r configuration
5fa0: 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c 65 adjustments rele
5fb0: 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 65 72 vant to that ser
5fc0: 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20 ver. *.name and
5fd0: 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f its configuratio
5fe0: 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 n. This includes
5ff0: 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 74 68 swapping out th
6000: 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 e associated. *.
6010: 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c SSL_CTX pointer,
6020: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 modifying the s
6030: 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f 66 20 erver's list of
6040: 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 76 65 permitted TLS ve
6050: 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 rsions,. *.chang
6060: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 ing the server's
6070: 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 6e 20 cipher list in
6080: 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 response to the
6090: 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 72 20 client's cipher
60a0: 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09 43 61 list, etc.. *.Ca
60b0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e 49 20 lled before SNI
60c0: 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 and ALPN callbac
60d0: 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ks.. *. * Result
60e0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
60f0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
6100: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
6110: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
6120: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 . * Return codes
6130: 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f :. *.SSL_CLIENT_
6140: 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 75 73 HELLO_RETRY: sus
6150: 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 pend the handsha
6160: 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61 6e 64 ke, and the hand
6170: 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 shake function w
6180: 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 ill return immed
6190: 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c iately. *.SSL_CL
61a0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
61b0: 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 : failure, termi
61c0: 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e nate connection.
61d0: 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20 65 72 Set alert to er
61e0: 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c ror code.. *.SSL
61f0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 _CLIENT_HELLO_SU
6200: 43 43 45 53 53 3a 20 73 75 63 63 65 73 73 0a 20 CCESS: success.
6210: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
6220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6250: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
6260: 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c ic int.HelloCall
6270: 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 69 back(SSL *ssl, i
6280: 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 nt *alert, void
6290: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 *arg) {. Stat
62a0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
62b0: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 tate*)arg;. T
62c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
62d0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
62e0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
62f0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
6300: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 nt code, res;.
6310: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 const char *se
6320: 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f rvername;. co
6330: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
6340: 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74 r *p;. size_t
6350: 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b len, remaining;
6360: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
6370: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
6380: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 (statePtr->vcmd
6390: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
63a0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
63b0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 L_CLIENT_HELLO_S
63c0: 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c UCCESS;. } el
63d0: 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 28 63 se if (ssl == (c
63e0: 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c 20 onst SSL *)NULL
63f0: 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f 69 64 20 || arg == (void
6400: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
6410: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
6420: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
6430: 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d 65 . /* Get name
6440: 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 s */. if (!SS
6450: 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 L_client_hello_g
6460: 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c 53 et0_ext(ssl, TLS
6470: 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65 72 5f EXT_TYPE_server_
6480: 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61 69 name, &p, &remai
6490: 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e 69 ning) || remaini
64a0: 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 ng <= 2) {..*ale
64b0: 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 rt = SSL_R_SSLV3
64c0: 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 _ALERT_ILLEGAL_P
64d0: 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 ARAMETER;..retur
64e0: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
64f0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
6500: 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 . /* Extract
6510: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 the length of th
6520: 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 e supplied list
6530: 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 of names. */.
6540: 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c len = (*(p++) <
6550: 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d < 8);. len +=
6560: 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 *(p++);. if
6570: 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d 61 (len + 2 != rema
6580: 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 ining) {..*alert
6590: 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 = SSL_R_SSLV3_A
65a0: 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 LERT_ILLEGAL_PAR
65b0: 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 AMETER;..return
65c0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
65d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
65e0: 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 remaining = le
65f0: 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c n;.. /* The l
6600: 69 73 74 20 69 6e 20 70 72 61 63 74 69 63 65 20 ist in practice
6610: 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e 67 6c only has a singl
6620: 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 65 e element, so we
6630: 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20 74 only consider t
6640: 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a 2f he first one. */
6650: 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 . if (remaini
6660: 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20 ng == 0 || *p++
6670: 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 != TLSEXT_NAMETY
6680: 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a PE_host_name) {.
6690: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f .*alert = SSL_R_
66a0: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 TLSV1_ALERT_INTE
66b0: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 RNAL_ERROR;..ret
66c0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
66d0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
66e0: 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 2d }. remaining-
66f0: 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 77 -;.. /* Now w
6700: 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70 75 e can finally pu
6710: 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 65 20 ll out the byte
6720: 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20 61 array with the a
6730: 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e 20 ctual hostname.
6740: 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 */. if (remai
6750: 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 ning <= 2) {..*a
6760: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 lert = SSL_R_TLS
6770: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 V1_ALERT_INTERNA
6780: 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e L_ERROR;..return
6790: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
67a0: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 O_ERROR;. }.
67b0: 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 len = (*(p++)
67c0: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 << 8);. len
67d0: 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 += *(p++);. i
67e0: 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d f (len + 2 > rem
67f0: 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 aining) {..*aler
6800: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f t = SSL_R_TLSV1_
6810: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 ALERT_INTERNAL_E
6820: 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 RROR;..return SS
6830: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
6840: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
6850: 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b remaining = len;
6860: 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 . servername
6870: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 = (const char *)
6880: 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 p;.. /* Creat
6890: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
68a0: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 l */. cmdPtr
68b0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
68c0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d bj(statePtr->vcm
68d0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
68e0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
68f0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
6900: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
6910: 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b j("hello", -1));
6920: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
6930: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
6940: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
6950: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
6960: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
6970: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
6980: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 >self), -1));.
6990: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
69a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
69b0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
69c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 ewStringObj(serv
69d0: 65 72 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a ername, (Tcl_Siz
69e0: 65 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f e) len));.. /
69f0: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
6a00: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
6a10: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
6a20: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 cmdPtr);. if
6a30: 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c ((code = EvalCal
6a40: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
6a50: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 atePtr, cmdPtr))
6a60: 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 > 1) {..res = S
6a70: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
6a80: 52 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d RETRY;..*alert =
6a90: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 SSL_R_TLSV1_ALE
6aa0: 52 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 RT_USER_CANCELLE
6ab0: 44 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 D;. } else if
6ac0: 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 (code == 1) {..
6ad0: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 res = SSL_CLIENT
6ae0: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a _HELLO_SUCCESS;.
6af0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 } else {..re
6b00: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 s = SSL_CLIENT_H
6b10: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c ELLO_ERROR;..*al
6b20: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 ert = SSL_R_TLSV
6b30: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 1_ALERT_INTERNAL
6b40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
6b50: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
6b60: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
6b70: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a return res;.}...
6b80: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
6b90: 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e *****/./* Comman
6ba0: 64 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a ds */./*
6bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6bc0: 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ***/../*. *-----
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
6c10: 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 *. * CiphersObjC
6c20: 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c md -- list avail
6c30: 61 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a able ciphers. *.
6c40: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
6c50: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
6c60: 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 process the "tls
6c70: 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 ::ciphers" comma
6c80: 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 nd. *.to list av
6c90: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c ailable ciphers,
6ca0: 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 based upon prot
6cb0: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 ocol selected..
6cc0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
6cd0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
6ce0: 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a result list.. *.
6cf0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
6d00: 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 . *.constructs a
6d10: 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 nd destroys SSL
6d20: 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a context (CTX). *
6d30: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d70: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
6d80: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 c const char *pr
6d90: 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 otocols[] = {.."
6da0: 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 ssl2", "ssl3", "
6db0: 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c tls1", "tls1.1",
6dc0: 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 "tls1.2", "tls1
6dd0: 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 .3", NULL.};.enu
6de0: 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 m protocol {.
6df0: 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 TLS_SSL2, TLS_S
6e00: 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 SL3, TLS_TLS1, T
6e10: 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 LS_TLS1_1, TLS_T
6e20: 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f LS1_2, TLS_TLS1_
6e30: 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 3, TLS_NONE.};..
6e40: 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 static int.Ciphe
6e50: 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 rsObjCmd(ClientD
6e60: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
6e70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
6e80: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
6e90: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
6ea0: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f v[]) {. Tcl_O
6eb0: 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c bj *objPtr = NUL
6ec0: 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a L;. SSL_CTX *
6ed0: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
6ee0: 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b SSL *ssl = NULL;
6ef0: 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 . STACK_OF(SS
6f00: 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 L_CIPHER) *sk;.
6f10: 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 char *cp, buf
6f20: 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e [BUFSIZ];. in
6f30: 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 t index, verbose
6f40: 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 = 0, use_suppor
6f50: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e ted = 0;. con
6f60: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d st SSL_METHOD *m
6f70: 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f 69 64 ethod;. (void
6f80: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
6f90: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
6fa0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 ed");.. if ((
6fb0: 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62 objc < 2) || (ob
6fc0: 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f jc > 4)) {..Tcl_
6fd0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
6fe0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 erp, 1, objv, "p
6ff0: 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 rotocol ?verbose
7000: 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b ? ?supported?");
7010: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7020: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
7030: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 (Tcl_GetIndexFr
7040: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
7050: 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 jv[1], protocols
7060: 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c , "protocol", 0,
7070: 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f &index) != TCL_
7080: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
7090: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
70a0: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 32 if ((objc > 2
70b0: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c ) && Tcl_GetBool
70c0: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 eanFromObj(inter
70d0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72 p, objv[2], &ver
70e0: 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 bose) != TCL_OK)
70f0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
7100: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
7110: 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 26 if ((objc > 3) &
7120: 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e & Tcl_GetBoolean
7130: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
7140: 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75 objv[3], &use_su
7150: 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c 5f pported) != TCL_
7160: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
7170: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
7180: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
7190: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 74 ror();.. swit
71a0: 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 ch ((enum protoc
71b0: 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 ol)index) {..cas
71c0: 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 e TLS_SSL2:.#if
71d0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
71e0: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 NUMBER >= 0x1010
71f0: 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 0000L || defined
7200: 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 (NO_SSL2) || def
7210: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
7220: 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 SSL2).. Tcl_A
7230: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7240: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e rp, protocols[in
7250: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f dex], ": protoco
7260: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
7270: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 , NULL);.. re
7280: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7290: 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f #else.. metho
72a0: 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f 64 d = SSLv2_method
72b0: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 (); break;.#endi
72c0: 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 f..case TLS_SSL3
72d0: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f :.#if defined(NO
72e0: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
72f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
7300: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
7310: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 ENSSL_NO_SSL3_ME
7320: 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 THOD).. Tcl_A
7330: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7340: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e rp, protocols[in
7350: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f dex], ": protoco
7360: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
7370: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 , NULL);.. re
7380: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7390: 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f #else.. metho
73a0: 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f 64 d = SSLv3_method
73b0: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 (); break;.#endi
73c0: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
73d0: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f :.#if defined(NO
73e0: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 _TLS1) || define
73f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
7400: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
7410: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 ENSSL_NO_TLS1_ME
7420: 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 THOD).. Tcl_A
7430: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7440: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e rp, protocols[in
7450: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f dex], ": protoco
7460: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
7470: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 , NULL);.. re
7480: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7490: 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f #else.. metho
74a0: 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 d = TLSv1_method
74b0: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 (); break;.#endi
74c0: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
74d0: 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _1:.#if defined(
74e0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
74f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7500: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
7510: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
7520: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 LS1_1_METHOD)..
7530: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
7540: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
7550: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
7560: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
7570: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
7580: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
7590: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
75a0: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 method = TLSv
75b0: 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 1_1_method(); br
75c0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 eak;.#endif..cas
75d0: 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 e TLS_TLS1_2:.#i
75e0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
75f0: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
7600: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
7610: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
7620: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f ENSSL_NO_TLS1_2_
7630: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c METHOD).. Tcl
7640: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
7650: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
7660: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
7670: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
7680: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 d", NULL);..
7690: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
76a0: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 ;.#else.. met
76b0: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 hod = TLSv1_2_me
76c0: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 thod(); break;.#
76d0: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
76e0: 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 TLS1_3:.#if defi
76f0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c ned(NO_TLS1_3) |
7700: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
7710: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 L_NO_TLS1_3)..
7720: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
7730: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f lt(interp, proto
7740: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 cols[index], ":
7750: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
7760: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
7770: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
7780: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
7790: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d method = TLS_m
77a0: 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 53 53 ethod();.. SS
77b0: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 L_CTX_set_min_pr
77c0: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
77d0: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 TLS1_3_VERSION)
77e0: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 ;.. SSL_CTX_s
77f0: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 et_max_proto_ver
7800: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 sion(ctx, TLS1_3
7810: 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 _VERSION);..
7820: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 break;.#endif..d
7830: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65 74 efault:.. met
7840: 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 hod = TLS_method
7850: 28 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a ();.. break;.
7860: 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d }.. ctx =
7870: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 SSL_CTX_new(met
7880: 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 63 74 hod);. if (ct
7890: 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 x == NULL) {..Tc
78a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
78b0: 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 nterp, GET_ERR_R
78c0: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a EASON(), NULL);.
78d0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
78e0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 R;. }.. ss
78f0: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 l = SSL_new(ctx)
7900: 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d ;. if (ssl ==
7910: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
7920: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
7930: 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f p, GET_ERR_REASO
7940: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c N(), NULL);..SSL
7950: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
7960: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7970: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
7980: 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 Use list and or
7990: 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20 der as would be
79a0: 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 sent in a Client
79b0: 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 Hello or all ava
79c0: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a ilable ciphers *
79d0: 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75 /. if (use_su
79e0: 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d pported) {..sk =
79f0: 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 SSL_get1_suppor
7a00: 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29 ted_ciphers(ssl)
7a10: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
7a20: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 sk = SSL_get_cip
7a30: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d hers(ssl);. }
7a40: 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 .. if (sk !=
7a50: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 NULL) {..if (!ve
7a60: 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f 62 rbose) {.. ob
7a70: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
7a80: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
7a90: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 . for (int i
7aa0: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f = 0; i < sk_SSL_
7ab0: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 CIPHER_num(sk);
7ac0: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 i++) {...const S
7ad0: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 SL_CIPHER *c = s
7ae0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c k_SSL_CIPHER_val
7af0: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 ue(sk, i);...if
7b00: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 (c == NULL) cont
7b10: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 inue;..../* ciph
7b20: 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 er name or (NONE
7b30: 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f ) */...cp = SSL_
7b40: 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 CIPHER_get_name(
7b50: 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 c);...if (cp ==
7b60: 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 NULL) break;...T
7b70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
7b80: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
7b90: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
7ba0: 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29 tringObj(cp, -1)
7bb0: 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c );.. }...} el
7bc0: 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 se {.. objPtr
7bd0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 = Tcl_NewString
7be0: 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 Obj("",0);..
7bf0: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 for (int i = 0;
7c00: 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 i < sk_SSL_CIPHE
7c10: 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 R_num(sk); i++)
7c20: 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 {...const SSL_CI
7c30: 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c PHER *c = sk_SSL
7c40: 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b _CIPHER_value(sk
7c50: 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d , i);...if (c ==
7c60: 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b NULL) continue;
7c70: 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 ..../* textual d
7c80: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 escription of th
7c90: 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 e cipher */...if
7ca0: 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 (SSL_CIPHER_des
7cb0: 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c cription(c, buf,
7cc0: 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d sizeof(buf)) !=
7cd0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 NULL) {... T
7ce0: 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f cl_AppendToObj(o
7cf0: 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 54 63 6c bjPtr, buf, (Tcl
7d00: 5f 53 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 75 _Size) strlen(bu
7d10: 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a f));...} else {.
7d20: 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
7d30: 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 ToObj(objPtr, "U
7d40: 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 NKNOWN\n", 8);..
7d50: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 .}.. }..}..if
7d60: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 (use_supported)
7d70: 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 {.. sk_SSL_C
7d80: 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a IPHER_free(sk);.
7d90: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c .}. }. SSL
7da0: 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 _free(ssl);.
7db0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
7dc0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f );.. Tcl_SetO
7dd0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
7de0: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
7df0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
7e00: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
7e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
7e50: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 ProtocolsObjCmd
7e60: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c -- list availabl
7e70: 65 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 e protocols. *.
7e80: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
7e90: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 is invoked to p
7ea0: 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a rocess the "tls:
7eb0: 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d :protocols" comm
7ec0: 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 and. *.to list a
7ed0: 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f vailable protoco
7ee0: 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ls.. *. * Result
7ef0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
7f00: 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 Tcl result list
7f10: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
7f20: 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ects:. *.none. *
7f30: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
7f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f70: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
7f80: 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f c int.ProtocolsO
7f90: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
7fa0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
7fb0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
7fc0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
7fd0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
7fe0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ) {. Tcl_Obj
7ff0: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f *objPtr;. (vo
8000: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a id) clientData;.
8010: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
8020: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
8030: 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 (objc != 1) {..T
8040: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
8050: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
8060: 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 "");..return TC
8070: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
8080: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
8090: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 ror();.. objP
80a0: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
80b0: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 Obj(0, NULL);..#
80c0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
80d0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
80e0: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 100000L && !defi
80f0: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 ned(NO_SSL2) &&
8100: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
8110: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 _NO_SSL2). Tc
8120: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
8130: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
8140: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
8150: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
8160: 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 s[TLS_SSL2], -1)
8170: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
8180: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
8190: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
81a0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 SSL_NO_SSL3) &&
81b0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
81c0: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 _NO_SSL3_METHOD)
81d0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
81e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
81f0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
8200: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
8210: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c rotocols[TLS_SSL
8220: 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 3], -1));.#endif
8230: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
8240: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
8250: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
8260: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
8270: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
8280: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f METHOD). Tcl_
8290: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
82a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
82b0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
82c0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
82d0: 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b TLS_TLS1], -1));
82e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
82f0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
8300: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
8310: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 SSL_NO_TLS1_1) &
8320: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
8330: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 SL_NO_TLS1_1_MET
8340: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 HOD). Tcl_Lis
8350: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
8360: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
8370: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
8380: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
8390: 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a _TLS1_1], -1));.
83a0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
83b0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 ned(NO_TLS1_2) &
83c0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
83d0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 SL_NO_TLS1_2) &&
83e0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
83f0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 L_NO_TLS1_2_METH
8400: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 OD). Tcl_List
8410: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
8420: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
8430: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
8440: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
8450: 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 TLS1_2], -1));.#
8460: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
8470: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 ed(NO_TLS1_3) &&
8480: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
8490: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
84a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
84b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
84c0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
84d0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
84e0: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d cols[TLS_TLS1_3]
84f0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a , -1));.#endif..
8500: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
8510: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
8520: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
8530: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
8540: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
8550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8580: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 -----. *. * Hand
8590: 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 shakeObjCmd --.
85a0: 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e *. *.This comman
85b0: 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 d is used to ver
85c0: 69 66 79 20 77 68 65 74 68 65 72 20 74 68 65 20 ify whether the
85d0: 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d handshake is com
85e0: 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e plete. *.or not.
85f0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
8600: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
8610: 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e l result. 1 mean
8620: 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 s handshake comp
8630: 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 lete, 0 means pe
8640: 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 nding.. *. * Sid
8650: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 e effects:. *.Ma
8660: 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f y force SSL nego
8670: 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 tiation to take
8680: 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d place.. *. *----
8690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
86a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
86b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
86c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
86d0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 */.static int H
86e0: 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 andshakeObjCmd(C
86f0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
8700: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
8710: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
8720: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
8730: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
8740: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
8750: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 n; /* The
8760: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 channel to set
8770: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 a mode on. */.
8780: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
8790: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 r; /* cli
87a0: 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 ent state for ss
87b0: 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 l socket */.
87c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 const char *errS
87d0: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 tr = NULL;. i
87e0: 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 nt ret = 1;.
87f0: 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 20 20 20 int err = 0;.
8800: 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 (void) clientDa
8810: 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 ta;.. dprintf
8820: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
8830: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 if (objc != 2)
8840: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
8850: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
8860: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b bjv, "channel");
8870: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
8880: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
8890: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
88a0: 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 );.. chan = T
88b0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
88c0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
88d0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
88e0: 31 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 1], (Tcl_Size *)
88f0: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 NULL), NULL);.
8900: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
8910: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
8920: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c L) {..return(TCL
8930: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a _ERROR);. }..
8940: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
8950: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
8960: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
8970: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
8980: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
8990: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 el(chan);. if
89a0: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
89b0: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
89c0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
89d0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
89e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
89f0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
8a00: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
8a10: 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c e(chan),.. "\
8a20: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
8a30: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 nnel", NULL);..T
8a40: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
8a50: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
8a60: 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 43 48 41 HANDSHAKE", "CHA
8a70: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
8a80: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
8a90: 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 ;..return(TCL_ER
8aa0: 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ROR);. }.
8ab0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
8ac0: 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e e *)Tcl_GetChann
8ad0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 elInstanceData(c
8ae0: 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e han);.. dprin
8af0: 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f tf("Calling Tls_
8b00: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 WaitForConnect")
8b10: 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73 5f ;. ret = Tls_
8b20: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 WaitForConnect(s
8b30: 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20 31 tatePtr, &err, 1
8b40: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 );. dprintf("
8b50: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
8b60: 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69 22 ct returned: %i"
8b70: 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 , ret);.. if
8b80: 28 72 65 74 20 3c 20 30 20 26 26 20 28 28 73 74 (ret < 0 && ((st
8b90: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 atePtr->flags &
8ba0: 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 TLS_TCL_ASYNC) &
8bb0: 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49 4e & (err == EAGAIN
8bc0: 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 ))) {..dprintf("
8bd0: 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72 Async set and er
8be0: 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 r = EAGAIN");..r
8bf0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c et = 0;. } el
8c00: 73 65 20 69 66 20 28 72 65 74 20 3c 20 30 29 20 se if (ret < 0)
8c10: 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a {..long result;.
8c20: 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 .errStr = stateP
8c30: 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 tr->err;..Tcl_Re
8c40: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 setResult(interp
8c50: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f );..Tcl_SetErrno
8c60: 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 (err);...if (!er
8c70: 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 rStr || (*errStr
8c80: 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 65 == 0)) {.. e
8c90: 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 rrStr = Tcl_Posi
8ca0: 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a xError(interp);.
8cb0: 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 .}...Tcl_AppendR
8cc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 esult(interp, "h
8cd0: 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a andshake failed:
8ce0: 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68 61 ", errStr, (cha
8cf0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 r *) NULL);..if
8d00: 28 28 72 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67 ((result = SSL_g
8d10: 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 et_verify_result
8d20: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 (statePtr->ssl))
8d30: 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b != X509_V_OK) {
8d40: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
8d50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
8d60: 20 64 75 65 20 74 6f 20 5c 22 22 2c 20 58 35 30 due to \"", X50
8d70: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 9_verify_cert_er
8d80: 72 6f 72 5f 73 74 72 69 6e 67 28 72 65 73 75 6c ror_string(resul
8d90: 74 29 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20 t), "\"", (char
8da0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 *) NULL);..}..Tc
8db0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
8dc0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 nterp, "TLS", "H
8dd0: 41 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c ANDSHAKE", "FAIL
8de0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
8df0: 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 LL);..dprintf("R
8e00: 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 eturning TCL_ERR
8e10: 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b OR with handshak
8e20: 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 e failed: %s", e
8e30: 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 rrStr);..return(
8e40: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
8e50: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 } else {..if (er
8e60: 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 r != 0) {.. d
8e70: 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 printf("Got an e
8e80: 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 rror with a comp
8e90: 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a leted handshake:
8ea0: 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 err = %i", err)
8eb0: 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 ;..}..ret = 1;.
8ec0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
8ed0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c f("Returning TCL
8ee0: 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 _OK with data \"
8ef0: 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 %i\"", ret);.
8f00: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
8f10: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 t(interp, Tcl_Ne
8f20: 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 wIntObj(ret));.
8f30: 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b return(TCL_OK
8f40: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d );.}../*. *-----
8f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
8f90: 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d *. * ImportObjCm
8fa0: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 d --. *. *.This
8fb0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
8fc0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
8fd0: 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e the "ssl" comman
8fe0: 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 d. *. *.The ssl
8ff0: 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 command pushes S
9000: 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 SL over a (newly
9010: 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 connected) tcp
9020: 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 socket. *. * Res
9030: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
9040: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
9050: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
9060: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 ts:. *.May modif
9070: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f y the behavior o
9080: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e f an IO channel.
9090: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
90a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
90b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
90c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
90d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
90e0: 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f atic int.ImportO
90f0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
9100: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
9110: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
9120: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
9130: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
9140: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ) {. Tcl_Chan
9150: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 nel chan;../* Th
9160: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 e channel to set
9170: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 a mode on. */.
9180: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
9190: 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 tr;../* client s
91a0: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 tate for ssl soc
91b0: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 ket */. SSL_C
91c0: 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c 4c 3b TX *ctx..= NULL;
91d0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 . Tcl_Obj *sc
91e0: 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 ript..= NULL;.
91f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 Tcl_Obj *passw
9200: 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ord..= NULL;.
9210: 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 09 Tcl_Obj *vcmd..
9220: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
9230: 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 DString upperCha
9240: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c nnelTranslation,
9250: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f upperChannelBlo
9260: 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e cking, upperChan
9270: 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 nelEncoding, upp
9280: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
9290: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b 0a 20 ;. int idx;.
92a0: 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b Tcl_Size len;
92b0: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09 . int flags..
92c0: 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b .= TLS_TCL_INIT;
92d0: 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 . int server.
92e0: 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e ..= 0;./* is con
92f0: 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 nection incoming
9300: 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f or outgoing? */
9310: 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 69 . char *keyfi
9320: 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 le..= NULL;.
9330: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 09 char *certfile..
9340: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 = NULL;. unsi
9350: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 09 09 gned char *key..
9360: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
9370: 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09 3d 20 Size key_len..=
9380: 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 0;. unsigned
9390: 63 68 61 72 20 2a 63 65 72 74 09 09 3d 20 4e 55 char *cert..= NU
93a0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 LL;. Tcl_Size
93b0: 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30 3b 0a cert_len..= 0;.
93c0: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 char *cipher
93d0: 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 s..= NULL;. c
93e0: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
93f0: 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 s..= NULL;. c
9400: 68 61 72 20 2a 43 41 66 69 6c 65 09 09 3d 20 4e har *CAfile..= N
9410: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 ULL;. char *C
9420: 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b 0a 20 Apath..= NULL;.
9430: 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d char *DHparam
9440: 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 s..= NULL;. c
9450: 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d 20 4e har *model...= N
9460: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 ULL;. char *s
9470: 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e 55 4c ervername..= NUL
9480: 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 L;./* hostname f
9490: 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 or Server Name I
94a0: 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 ndication */.
94b0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
94c0: 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 char *session_id
94d0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
94e0: 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 _Obj *alpn..= NU
94f0: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 LL;. int ssl2
9500: 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a = 0, ssl3 = 0;.
9510: 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 int tls1 = 1
9520: 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c , tls1_1 = 1, tl
9530: 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 s1_2 = 1, tls1_3
9540: 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 = 1;. int pr
9550: 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d oto = 0, level =
9560: 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 -1;. int ver
9570: 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 ify = 0, require
9580: 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 = 0, request =
9590: 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 1, post_handshak
95a0: 65 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 e = 0;. (void
95b0: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
95c0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
95d0: 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e ed");..#if defin
95e0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 ed(NO_TLS1) || d
95f0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
9600: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 O_TLS1). tls1
9610: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
9620: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
9630: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
9640: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
9650: 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 ). tls1_1 = 0
9660: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
9670: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
9680: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
9690: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 SL_NO_TLS1_2).
96a0: 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 tls1_2 = 0;.#e
96b0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
96c0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 (NO_TLS1_3) || d
96d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
96e0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c O_TLS1_3). tl
96f0: 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 s1_3 = 0;.#endif
9700: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c .. if (objc <
9710: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
9720: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
9730: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
9740: 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 l ?options?");..
9750: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
9760: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
9770: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
9780: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
9790: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
97a0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
97b0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
97c0: 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 (Tcl_Size *) NU
97d0: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 LL), NULL);.
97e0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
97f0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
9800: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
9810: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
9820: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
9830: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
9840: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
9850: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
9860: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
9870: 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 han);.. for (
9880: 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f idx = 2; idx < o
9890: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 bjc; idx++) {..c
98a0: 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 har *opt = Tcl_G
98b0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
98c0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 28 54 63 6c 5f objv[idx], (Tcl_
98d0: 53 69 7a 65 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 09 Size *)NULL);...
98e0: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d if (opt[0] != '-
98f0: 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a ').. break;..
9900: 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c .OPTOBJ("-alpn",
9910: 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 alpn);..OPTSTR(
9920: 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61 74 68 "-cadir", CApath
9930: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 );..OPTSTR("-caf
9940: 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 ile", CAfile);..
9950: 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c OPTBYTE("-cert",
9960: 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 cert, cert_len)
9970: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 ;..OPTSTR("-cert
9980: 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 file", certfile)
9990: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 ;..OPTSTR("-ciph
99a0: 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 er", ciphers);..
99b0: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 OPTSTR("-ciphers
99c0: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 ", ciphers);..OP
99d0: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 TSTR("-ciphersui
99e0: 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 tes", ciphersuit
99f0: 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 es);..OPTOBJ("-c
9a00: 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 ommand", script)
9a10: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 ;..OPTSTR("-dhpa
9a20: 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 rams", DHparams)
9a30: 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 ;..OPTBYTE("-key
9a40: 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 ", key, key_len)
9a50: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 ;..OPTSTR("-keyf
9a60: 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a ile", keyfile);.
9a70: 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 .OPTSTR("-model"
9a80: 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 , model);..OPTOB
9a90: 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 J("-password", p
9aa0: 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f assword);..OPTBO
9ab0: 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 OL("-post_handsh
9ac0: 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 ake", post_hands
9ad0: 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 hake);..OPTBOOL(
9ae0: 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 "-request", requ
9af0: 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 est);..OPTBOOL("
9b00: 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 -require", requi
9b10: 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 re);..OPTINT("-s
9b20: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 ecurity_level",
9b30: 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c level);..OPTBOOL
9b40: 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 ("-server", serv
9b50: 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 er);..OPTSTR("-s
9b60: 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 ervername", serv
9b70: 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 ername);..OPTSTR
9b80: 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 ("-session_id",
9b90: 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 session_id);..OP
9ba0: 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 TBOOL("-ssl2", s
9bb0: 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 sl2);..OPTBOOL("
9bc0: 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 -ssl3", ssl3);..
9bd0: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c OPTBOOL("-tls1",
9be0: 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c tls1);..OPTBOOL
9bf0: 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 ("-tls1.1", tls1
9c00: 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d _1);..OPTBOOL("-
9c10: 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 tls1.2", tls1_2)
9c20: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
9c30: 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 1.3", tls1_3);..
9c40: 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 OPTOBJ("-validat
9c50: 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 ecommand", vcmd)
9c60: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 ;..OPTOBJ("-vcmd
9c70: 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 ", vcmd);...OPTB
9c80: 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 AD("option", "-a
9c90: 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 lpn, -cadir, -ca
9ca0: 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 file, -cert, -ce
9cb0: 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c rtfile, -cipher,
9cc0: 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 -ciphersuites,
9cd0: 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 -command, -dhpar
9ce0: 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 ams, -key, -keyf
9cf0: 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 ile, -model, -pa
9d00: 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 ssword, -post_ha
9d10: 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 ndshake, -reques
9d20: 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 t, -require, -se
9d30: 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 2d 73 curity_level, -s
9d40: 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 erver, -serverna
9d50: 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c me, -session_id,
9d60: 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d -ssl2, -ssl3, -
9d70: 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d tls1, -tls1.1, -
9d80: 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c tls1.2, -tls1.3,
9d90: 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d or -validatecom
9da0: 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e mand");...return
9db0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
9dc0: 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 }. if (reques
9dd0: 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53 53 t)..verify |= SS
9de0: 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f L_VERIFY_CLIENT_
9df0: 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 ONCE | SSL_VERIF
9e00: 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28 Y_PEER;. if (
9e10: 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69 request && requi
9e20: 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 re).verify |= SS
9e30: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 L_VERIFY_FAIL_IF
9e40: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 _NO_PEER_CERT;.
9e50: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 if (request &
9e60: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 & post_handshake
9e70: 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f ).verify |= SSL_
9e80: 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 VERIFY_POST_HAND
9e90: 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76 SHAKE;. if (v
9ea0: 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65 72 erify == 0)..ver
9eb0: 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 ify = SSL_VERIFY
9ec0: 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 _NONE;.. prot
9ed0: 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 o |= (ssl2 ? TLS
9ee0: 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 _PROTO_SSL2 : 0)
9ef0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
9f00: 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f ssl3 ? TLS_PROTO
9f10: 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 _SSL3 : 0);.
9f20: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f proto |= (tls1 ?
9f30: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 TLS_PROTO_TLS1
9f40: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
9f50: 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 |= (tls1_1 ? TLS
9f60: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 _PROTO_TLS1_1 :
9f70: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
9f80: 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 (tls1_2 ? TLS_P
9f90: 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 ROTO_TLS1_2 : 0)
9fa0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
9fb0: 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f tls1_3 ? TLS_PRO
9fc0: 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a TO_TLS1_3 : 0);.
9fd0: 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f . /* reset to
9fe0: 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 NULL if blank s
9ff0: 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a tring provided *
a000: 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26 /. if (cert &
a010: 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20 & !*cert)..
a020: 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20 cert.
a030: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
a040: 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20 key && !*key)..
a050: 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20 key.
a060: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
a070: 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21 f (certfile && !
a080: 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20 *certfile)
a090: 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 certfile.= NU
a0a0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66 LL;. if (keyf
a0b0: 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 ile && !*keyfile
a0c0: 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20 )..keyfile.
a0d0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
a0e0: 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a f (ciphers && !*
a0f0: 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20 ciphers).
a100: 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 ciphers.
a110: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
a120: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26 26 (ciphersuites &&
a130: 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 29 !*ciphersuites)
a140: 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20 20 ciphersuites
a150: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
a160: 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66 (CAfile && !*CAf
a170: 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66 ile). CAf
a180: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ile. = NU
a190: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 70 61 LL;. if (CApa
a1a0: 74 68 20 26 26 20 21 2a 43 41 70 61 74 68 29 09 th && !*CApath).
a1b0: 20 20 20 20 20 20 20 20 43 41 70 61 74 68 09 20 CApath.
a1c0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a1d0: 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 if (DHparams
a1e0: 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09 20 && !*DHparams).
a1f0: 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73 20 DHparams
a200: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a = NULL;..
a210: 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 /* new SSL s
a220: 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 tate */. stat
a230: 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20 2a ePtr..= (State *
a240: 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 ) ckalloc((unsig
a250: 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61 74 ned) sizeof(Stat
a260: 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 e));. memset(
a270: 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a statePtr, 0, siz
a280: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 eof(State));..
a290: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 statePtr->flag
a2a0: 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 s.= flags;. s
a2b0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 tatePtr->interp.
a2c0: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 = interp;. st
a2d0: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d atePtr->vflags.=
a2e0: 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74 61 verify;. sta
a2f0: 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b tePtr->err.= "";
a300: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 .. /* allocat
a310: 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 e script */.
a320: 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09 28 if (script) {..(
a330: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 void) Tcl_GetStr
a340: 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 ingFromObj(scrip
a350: 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c t, &len);..if (l
a360: 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 en) {.. state
a370: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 Ptr->callback =
a380: 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63 6c script;.. Tcl
a390: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _IncrRefCount(st
a3a0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
a3b0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
a3c0: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 /* allocate pas
a3d0: 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 sword */. if
a3e0: 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 (password) {..(v
a3f0: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 oid) Tcl_GetStri
a400: 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f ngFromObj(passwo
a410: 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 rd, &len);..if (
a420: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 len) {.. stat
a430: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
a440: 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 password;..
a450: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
a460: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
a470: 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a ord);..}. }..
a480: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 /* allocate
a490: 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 validate command
a4a0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d 64 */. if (vcmd
a4b0: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f ) {..(void) Tcl_
a4c0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
a4d0: 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 (vcmd, &len);..i
a4e0: 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 f (len) {.. s
a4f0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 tatePtr->vcmd =
a500: 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 vcmd;.. Tcl_I
a510: 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ncrRefCount(stat
a520: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a ePtr->vcmd);..}.
a530: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d }.. if (m
a540: 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a odel != NULL) {.
a550: 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 .int mode;../* G
a560: 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 et the "model" c
a570: 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 ontext */..chan
a580: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
a590: 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 (interp, model,
a5a0: 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61 &mode);..if (cha
a5b0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
a5c0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 l) NULL) {..
a5d0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
a5e0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
a5f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
a600: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 OR;..}.../*.. *
a610: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
a620: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
a630: 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f ost channel.. */
a640: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 ..chan = Tcl_Get
a650: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
a660: 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 ;..if (Tcl_GetCh
a670: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
a680: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
a690: 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c pe()) {.. Tcl
a6a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
a6b0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
a6c0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
a6d0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
a6e0: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 ,..."\": not a T
a6f0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
a700: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
a710: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
a720: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
a730: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 ", "CHANNEL", "I
a740: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a NVALID", (char *
a750: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c ) NULL);.. Tl
a760: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
a770: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
a780: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a790: 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 ;..}..ctx = ((St
a7a0: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 ate *)Tcl_GetCha
a7b0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
a7c0: 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 (chan))->ctx;.
a7d0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 } else {..if (
a7e0: 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 (ctx = CTX_Init(
a7f0: 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 statePtr, server
a800: 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 , proto, keyfile
a810: 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c , certfile, key,
a820: 20 63 65 72 74 2c 20 28 69 6e 74 29 20 6b 65 79 cert, (int) key
a830: 5f 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e 74 29 _len,.. (int)
a840: 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61 74 cert_len, CApat
a850: 68 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 h, CAfile, ciphe
a860: 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 rs, ciphersuites
a870: 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d , level, DHparam
a880: 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 s)) == NULL) {..
a890: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
a8a0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
a8b0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
a8c0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
a8d0: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
a8e0: 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 ctx = ctx;..
a8f0: 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 /*. * We nee
a900: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 d to make sure t
a910: 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 hat the channel
a920: 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 works in binary
a930: 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 (for the. *
a940: 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 encryption not t
a950: 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 o get goofed up)
a960: 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 .. * We only
a970: 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 want to adjust
a980: 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e the buffering in
a990: 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 pre-v2 channels
a9a0: 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 , where. * e
a9b0: 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 ach channel in t
a9c0: 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 he stack maintai
a9d0: 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 ned its own buff
a9e0: 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ers.. */.
a9f0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
aa00: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 (&upperChannelTr
aa10: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 anslation);.
aa20: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
aa30: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
aa40: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f cking);. Tcl_
aa50: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
aa60: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
aa70: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
aa80: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
aa90: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 nnelEncoding);.
aaa0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
aab0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
aac0: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 chan, "-eofchar"
aad0: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 , &upperChannelE
aae0: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c OFChar);. Tcl
aaf0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
ab00: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
ab10: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 "-encoding", &up
ab20: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
ab30: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ng);. Tcl_Get
ab40: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
ab50: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 terp, chan, "-tr
ab60: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 anslation", &upp
ab70: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
ab80: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 tion);. Tcl_G
ab90: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
aba0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
abb0: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 blocking", &uppe
abc0: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
abd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
abe0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
abf0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e rp, chan, "-tran
ac00: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 slation", "binar
ac10: 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 y");. Tcl_Set
ac20: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
ac30: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c terp, chan, "-bl
ac40: 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 ocking", "true")
ac50: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 ;. dprintf("C
ac60: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 onsuming Tcl cha
ac70: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 nnel %s", Tcl_Ge
ac80: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
ac90: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 n));. statePt
aca0: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 r->self = Tcl_St
acb0: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 ackChannel(inter
acc0: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 p, Tls_ChannelTy
acd0: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 pe(), (ClientDat
ace0: 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54 a) statePtr,..(T
acf0: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 CL_READABLE | TC
ad00: 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 L_WRITABLE), cha
ad10: 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 n);. dprintf(
ad20: 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c "Created channel
ad30: 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f named %s", Tcl_
ad40: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
ad50: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b tatePtr->self));
ad60: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
ad70: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f r->self == (Tcl_
ad80: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
ad90: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 ../*.. * No use
ada0: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c of Tcl_Eventuall
adb0: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f yFree because no
adc0: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 possible Tcl_Pr
add0: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c eserve... */..Tl
ade0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
adf0: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 statePtr);..retu
ae00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
ae10: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 }.. Tcl_Set
ae20: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
ae30: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e terp, statePtr->
ae40: 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 self, "-translat
ae50: 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e ion", Tcl_DStrin
ae60: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
ae70: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 nnelTranslation)
ae80: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
ae90: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
aea0: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
aeb0: 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c lf, "-encoding",
aec0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 Tcl_DStringValu
aed0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 e(&upperChannelE
aee0: 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 ncoding));. T
aef0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
af00: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
af10: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f ePtr->self, "-eo
af20: 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 fchar", Tcl_DStr
af30: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 ingValue(&upperC
af40: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b hannelEOFChar));
af50: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
af60: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
af70: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
af80: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 , "-blocking", T
af90: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
afa0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
afb0: 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a cking));.. /*
afc0: 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 . * SSL Init
afd0: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 ialization.
afe0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
aff0: 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 >ssl = SSL_new(s
b000: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 tatePtr->ctx);.
b010: 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72 if (!statePtr
b020: 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c ->ssl) {../* SSL
b030: 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a library error *
b040: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 /..Tcl_AppendRes
b050: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 ult(interp, "cou
b060: 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 ldn't construct
b070: 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 ssl session: ",
b080: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
b090: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b0a0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
b0b0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
b0c0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
b0d0: 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 "INIT", "FAILED
b0e0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
b0f0: 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 );..Tls_Free((ch
b100: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
b110: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
b120: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
b130: 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 * Set host serve
b140: 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 r name */. if
b150: 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a (servername) {.
b160: 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 ./* Sets the ser
b170: 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 ver name indicat
b180: 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 ion (SNI) in Cli
b190: 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 entHello extensi
b1a0: 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 on */../* Per RF
b1b0: 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 C 6066, hostname
b1c0: 20 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f is a ASCII enco
b1d0: 64 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 ded string, thou
b1e0: 67 68 20 52 46 43 20 34 33 36 36 20 73 61 79 73 gh RFC 4366 says
b1f0: 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 UTF-8. */..if (
b200: 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f !SSL_set_tlsext_
b210: 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 host_name(stateP
b220: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e tr->ssl, servern
b230: 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29 ame) && require)
b240: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
b250: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
b260: 20 22 53 65 74 20 53 4e 49 20 65 78 74 65 6e 73 "Set SNI extens
b270: 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 ion failed: ", G
b280: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
b290: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b2a0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
b2b0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
b2c0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
b2d0: 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c "SNI", "FAILED",
b2e0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b2f0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
b300: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
b310: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
b320: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
b330: 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 * Set hostname f
b340: 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 69 63 or peer certific
b350: 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 ate hostname ver
b360: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 ification in cli
b370: 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 ents... Don't
b380: 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 use SSL_set1_hos
b390: 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c t since it has l
b3a0: 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 imitations. */..
b3b0: 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f if (!SSL_add1_ho
b3c0: 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c st(statePtr->ssl
b3d0: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b , servername)) {
b3e0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
b3f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b400: 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 Set DNS hostname
b410: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f failed: ", GET_
b420: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
b430: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
b440: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
b450: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
b460: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f ", "IMPORT", "HO
b470: 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 STNAME", "FAILED
b480: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
b490: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 );.. Tls_Free
b4a0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
b4b0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
b4c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
b4d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 }.. /* Res
b4e0: 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a ume session id *
b4f0: 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f /. if (sessio
b500: 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 n_id && strlen(s
b510: 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 ession_id) <= SS
b520: 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 L_MAX_SID_CTX_LE
b530: 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f NGTH) {../* SSL_
b540: 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f set_session() */
b550: 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 ..if (!SSL_SESSI
b560: 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 ON_set1_id_conte
b570: 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 xt(SSL_get_sessi
b580: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c on(statePtr->ssl
b590: 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 ), session_id, (
b5a0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 unsigned int) st
b5b0: 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 rlen(session_id)
b5c0: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
b5d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
b5e0: 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 p, "Resume sessi
b5f0: 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 on failed: ", GE
b600: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
b610: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
b620: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f . Tcl_SetErro
b630: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
b640: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 LS", "IMPORT", "
b650: 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 SESSION", "FAILE
b660: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
b670: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
b680: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
b690: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
b6a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
b6b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e }.. /* En
b6c0: 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e able Application
b6d0: 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 -Layer Protocol
b6e0: 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 Negotiation. Exa
b6f0: 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f mples are: http/
b700: 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 1.0,..http/1.1,
b710: 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 h2, h3, ftp, ima
b720: 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c p, pop3, xmpp-cl
b730: 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 ient, xmpp-serve
b740: 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 r, mqtt, irc, et
b750: 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c c. */. if (al
b760: 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 pn) {../* Conver
b770: 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 t a TCL list int
b780: 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 o a protocol-lis
b790: 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 t in wire-format
b7a0: 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 */..unsigned ch
b7b0: 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a ar *protos, *p;.
b7c0: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 .unsigned int pr
b7d0: 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 otos_len = 0;..T
b7e0: 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a cl_Size cnt, i;.
b7f0: 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a .int j;..Tcl_Obj
b800: 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 **list;...if (T
b810: 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 cl_ListObjGetEle
b820: 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c ments(interp, al
b830: 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 pn, &cnt, &list)
b840: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 != TCL_OK) {..
b850: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
b860: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
b870: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
b880: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 ERROR;..}.../* D
b890: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d etermine the mem
b8a0: 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 ory required for
b8b0: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 the protocol-li
b8c0: 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 st */..for (i =
b8d0: 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 0; i < cnt; i++)
b8e0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 {.. Tcl_GetS
b8f0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 tringFromObj(lis
b900: 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 t[i], &len);..
b910: 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 if (len > 255)
b920: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 {...Tcl_AppendR
b930: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 esult(interp, "A
b940: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d LPN protocol nam
b950: 65 73 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 es too long", (c
b960: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
b970: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
b980: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
b990: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 "IMPORT", "ALPN"
b9a0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
b9b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c r *) NULL);...Tl
b9c0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
b9d0: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 statePtr);...ret
b9e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
b9f0: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f }.. proto
ba00: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e s_len += 1 + (in
ba10: 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 t) len;..}.../*
ba20: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 Build the comple
ba30: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 te protocol-list
ba40: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b */..protos = ck
ba50: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e alloc(protos_len
ba60: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d );../* protocol-
ba70: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 lists consist of
ba80: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 8-bit length-pr
ba90: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 efixed, byte str
baa0: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 ings */..for (j
bab0: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b = 0, p = protos;
bac0: 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b j < cnt; j++) {
bad0: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 .. char *str
bae0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
baf0: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 romObj(list[j],
bb00: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b &len);.. *p++
bb10: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 = (unsigned cha
bb20: 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d r) len;.. mem
bb30: 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a cpy(p, str, (siz
bb40: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 e_t) len);..
bb50: 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f p += len;..}.../
bb60: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 * SSL_set_alpn_p
bb70: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f rotos makes a co
bb80: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 py of the protoc
bb90: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e ol-list */../* N
bba0: 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 ote: This functi
bbb0: 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 65 ons reverses the
bbc0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f return value co
bbd0: 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 nvention */..if
bbe0: 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 (SSL_set_alpn_pr
bbf0: 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 otos(statePtr->s
bc00: 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 sl, protos, prot
bc10: 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 os_len)) {..
bc20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
bc30: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c (interp, "Set AL
bc40: 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 PN protocols fai
bc50: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f led: ", GET_ERR_
bc60: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
bc70: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
bc80: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
bc90: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
bca0: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c IMPORT", "ALPN",
bcb0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
bcc0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
bcd0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
bce0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
bcf0: 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 ckfree(protos)
bd00: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
bd10: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
bd20: 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 Store protocols
bd30: 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 list */..stateP
bd40: 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f tr->protos = pro
bd50: 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e tos;..statePtr->
bd60: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f protos_len = pro
bd70: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 tos_len;. } e
bd80: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d lse {..statePtr-
bd90: 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a >protos = NULL;.
bda0: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
bdb0: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d s_len = 0;. }
bdc0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
bdd0: 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 SSL Callbacks.
bde0: 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 */. SSL_se
bdf0: 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 t_app_data(state
be00: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 Ptr->ssl, (void
be10: 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 *)statePtr);./*
be20: 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 point back to us
be30: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f */. SSL_set_
be40: 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d verify(statePtr-
be50: 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 >ssl, verify, Ve
be60: 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 rifyCallback);.
be70: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f SSL_set_info_
be80: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
be90: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c r->ssl, InfoCall
bea0: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 back);.. /* C
beb0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 allback for obse
bec0: 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d rving protocol m
bed0: 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 essages */.#ifnd
bee0: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ef OPENSSL_NO_SS
bef0: 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 L_TRACE. /* v
bf00: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f oid SSL_CTX_set_
bf10: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 msg_callback_arg
bf20: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
bf30: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
bf40: 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f );. void SSL_
bf50: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c CTX_set_msg_call
bf60: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 back(statePtr->c
bf70: 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 tx, MessageCallb
bf80: 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c ack); */. SSL
bf90: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
bfa0: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e k_arg(statePtr->
bfb0: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ssl, (void *)sta
bfc0: 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f tePtr);. SSL_
bfd0: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
bfe0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
bff0: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 MessageCallback)
c000: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a ;.#endif.. /*
c010: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e Create Tcl_Chan
c020: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 nel BIO Handler
c030: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
c040: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 >p_bio.= BIO_new
c050: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 _tcl(statePtr, B
c060: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 IO_NOCLOSE);.
c070: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d statePtr->bio.=
c080: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 BIO_new(BIO_f_s
c090: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 sl());.. if (
c0a0: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 server) {../* Se
c0b0: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a rver callbacks *
c0c0: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 /..SSL_CTX_set_t
c0d0: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 lsext_servername
c0e0: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 _arg(statePtr->c
c0f0: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 tx, (void *)stat
c100: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f ePtr);..SSL_CTX_
c110: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 set_tlsext_serve
c120: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 rname_callback(s
c130: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e tatePtr->ctx, SN
c140: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c ICallback);..SSL
c150: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
c160: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 hello_cb(statePt
c170: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c r->ctx, HelloCal
c180: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
c190: 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 tatePtr);..if (s
c1a0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
c1b0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
c1c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e SSL_CTX_set_alpn
c1d0: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 _select_cb(state
c1e0: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 Ptr->ctx, ALPNCa
c1f0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
c200: 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 statePtr);.#ifde
c210: 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 f USE_NPN.. i
c220: 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 f (tls1_2 == 0 &
c230: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b & tls1_3 == 0) {
c240: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e ...SSL_CTX_set_n
c250: 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 ext_protos_adver
c260: 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 tised_cb(statePt
c270: 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 r->ctx, NPNCallb
c280: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
c290: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 tePtr);.. }.#
c2a0: 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e endif..}.../* En
c2b0: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 able server to s
c2c0: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74 end cert request
c2d0: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 after handshake
c2e0: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 (TLS 1.3 only)
c2f0: 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f */../* A write o
c300: 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 peration must ta
c310: 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 ke place for the
c320: 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71 Certificate Req
c330: 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 uest to be.. s
c340: 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e ent to the clien
c350: 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 t, this can be d
c360: 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f one with SSL_do_
c370: 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a handshake(). */.
c380: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 .if (request &&
c390: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 post_handshake &
c3a0: 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 & tls1_3) {..
c3b0: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 SSL_verify_clie
c3c0: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b nt_post_handshak
c3d0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
c3e0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 ;..}.../* set au
c3f0: 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 tomatic curve se
c400: 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f lection */..SSL_
c410: 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 set_ecdh_auto(st
c420: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b atePtr->ssl, 1);
c430: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 .../* Set server
c440: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 mode */..stateP
c450: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 tr->flags |= TLS
c460: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 _TCL_SERVER;..SS
c470: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 L_set_accept_sta
c480: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
c490: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
c4a0: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 ./* Client callb
c4b0: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 acks */.#ifdef U
c4c0: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 SE_NPN..if (stat
c4d0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
c4e0: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d NULL && tls1_2 =
c4f0: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d = 0 && tls1_3 ==
c500: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 0) {.. SSL_C
c510: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 TX_set_next_prot
c520: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 o_select_cb(stat
c530: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 ePtr->ctx, ALPNC
c540: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
c550: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 )statePtr);..}.#
c560: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 endif.../* Sessi
c570: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 on caching */..S
c580: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 SL_CTX_set_sessi
c590: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 on_cache_mode(st
c5a0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c atePtr->ctx, SSL
c5b0: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 _SESS_CACHE_CLIE
c5c0: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 NT | SSL_SESS_CA
c5d0: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f CHE_NO_INTERNAL_
c5e0: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 STORE);..SSL_CTX
c5f0: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 _sess_set_new_cb
c600: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c610: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 SessionCallback)
c620: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f ;.../* Enable po
c630: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 st handshake Aut
c640: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 hentication exte
c650: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f nsion. TLS 1.3 o
c660: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e nly, not http/2.
c670: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 */..if (request
c680: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 && post_handsha
c690: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 ke) {.. SSL_s
c6a0: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b et_post_handshak
c6b0: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d e_auth(statePtr-
c6c0: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f >ssl, 1);..}.../
c6d0: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 * Set client mod
c6e0: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f e */..SSL_set_co
c6f0: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 nnect_state(stat
c700: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
c710: 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 }. SSL_set_bi
c720: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c o(statePtr->ssl,
c730: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
c740: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 , statePtr->p_bi
c750: 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f o);. BIO_set_
c760: 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 ssl(statePtr->bi
c770: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c o, statePtr->ssl
c780: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a , BIO_NOCLOSE);.
c790: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 . /*. * E
c7a0: 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 nd of SSL Init.
c7b0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e */. dprin
c7c0: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 tf("Returning %s
c7d0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
c7e0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
c7f0: 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f self));. Tcl_
c800: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
c810: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 , (char *) Tcl_G
c820: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
c830: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 atePtr->self), T
c840: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 CL_VOLATILE);..
c850: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
c860: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
c870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
c8b0: 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a *. * UnimportObj
c8c0: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
c8d0: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
c8e0: 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 nvoked to remove
c8f0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
c900: 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a nnel filter.. *.
c910: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
c920: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
c930: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
c940: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 effects:. *.May
c950: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 modify the beha
c960: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 vior of an IO ch
c970: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d annel.. *. *----
c980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
c9c0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 */.static int.U
c9d0: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c nimportObjCmd(Cl
c9e0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
c9f0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
ca00: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
ca10: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
ca20: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
ca30: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
ca40: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
ca50: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
ca60: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 28 76 6f 69 64 on. */. (void
ca70: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
ca80: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
ca90: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
caa0: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
cab0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
cac0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
cad0: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
cae0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
caf0: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
cb00: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
cb10: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 nterp, Tcl_GetSt
cb20: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e ring(objv[1]), N
cb30: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 ULL);. if (ch
cb40: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
cb50: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
cb60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
cb70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b }.. /* Mak
cb80: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
cb90: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
cba0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
cbb0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
cbc0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
cbd0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
cbe0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
cbf0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
cc00: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
cc10: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
cc20: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
cc30: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
cc40: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
cc50: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 .."\": not a TLS
cc60: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 channel", NULL)
cc70: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
cc80: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
cc90: 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 "TLS", "UNIMPORT
cca0: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 ", "CHANNEL", "I
ccb0: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a NVALID", (char *
ccc0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
ccd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
cce0: 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 }.. if (Tcl_U
ccf0: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e nstackChannel(in
cd00: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 terp, chan) == T
cd10: 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 CL_ERROR) {..ret
cd20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
cd30: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e }.. return
cd40: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
cd50: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd90: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f -----. *. * CTX_
cda0: 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 Init -- construc
cdb0: 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 t a SSL_CTX inst
cdc0: 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ance. *. * Resul
cdd0: 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 ts:. *.A valid S
cde0: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 SL_CTX instance
cdf0: 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 or NULL.. *. * S
ce00: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
ce10: 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 constructs SSL c
ce20: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a ontext (CTX). *.
ce30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
ce40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce70: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
ce80: 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 SSL_CTX *.CTX_I
ce90: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 nit(State *state
cea0: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 Ptr, int isServe
ceb0: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 r, int proto, ch
cec0: 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 ar *keyfile, cha
ced0: 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 r *certfile,.
cee0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
cef0: 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 key, unsigned ch
cf00: 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 ar *cert, int ke
cf10: 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f y_len, int cert_
cf20: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 len, char *CApat
cf30: 68 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 h,. char *CAf
cf40: 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 ile, char *ciphe
cf50: 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 rs, char *cipher
cf60: 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 suites, int leve
cf70: 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d l, char *DHparam
cf80: 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 s) {. Tcl_Int
cf90: 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 erp *interp = st
cfa0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
cfb0: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 SSL_CTX *ctx
cfc0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
cfd0: 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 _DString ds;.
cfe0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 Tcl_DString ds1
cff0: 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 ;. int off =
d000: 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20 20 0, abort = 0;.
d010: 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 int load_priva
d020: 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 te_key;. cons
d030: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 t SSL_METHOD *me
d040: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e thod;.. dprin
d050: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
d060: 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b if (!proto) {
d070: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
d080: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 lt(interp, "no v
d090: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 alid protocol se
d0a0: 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a lected", (char *
d0b0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
d0c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
d0d0: 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 /* create SSL
d0e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f context */.#if O
d0f0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
d100: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 UMBER >= 0x10100
d110: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 000L || defined(
d120: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 NO_SSL2) || defi
d130: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
d140: 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 SL2). if (ENA
d150: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
d160: 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 PROTO_SSL2)) {..
d170: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d180: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 (interp, "SSL2 p
d190: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
d1a0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
d1b0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
d1c0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
d1d0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
d1e0: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e O_SSL3) || defin
d1f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
d200: 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 L3). if (ENAB
d210: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
d220: 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 ROTO_SSL3)) {..T
d230: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d240: 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 interp, "SSL3 pr
d250: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d260: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
d270: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d280: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
d290: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
d2a0: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 _TLS1) || define
d2b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d2c0: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 1). if (ENABL
d2d0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d2e0: 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 OTO_TLS1)) {..Tc
d2f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d300: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 nterp, "TLS 1.0
d310: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
d320: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
d330: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
d340: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
d350: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
d360: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
d370: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d380: 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 _TLS1_1). if
d390: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
d3a0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
d3b0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
d3c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d3d0: 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c TLS 1.1 protocol
d3e0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
d3f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d400: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
d410: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
d420: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
d430: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
d440: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
d450: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
d460: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
d470: 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 O_TLS1_2)) {..Tc
d480: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d490: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 nterp, "TLS 1.2
d4a0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
d4b0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
d4c0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
d4d0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
d4e0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
d4f0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
d500: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d510: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 _TLS1_3). if
d520: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
d530: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
d540: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
d550: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d560: 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c TLS 1.3 protocol
d570: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
d580: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d590: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
d5a0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 }.#endif.
d5b0: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 if (proto == 0)
d5c0: 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 {../* Use full r
d5d0: 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 ange */..SSL_CTX
d5e0: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 _set_min_proto_v
d5f0: 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a ersion(ctx, 0);.
d600: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 .SSL_CTX_set_max
d610: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
d620: 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 tx, 0);. }..
d630: 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f switch (proto
d640: 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f ) {.#if OPENSSL_
d650: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
d660: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 0x10100000L &&
d670: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 !defined(NO_SSL2
d680: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d690: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 ENSSL_NO_SSL2).
d6a0: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
d6b0: 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 O_SSL2:..method
d6c0: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c = isServer ? SSL
d6d0: 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 v2_server_method
d6e0: 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e () : SSLv2_clien
d6f0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
d700: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
d710: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
d720: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d730: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 NSSL_NO_SSL3) &&
d740: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
d750: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 L_NO_SSL3_METHOD
d760: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
d770: 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 ROTO_SSL3:..meth
d780: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
d790: 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 SSLv3_server_met
d7a0: 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c hod() : SSLv3_cl
d7b0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
d7c0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
d7d0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
d7e0: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
d7f0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
d800: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d810: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 NSSL_NO_TLS1_MET
d820: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
d830: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d S_PROTO_TLS1:..m
d840: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
d850: 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f ? TLSv1_server_
d860: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 method() : TLSv1
d870: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
d880: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
d890: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
d8a0: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
d8b0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d8c0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
d8d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d8e0: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 LS1_1_METHOD).
d8f0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
d900: 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 _TLS1_1:..method
d910: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c = isServer ? TL
d920: 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 Sv1_1_server_met
d930: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f hod() : TLSv1_1_
d940: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
d950: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
d960: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
d970: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
d980: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d990: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
d9a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d9b0: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_2_METHOD).
d9c0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
d9d0: 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 TLS1_2:..method
d9e0: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 = isServer ? TLS
d9f0: 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 v1_2_server_meth
da00: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 od() : TLSv1_2_c
da10: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
da20: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
da30: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
da40: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
da50: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
da60: 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 S1_3). case T
da70: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a LS_PROTO_TLS1_3:
da80: 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e ../* Use the gen
da90: 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 eric method and
daa0: 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 constraint range
dab0: 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 after context i
dac0: 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 s created */..me
dad0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
dae0: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 ? TLS_server_met
daf0: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 hod() : TLS_clie
db00: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
db10: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
db20: 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 default:../* Neg
db30: 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61 otiate highest a
db40: 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 vailable SSL/TLS
db50: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 version */..met
db60: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
db70: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 TLS_server_meth
db80: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e od() : TLS_clien
db90: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 t_method();.#if
dba0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
dbb0: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
dbc0: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 000L && !defined
dbd0: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 (NO_SSL2) && !de
dbe0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
dbf0: 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 _SSL2)..off |= (
dc00: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
dc10: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 LS_PROTO_SSL2)
dc20: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
dc30: 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a _SSLv2);.#endif.
dc40: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
dc50: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
dc60: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
dc70: 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 3)..off |= (ENAB
dc80: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
dc90: 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 ROTO_SSL3) ? 0
dca0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c : SSL_OP_NO_SSL
dcb0: 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 v3);.#endif.#if
dcc0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
dcd0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
dce0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 ENSSL_NO_TLS1)..
dcf0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
dd00: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
dd10: 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 _TLS1) ? 0 : S
dd20: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b SL_OP_NO_TLSv1);
dd30: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
dd40: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
dd50: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
dd60: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 SSL_NO_TLS1_1)..
dd70: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
dd80: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
dd90: 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 _TLS1_1) ? 0 : S
dda0: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 SL_OP_NO_TLSv1_1
ddb0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
ddc0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
ddd0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
dde0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
ddf0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
de00: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
de10: 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a TO_TLS1_2) ? 0 :
de20: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
de30: 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 _2);.#endif.#if
de40: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
de50: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
de60: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
de70: 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 3)..off |= (ENAB
de80: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
de90: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 ROTO_TLS1_3) ? 0
dea0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
deb0: 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 v1_3);.#endif..b
dec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
ded0: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 ERR_clear_error
dee0: 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 ();.. ctx = S
def0: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f SL_CTX_new(metho
df00: 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 d);. if (!ctx
df10: 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c ) {..return(NULL
df20: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
df30: 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c (getenv(SSLKEYL
df40: 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f OGFILE)) {..SSL_
df50: 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 CTX_set_keylog_c
df60: 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 allback(ctx, Key
df70: 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 LogCallback);.
df80: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 }..#if !define
df90: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 d(NO_TLS1_3) &&
dfa0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
dfb0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
dfc0: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 if (proto == TLS
dfd0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b _PROTO_TLS1_3) {
dfe0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 ..SSL_CTX_set_mi
dff0: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 n_proto_version(
e000: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 ctx, TLS1_3_VERS
e010: 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ION);..SSL_CTX_s
e020: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 et_max_proto_ver
e030: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 sion(ctx, TLS1_3
e040: 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d _VERSION);. }
e050: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
e060: 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c Force cipher sel
e070: 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 ection order by
e080: 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 server */. if
e090: 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 (!isServer) {..
e0a0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
e0b0: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f ons(ctx, SSL_OP_
e0c0: 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 CIPHER_SERVER_PR
e0d0: 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d EFERENCE);. }
e0e0: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
e0f0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
e100: 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f x10100000L. O
e110: 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 penSSL_add_all_a
e120: 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 lgorithms(); /*
e130: 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 6e 64 Load ciphers and
e140: 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 digests */.#end
e150: 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f if.. SSL_CTX_
e160: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 set_app_data(ctx
e170: 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 , (void*)interp)
e180: 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 ;./* remember th
e190: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f e interpreter */
e1a0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
e1b0: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 _options(ctx, SS
e1c0: 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c L_OP_ALL);./* al
e1d0: 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 l SSL bug workar
e1e0: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c ounds */. SSL
e1f0: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
e200: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f (ctx, SSL_OP_NO_
e210: 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a COMPRESSION);./*
e220: 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 disable compres
e230: 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 sion even if sup
e240: 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 ported */. SS
e250: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e L_CTX_set_option
e260: 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a s(ctx, off);../*
e270: 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f disable protoco
e280: 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 l versions */.#i
e290: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
e2a0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
e2b0: 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 01000L. SSL_C
e2c0: 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c TX_set_mode(ctx,
e2d0: 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 SSL_MODE_AUTO_R
e2e0: 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 ETRY);./* handle
e2f0: 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 new handshakes
e300: 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f in background. O
e310: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20 n by default in
e320: 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a OpenSSL 1.1.1. *
e330: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c /.#endif. SSL
e340: 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 _CTX_sess_set_ca
e350: 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 che_size(ctx, 12
e360: 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 8);.. /* Set
e370: 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 user defined cip
e380: 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 hers, cipher sui
e390: 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 tes, and securit
e3a0: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 y level */. i
e3b0: 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e f ((ciphers != N
e3c0: 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 ULL) && !SSL_CTX
e3d0: 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 _set_cipher_list
e3e0: 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 (ctx, ciphers))
e3f0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
e400: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 ult(interp, "Set
e410: 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a ciphers failed:
e420: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 No valid cipher
e430: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c s", (char *) NUL
e440: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
e450: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
e460: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
e470: 69 66 20 28 28 63 69 70 68 65 72 73 75 69 74 65 if ((ciphersuite
e480: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 s != NULL) && !S
e490: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 SL_CTX_set_ciphe
e4a0: 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 rsuites(ctx, cip
e4b0: 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 hersuites)) {..T
e4c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e4d0: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 interp, "Set cip
e4e0: 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 her suites faile
e4f0: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 d: No valid ciph
e500: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ers", (char *) N
e510: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
e520: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
e530: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 n NULL;. }..
e540: 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 /* Set securi
e550: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 ty level */.
e560: 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 if (level > -1 &
e570: 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 & level < 6) {..
e580: 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 /* SSL_set_secur
e590: 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 ity_level */..SS
e5a0: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 L_CTX_set_securi
e5b0: 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 ty_level(ctx, le
e5c0: 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 vel);. }..
e5d0: 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c /* set some cal
e5e0: 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 lbacks */. SS
e5f0: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c L_CTX_set_defaul
e600: 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c t_passwd_cb(ctx,
e610: 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 PasswordCallbac
e620: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f k);. SSL_CTX_
e630: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 set_default_pass
e640: 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 wd_cb_userdata(c
e650: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 tx, (void *)stat
e660: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 ePtr);.. /* r
e670: 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c ead a Diffie-Hel
e680: 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 lman parameters
e690: 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 file, or use the
e6a0: 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f built-in one */
e6b0: 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f .#ifdef OPENSSL_
e6c0: 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 NO_DH. if (DH
e6d0: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 params != NULL)
e6e0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
e6f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 ult(interp, "DH
e700: 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 parameter suppor
e710: 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 t not available"
e720: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
e730: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
e740: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ctx);..return NU
e750: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a LL;. }.#else.
e760: 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 {..DH* dh;..
e770: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 if (DHparams !=
e780: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f NULL) {.. BIO
e790: 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f *bio;.. Tcl_
e7a0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
e7b0: 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f ;.. bio = BIO
e7c0: 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 _new_file(F2N(DH
e7d0: 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 params, &ds), "r
e7e0: 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 ");.. if (!bi
e7f0: 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 o) {...Tcl_DStri
e800: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 ngFree(&ds);...T
e810: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e820: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e interp, "Could n
e830: 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d ot find DH param
e840: 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 eters file", (ch
e850: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
e860: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
e870: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
e880: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 .. }... dh
e890: 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f = PEM_read_bio_
e8a0: 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 DHparams(bio, NU
e8b0: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b LL, NULL, NULL);
e8c0: 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 .. BIO_free(b
e8d0: 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 io);.. Tcl_DS
e8e0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
e8f0: 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a . if (!dh) {.
e900: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
e910: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c lt(interp, "Coul
e920: 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 d not read DH pa
e930: 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 rameters from fi
e940: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 le", (char *) NU
e950: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
e960: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
e970: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a rn NULL;.. }.
e980: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
e990: 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 _tmp_dh(ctx, dh)
e9a0: 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28 64 ;.. DH_free(d
e9b0: 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 h);...} else {..
e9c0: 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20 /* Use well
e9d0: 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74 known DH paramet
e9e0: 65 72 73 20 74 68 61 74 20 68 61 76 65 20 62 75 ers that have bu
e9f0: 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69 ilt-in support i
ea00: 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 n OpenSSL */..
ea10: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 if (!SSL_CTX_s
ea20: 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 et_dh_auto(ctx,
ea30: 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 1)) {...Tcl_Appe
ea40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ea50: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62 "Could not enab
ea60: 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20 le set DH auto:
ea70: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ", GET_ERR_REASO
ea80: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
ea90: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
eaa0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
eab0: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a rn NULL;.. }.
eac0: 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a .}. }.#endif.
ead0: 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 . /* set our
eae0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 certificate */.
eaf0: 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f load_private_
eb00: 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 key = 0;. if
eb10: 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c (certfile != NUL
eb20: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 L) {..load_priva
eb30: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 te_key = 1;...Tc
eb40: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 l_DStringInit(&d
eb50: 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 s);...if (SSL_CT
eb60: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 X_use_certificat
eb70: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 e_file(ctx, F2N(
eb80: 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 certfile, &ds),
eb90: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
eba0: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) <= 0) {.. T
ebb0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
ebc0: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 ds);.. Tcl_Ap
ebd0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
ebe0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
ebf0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 t certificate fi
ec00: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 le ", certfile,
ec10: 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f ": ",...GET_ERR_
ec20: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
ec30: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
ec40: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
ec50: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
ec60: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 LL;..}. } els
ec70: 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 e if (cert != NU
ec80: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 LL) {..load_priv
ec90: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 ate_key = 1;..if
eca0: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 (SSL_CTX_use_ce
ecb0: 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 rtificate_ASN1(c
ecc0: 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 tx, cert_len, ce
ecd0: 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 rt) <= 0) {..
ece0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
ecf0: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f (&ds);.. Tcl_
ed00: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
ed10: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
ed20: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a set certificate:
ed30: 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 ",...GET_ERR_RE
ed40: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
ed50: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
ed60: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
ed70: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
ed80: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
ed90: 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 {..certfile = (c
eda0: 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 har*)X509_get_de
edb0: 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 fault_cert_file(
edc0: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 );...if (SSL_CTX
edd0: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
ede0: 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 _file(ctx, certf
edf0: 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ile, SSL_FILETYP
ee00: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 E_PEM) <= 0) {.#
ee10: 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 if 0.. Tcl_DS
ee20: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
ee30: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
ee40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
ee50: 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 nable to use def
ee60: 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 ault certificate
ee70: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c file ", certfil
ee80: 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 e, ": ",...GET_E
ee90: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
eea0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
eeb0: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
eec0: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
eed0: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d NULL;.#endif..}
eee0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 . }.. /* s
eef0: 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b et our private k
ef00: 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f ey */. if (lo
ef10: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 ad_private_key)
ef20: 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d {..if (keyfile =
ef30: 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d = NULL && key ==
ef40: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 NULL) {.. ke
ef50: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 yfile = certfile
ef60: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 ;..}...if (keyfi
ef70: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 le != NULL) {..
ef80: 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 /* get the pr
ef90: 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 ivate key associ
efa0: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 ated with this c
efb0: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 ertificate */..
efc0: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d if (keyfile =
efd0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 = NULL) {...keyf
efe0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a ile = certfile;.
eff0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
f000: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 (SSL_CTX_use_Pri
f010: 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 vateKey_file(ctx
f020: 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 , F2N(keyfile, &
f030: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ds), SSL_FILETYP
f040: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 E_PEM) <= 0) {..
f050: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
f060: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 (&ds);.../* flus
f070: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 h the passphrase
f080: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 which might be
f090: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 left in the resu
f0a0: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 lt */...Tcl_SetR
f0b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 esult(interp, NU
f0c0: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b LL, TCL_STATIC);
f0d0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
f0e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
f0f0: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 ble to set publi
f100: 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 c key file ", ke
f110: 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20 yfile, " ",...
f120: 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e GET_ERR_REASON
f130: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
f140: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
f150: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
f160: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 n NULL;.. }..
f170: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
f180: 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c ree(&ds);...} el
f190: 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 se if (key != NU
f1a0: 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 LL) {.. if (S
f1b0: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 SL_CTX_use_Priva
f1c0: 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 teKey_ASN1(EVP_P
f1d0: 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 KEY_RSA, ctx, ke
f1e0: 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 y,key_len) <= 0)
f1f0: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 {...Tcl_DString
f200: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 Free(&ds);.../*
f210: 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 flush the passph
f220: 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 rase which might
f230: 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 be left in the
f240: 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f result */...Tcl_
f250: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
f260: 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 , NULL, TCL_STAT
f270: 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e IC);...Tcl_Appen
f280: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f290: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 "unable to set p
f2a0: 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 ublic key: ", GE
f2b0: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
f2c0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
f2d0: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
f2e0: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
f2f0: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f LL;.. }..}../
f300: 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 * Now we know th
f310: 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 at a key and cer
f320: 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 t have been set
f330: 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 against.. * the
f340: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 SSL context */..
f350: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 if (!SSL_CTX_che
f360: 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 ck_private_key(c
f370: 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f tx)) {.. Tcl_
f380: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f390: 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 erp, "private ke
f3a0: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 y does not match
f3b0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
f3c0: 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 public key",...
f3d0: 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e . (char *) N
f3e0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
f3f0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
f400: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
f410: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
f420: 20 53 65 74 20 74 6f 20 75 73 65 20 64 65 66 61 Set to use defa
f430: 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 ult location and
f440: 20 66 69 6c 65 20 66 6f 72 20 43 65 72 74 69 66 file for Certif
f450: 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 icate Authority
f460: 28 43 41 29 20 63 65 72 74 69 66 69 63 61 74 65 (CA) certificate
f470: 73 2e 20 54 68 65 0a 20 20 20 20 20 2a 20 76 65 s. The. * ve
f480: 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 73 74 rify path and st
f490: 6f 72 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 ore can be overr
f4a0: 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c idden by the SSL
f4b0: 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 _CERT_DIR env va
f4c0: 72 2e 20 54 68 65 20 76 65 72 69 66 79 20 66 69 r. The verify fi
f4d0: 6c 65 20 63 61 6e 0a 20 20 20 20 20 2a 20 62 65 le can. * be
f4e0: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 overridden by t
f4f0: 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 he SSL_CERT_FILE
f500: 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 20 20 20 env var. */.
f510: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 if (!SSL_CTX_se
f520: 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 t_default_verify
f530: 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a 09 _paths(ctx)) {..
f540: 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a abort++;. }..
f550: 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 64 65 73 /* Overrides
f560: 20 66 6f 72 20 74 68 65 20 43 41 20 76 65 72 69 for the CA veri
f570: 66 79 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 fy path and file
f580: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 */. Tcl_DStr
f590: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 20 ingInit(&ds);.
f5a0: 20 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f {.#if OPENSSL_
f5b0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
f5c0: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 54 63 0x30000000L..Tc
f5d0: 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 09 l_DString ds1;..
f5e0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
f5f0: 26 64 73 31 29 3b 0a 0a 09 69 66 20 28 43 41 70 &ds1);...if (CAp
f600: 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 ath != NULL || C
f610: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b Afile != NULL) {
f620: 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 .. if (!SSL_C
f630: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c TX_load_verify_l
f640: 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 ocations(ctx, F2
f650: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 N(CAfile, &ds),
f660: 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73 31 F2N(CApath, &ds1
f670: 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b ))) {...abort++;
f680: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a .. }... /*
f690: 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41 73 Set list of CAs
f6a0: 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 to send to clie
f6b0: 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 nt when requesti
f6c0: 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72 74 ng a client cert
f6d0: 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 ificate */..
f6e0: 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 /* https://sourc
f6f0: 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 eforge.net/p/tls
f700: 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 09 20 20 /bugs/57/ */..
f710: 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c /* XXX:TODO: L
f720: 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70 70 et the user supp
f730: 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 69 ly values here i
f740: 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 nstead of someth
f750: 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 20 ing that exists
f760: 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 on the filesyste
f770: 6d 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f m */.. STACK_
f780: 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 OF(X509_NAME) *c
f790: 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c ertNames = SSL_l
f7a0: 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 oad_client_CA_fi
f7b0: 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 le(F2N(CAfile, &
f7c0: 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 63 ds));.. if (c
f7d0: 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c ertNames != NULL
f7e0: 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 ) {...SSL_CTX_se
f7f0: 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 t_client_CA_list
f800: 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 (ctx, certNames)
f810: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 54 63 6c ;.. }..}..Tcl
f820: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
f830: 31 29 3b 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28 1);..#else..if (
f840: 43 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 CApath != NULL)
f850: 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f {.. if (!SSL_
f860: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f CTX_load_verify_
f870: 64 69 72 28 63 74 78 2c 20 46 32 4e 28 43 41 70 dir(ctx, F2N(CAp
f880: 61 74 68 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 ath, &ds))) {...
f890: 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a abort++;.. }.
f8a0: 09 7d 0a 09 69 66 20 28 43 41 66 69 6c 65 20 21 .}..if (CAfile !
f8b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 = NULL) {.. i
f8c0: 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 f (!SSL_CTX_load
f8d0: 5f 76 65 72 69 66 79 5f 66 69 6c 65 28 63 74 78 _verify_file(ctx
f8e0: 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 , F2N(CAfile, &d
f8f0: 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b s))) {...abort++
f900: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f ;.. }... /
f910: 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41 * Set list of CA
f920: 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 s to send to cli
f930: 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74 ent when request
f940: 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72 ing a client cer
f950: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 tificate */..
f960: 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e STACK_OF(X509_N
f970: 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 AME) *certNames
f980: 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e = SSL_load_clien
f990: 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 t_CA_file(F2N(CA
f9a0: 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 file, &ds));..
f9b0: 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 if (certNames
f9c0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c != NULL) {...SSL
f9d0: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
f9e0: 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 CA_list(ctx, cer
f9f0: 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a tNames);.. }.
fa00: 09 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a .}.#endif. }.
fa10: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
fa20: 72 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 72 ree(&ds);.. r
fa30: 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f eturn ctx;.}.../
fa40: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
fa50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fa60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fa70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fa80: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 -------. *. * St
fa90: 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 atusObjCmd -- re
faa0: 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 turn certificate
fab0: 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 for connected p
fac0: 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c eer.. *. * Resul
fad0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
fae0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
faf0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
fb00: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
fb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fb50: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
fb60: 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 nt.StatusObjCmd(
fb70: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
fb80: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
fb90: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
fba0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
fbb0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
fbc0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
fbd0: 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 r;. X509 *pee
fbe0: 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a r;. Tcl_Obj *
fbf0: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f objPtr;. Tcl_
fc00: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 Channel chan;.
fc10: 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e char *channelN
fc20: 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 ame, *ciphers;.
fc30: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 int mode;.
fc40: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
fc50: 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 char *proto;.
fc60: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 unsigned int le
fc70: 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 n;. int nid,
fc80: 72 65 73 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 res;. (void)
fc90: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
fca0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
fcb0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
fcc0: 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 c < 2 || objc >
fcd0: 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 3 || (objc == 3
fce0: 26 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 && !strcmp(Tcl_G
fcf0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d etString(objv[1]
fd00: 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b ), "-local"))) {
fd10: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
fd20: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
fd30: 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 jv, "?-local? ch
fd40: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
fd50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
fd60: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 }.. /* Get ch
fd70: 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 annel Id */.
fd80: 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 channelName = Tc
fd90: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
fda0: 62 6a 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d bj(objv[(objc ==
fdb0: 20 32 20 3f 20 31 20 3a 20 32 29 5d 2c 20 28 54 2 ? 1 : 2)], (T
fdc0: 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 cl_Size *) NULL)
fdd0: 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c ;. chan = Tcl
fde0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
fdf0: 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c rp, channelName,
fe00: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 &mode);. if
fe10: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
fe20: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
fe30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
fe40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
fe50: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
fe60: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
fe70: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
fe80: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
fe90: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
fea0: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 );. if (Tcl_G
feb0: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
fec0: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
fed0: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
fee0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
fef0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
ff00: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
ff10: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
ff20: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 ,..."\": not a T
ff30: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
ff40: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f L);..Tcl_SetErro
ff50: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
ff60: 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 LS", "STATUS", "
ff70: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c CHANNEL", "INVAL
ff80: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ID", (char *) NU
ff90: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
ffa0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
ffb0: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 statePtr = (St
ffc0: 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 ate *) Tcl_GetCh
ffd0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
ffe0: 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a a(chan);.. /*
fff0: 20 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65 Get certificate
10000 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c for peer or sel
10010 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a f */. if (obj
10020 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 c == 2) {..peer
10030 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 = SSL_get_peer_c
10040 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 ertificate(state
10050 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
10060 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 else {..peer =
10070 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 SSL_get_certific
10080 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ate(statePtr->ss
10090 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a l);. }. /*
100a0 20 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66 Get X509 certif
100b0 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 icate info */.
100c0 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f if (peer) {..o
100d0 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 bjPtr = Tls_NewX
100e0 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 509Obj(interp, p
100f0 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 eer);..if (objc
10100 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30 == 2) {.. X50
10110 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20 9_free(peer);..
10120 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a peer = NULL;.
10130 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a .}. } else {.
10140 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 .objPtr = Tcl_Ne
10150 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
10160 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
10170 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 Peer name */.
10180 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
10190 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 terp, objPtr, "p
101a0 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 eername", SSL_ge
101b0 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74 t0_peername(stat
101c0 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b ePtr->ssl), -1);
101d0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 . LAPPEND_INT
101e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
101f0 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 "sbits", SSL_ge
10200 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 t_cipher_bits(st
10210 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c atePtr->ssl, NUL
10220 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 L));.. cipher
10230 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 s = (char*)SSL_g
10240 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 et_cipher(stateP
10250 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 tr->ssl);. LA
10260 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
10270 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 , objPtr, "ciphe
10280 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29 r", ciphers, -1)
10290 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 ;.. /* Verify
102a0 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66 the X509 certif
102b0 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20 icate presented
102c0 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 by the peer */.
102d0 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
102e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
102f0 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 verifyResult",..
10300 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 X509_verify_cert
10310 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 _error_string(SS
10320 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 L_get_verify_res
10330 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ult(statePtr->ss
10340 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f l)), -1);.. /
10350 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f * Verify mode */
10360 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f . mode = SSL_
10370 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 get_verify_mode(
10380 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
10390 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20 if (mode &&
103a0 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 SSL_VERIFY_NONE)
103b0 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 {..LAPPEND_STR(
103c0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
103d0 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e "verifyMode", "n
103e0 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d one", -1);. }
103f0 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a else {..Tcl_Obj
10400 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 *listObjPtr = T
10410 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
10420 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 NULL);..if (mod
10430 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f e && SSL_VERIFY_
10440 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c PEER) {.. Tcl
10450 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
10460 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 ement(interp, li
10470 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 stObjPtr, Tcl_Ne
10480 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 wStringObj("peer
10490 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
104a0 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 (mode && SSL_VER
104b0 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 IFY_FAIL_IF_NO_P
104c0 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 EER_CERT) {..
104d0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
104e0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
104f0 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 , listObjPtr, Tc
10500 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
10510 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 fail if no peer
10520 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a cert", -1));..}.
10530 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c .if (mode && SSL
10540 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f _VERIFY_CLIENT_O
10550 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f NCE) {.. Tcl_
10560 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10570 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
10580 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
10590 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e StringObj("clien
105a0 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 t once", -1));..
105b0 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 }..if (mode && S
105c0 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 SL_VERIFY_POST_H
105d0 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 ANDSHAKE) {..
105e0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
105f0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10600 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 , listObjPtr, Tc
10610 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
10620 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c post handshake",
10630 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 -1));..}..LAPPE
10640 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f ND_OBJ(interp, o
10650 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f bjPtr, "verifyMo
10660 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 de", listObjPtr)
10670 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 . }.. /* V
10680 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68 erify mode depth
10690 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f */. LAPPEND_
106a0 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
106b0 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68 tr, "verifyDepth
106c0 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 ", SSL_get_verif
106d0 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72 y_depth(statePtr
106e0 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a ->ssl));.. /*
106f0 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 Report the sele
10700 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 cted protocol as
10710 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 a result of the
10720 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a negotiation */.
10730 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 SSL_get0_alp
10740 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 n_selected(state
10750 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f Ptr->ssl, &proto
10760 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 , &len);. LAP
10770 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
10780 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c objPtr, "alpn",
10790 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 (char *)proto,
107a0 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b (Tcl_Size) len);
107b0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
107c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
107d0 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c "protocol", SSL
107e0 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 _get_version(sta
107f0 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 tePtr->ssl), -1)
10800 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 ;.. /* Valid
10810 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e for non-RSA sign
10820 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e ature and TLS 1.
10830 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 3 */. if (obj
10840 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d c == 2) {..res =
10850 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 SSL_get_peer_si
10860 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 gnature_nid(stat
10870 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 ePtr->ssl, &nid)
10880 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
10890 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 res = SSL_get_si
108a0 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 gnature_nid(stat
108b0 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 ePtr->ssl, &nid)
108c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
108d0 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d !res) {nid = 0;}
108e0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
108f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10900 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 "signatureHashA
10910 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e lgorithm", OBJ_n
10920 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b id2ln(nid), -1);
10930 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d .. if (objc =
10940 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 2) {..res = SS
10950 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 L_get_peer_signa
10960 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 ture_type_nid(st
10970 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
10980 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b d);. } else {
10990 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
109a0 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e signature_type_n
109b0 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c id(statePtr->ssl
109c0 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 , &nid);. }.
109d0 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 if (!res) {ni
109e0 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 d = 0;}. 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 73 69 67 6e 61 74 75 objPtr, "signatu
10a10 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 reType", OBJ_nid
10a20 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 2ln(nid), -1);..
10a30 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
10a40 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
10a50 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
10a60 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
10a70 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
10a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ab0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e -----. *. * Conn
10ac0 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 ectionInfoObjCmd
10ad0 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 -- return conne
10ae0 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 ction info from
10af0 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 OpenSSL.. *. * R
10b00 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 esults:. *.A lis
10b10 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 t of connection
10b20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d info. *. *-----
10b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
10b70 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 */..static int C
10b80 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a onnectionInfoObj
10b90 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
10ba0 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
10bb0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
10bc0 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
10bd0 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
10be0 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
10bf0 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
10c00 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
10c10 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 mode on */.
10c20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
10c30 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 ../* client stat
10c40 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 e for ssl socket
10c50 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
10c60 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 *objPtr, *listPt
10c70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c r;. const SSL
10c80 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 *ssl;. const
10c90 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 SSL_CIPHER *cip
10ca0 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 her;. const S
10cb0 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 SL_SESSION *sess
10cc0 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 ion;. const E
10cd0 56 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28 VP_MD *md;. (
10ce0 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
10cf0 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
10d00 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
10d10 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
10d20 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
10d30 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 nel");..return(T
10d40 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
10d50 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
10d60 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
10d70 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
10d80 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d gFromObj(objv[1]
10d90 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 , (Tcl_Size *)NU
10da0 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 LL), NULL);.
10db0 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
10dc0 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
10dd0 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 {..return(TCL_ER
10de0 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ROR);. }..
10df0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f /* Make sure to
10e00 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
10e10 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
10e20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
10e30 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
10e40 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 chan);. if (T
10e50 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
10e60 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
10e70 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
10e80 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
10e90 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
10ea0 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
10eb0 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
10ec0 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 han),.. "\":
10ed0 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
10ee0 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f l", NULL);..Tcl_
10ef0 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
10f00 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e erp, "TLS", "CON
10f10 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e NECTION", "CHANN
10f20 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 EL", "INVALID",
10f30 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
10f40 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
10f50 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f R);. }.. o
10f60 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
10f70 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
10f80 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 .. /* Connect
10f90 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ion info */.
10fa0 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
10fb0 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e e *)Tcl_GetChann
10fc0 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 elInstanceData(c
10fd0 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 han);. ssl =
10fe0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 statePtr->ssl;.
10ff0 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 if (ssl != NU
11000 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 LL) {../* connec
11010 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c tion state */..L
11020 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11030 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 p, objPtr, "stat
11040 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 e", SSL_state_st
11050 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 ring_long(ssl),
11060 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e -1);.../* Get SN
11070 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76 I requested serv
11080 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 er name */..LAPP
11090 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
110a0 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e objPtr, "servern
110b0 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 ame", SSL_get_se
110c0 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c rvername(ssl, TL
110d0 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f SEXT_NAMETYPE_ho
110e0 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a st_name), -1);..
110f0 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c ./* Get protocol
11100 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
11110 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11120 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c "protocol", SSL
11130 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c _get_version(ssl
11140 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e ), -1);.../* Ren
11150 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 egotiation allow
11160 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 ed */..LAPPEND_B
11170 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
11180 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69 tr, "renegotiati
11190 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c on_allowed", SSL
111a0 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 _get_secure_rene
111b0 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 gotiation_suppor
111c0 74 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b t((SSL *) ssl));
111d0 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 .../* Get securi
111e0 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 ty level */..LAP
111f0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
11200 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69 objPtr, "securi
11210 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 ty_level", SSL_g
11220 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 et_security_leve
11230 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 l(ssl));.../* Se
11240 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c ssion info */..L
11250 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
11260 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
11270 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 sion_reused", SS
11280 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 L_session_reused
11290 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 (ssl));.../* Is
112a0 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 server info */..
112b0 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
112c0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 erp, objPtr, "is
112d0 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 _server", SSL_is
112e0 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a _server(ssl));..
112f0 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 ./* Is DTLS */..
11300 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
11310 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 erp, objPtr, "is
11320 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 _dtls", SSL_is_d
11330 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d tls(ssl));. }
11340 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 .. /* Cipher
11350 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 info */. ciph
11360 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 er = SSL_get_cur
11370 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 rent_cipher(ssl)
11380 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 ;. if (cipher
11390 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 != NULL) {..cha
113a0 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 r buf[BUFSIZ] =
113b0 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 {0};..int bits,
113c0 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 alg_bits;.../* C
113d0 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c ipher name */..L
113e0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
113f0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 p, objPtr, "ciph
11400 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f er", SSL_CIPHER_
11410 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 get_name(cipher)
11420 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 , -1);.../* RFC
11430 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a name of cipher *
11440 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
11450 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11460 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 standard_name",
11470 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 SSL_CIPHER_stand
11480 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 ard_name(cipher)
11490 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e , -1);.../* Open
114a0 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 SSL name of ciph
114b0 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 er */..LAPPEND_S
114c0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
114d0 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 r, "openssl_name
114e0 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 ", OPENSSL_ciphe
114f0 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 r_name(SSL_CIPHE
11500 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 R_standard_name(
11510 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a cipher)), -1);..
11520 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 ./* number of se
11530 63 72 65 74 20 62 69 74 73 20 75 73 65 64 20 66 cret bits used f
11540 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 or cipher */..bi
11550 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f ts = SSL_CIPHER_
11560 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c get_bits(cipher,
11570 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 &alg_bits);..LA
11580 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
11590 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 65 , objPtr, "secre
115a0 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b 0a t_bits", bits);.
115b0 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 .LAPPEND_INT(int
115c0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c erp, objPtr, "al
115d0 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 gorithm_bits", a
115e0 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c lg_bits);../* al
115f0 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 6c g_bits is actual
11600 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 73 key secret bits
11610 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61 6e . If use bits an
11620 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 d secret (algori
11630 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 thm) bits differ
11640 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 6f ,.. the rest o
11650 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20 66 f the bits are f
11660 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c ixed, i.e. for l
11670 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 imited export ci
11680 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 phers (bits < 56
11690 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 ) */.../* Indica
116a0 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54 4c tes which SSL/TL
116b0 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 S protocol versi
116c0 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 on first defined
116d0 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 the cipher */..
116e0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
116f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e rp, objPtr, "min
11700 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 _version", SSL_C
11710 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f IPHER_get_versio
11720 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a n(cipher), -1);.
11730 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 20 ../* Cipher NID
11740 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
11750 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11760 22 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63 68 "cipherNID", (ch
11770 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 ar *)OBJ_nid2ln(
11780 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 SSL_CIPHER_get_c
11790 69 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65 72 ipher_nid(cipher
117a0 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e )), -1);..LAPPEN
117b0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
117c0 6a 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49 44 jPtr, "digestNID
117d0 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e ", (char *)OBJ_n
117e0 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 id2ln(SSL_CIPHER
117f0 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 _get_digest_nid(
11800 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 cipher)), -1);..
11810 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11820 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 rp, objPtr, "key
11830 45 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 ExchangeNID", (c
11840 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e har *)OBJ_nid2ln
11850 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f (SSL_CIPHER_get_
11860 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c kx_nid(cipher)),
11870 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 -1);..LAPPEND_S
11880 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11890 72 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74 69 r, "authenticati
118a0 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 onNID", (char *)
118b0 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 OBJ_nid2ln(SSL_C
118c0 49 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e IPHER_get_auth_n
118d0 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 id(cipher)), -1)
118e0 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 ;.../* message a
118f0 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f uthentication co
11900 64 65 20 2d 20 43 69 70 68 65 72 20 69 73 20 41 de - Cipher is A
11910 45 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 EAD (e.g. GCM or
11920 20 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 ChaCha20/Poly13
11930 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 05) or not */../
11940 2a 20 41 75 74 68 65 6e 74 69 63 61 74 65 64 20 * Authenticated
11950 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68 20 Encryption with
11960 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 20 associated data
11970 28 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a (AEAD) check */.
11980 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
11990 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
119a0 69 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 ipher_is_aead",
119b0 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 SSL_CIPHER_is_ae
119c0 61 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f ad(cipher));.../
119d0 2a 20 44 69 67 65 73 74 20 75 73 65 64 20 64 75 * Digest used du
119e0 72 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 ring the SSL/TLS
119f0 20 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 handshake when
11a00 75 73 69 6e 67 20 74 68 65 20 63 69 70 68 65 72 using the cipher
11a10 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 . */..md = SSL_C
11a20 49 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 IPHER_get_handsh
11a30 61 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68 65 ake_digest(ciphe
11a40 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 r);..LAPPEND_STR
11a50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11a60 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 "handshake_dige
11a70 73 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56 50 st", (char *)EVP
11a80 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 _MD_name(md), -1
11a90 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e );.../* Get Open
11aa0 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c SSL-specific ID,
11ab0 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a not IANA ID */.
11ac0 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 .LAPPEND_INT(int
11ad0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 erp, objPtr, "ci
11ae0 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 pher_id", (int)
11af0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 SSL_CIPHER_get_i
11b00 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a d(cipher));.../*
11b10 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65 Two-byte ID use
11b20 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f d in the TLS pro
11b30 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 tocol of the giv
11b40 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 en cipher */..LA
11b50 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
11b60 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f , objPtr, "proto
11b70 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 col_id", (int) S
11b80 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72 SL_CIPHER_get_pr
11b90 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 otocol_id(cipher
11ba0 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c ));.../* Textual
11bb0 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 description of
11bc0 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 the cipher */..i
11bd0 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 f (SSL_CIPHER_de
11be0 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 scription(cipher
11bf0 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 , buf, sizeof(bu
11c00 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 f)) != NULL) {..
11c10 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
11c20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11c30 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 "description", b
11c40 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 uf, -1);..}.
11c50 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f }.. /* Sessio
11c60 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 n info */. se
11c70 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f ssion = SSL_get_
11c80 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 session(ssl);.
11c90 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d if (session !=
11ca0 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 NULL) {..const
11cb0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 unsigned char *t
11cc0 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c icket;..size_t l
11cd0 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 en2;..unsigned i
11ce0 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 nt ulen;..const
11cf0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 unsigned char *s
11d00 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 ession_id, *prot
11d10 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 o;..unsigned cha
11d20 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 r buffer[SSL_MAX
11d30 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 _MASTER_KEY_LENG
11d40 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 TH];.../* Report
11d50 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 the selected pr
11d60 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 otocol as a resu
11d70 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e lt of the ALPN n
11d80 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 egotiation */..S
11d90 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
11da0 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 alpn_selected(se
11db0 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 ssion, &proto, &
11dc0 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f len2);..LAPPEND_
11dd0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11de0 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 tr, "alpn", (cha
11df0 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c r *) proto, (Tcl
11e00 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 _Size) len2);...
11e10 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 /* Report the se
11e20 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
11e30 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
11e40 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 he NPN negotiati
11e50 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 on */.#ifdef USE
11e60 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e _NPN..SSL_get0_n
11e70 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 ext_proto_negoti
11e80 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f ated(ssl, &proto
11e90 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 , &ulen);..LAPPE
11ea0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11eb0 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 bjPtr, "npn", (c
11ec0 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 har *) proto, (T
11ed0 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a cl_Size) ulen);.
11ee0 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 #endif.../* Resu
11ef0 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f mable session */
11f00 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
11f10 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11f20 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f resumable", SSL_
11f30 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d SESSION_is_resum
11f40 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a able(session));.
11f50 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 ../* Session sta
11f60 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 rt time (seconds
11f70 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f since epoch) */
11f80 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 ..LAPPEND_LONG(i
11f90 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11fa0 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c start_time", SSL
11fb0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d _SESSION_get_tim
11fc0 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f e(session));.../
11fd0 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 * Timeout value
11fe0 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 - SSL_CTX_get_ti
11ff0 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 meout (in second
12000 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c s) */..LAPPEND_L
12010 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ONG(interp, objP
12020 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 tr, "timeout", S
12030 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 SL_SESSION_get_t
12040 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 imeout(session))
12050 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 ;.../* Session i
12060 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 d - TLSv1.2 and
12070 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 below only */..s
12080 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f ession_id = SSL_
12090 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 SESSION_get_id(s
120a0 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a ession, &ulen);.
120b0 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
120c0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
120d0 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 "session_id", se
120e0 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 ssion_id, (Tcl_S
120f0 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a ize) ulen);.../*
12100 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 Session context
12110 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 */..session_id
12120 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
12130 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 t0_id_context(se
12140 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 ssion, &ulen);..
12150 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 LAPPEND_BARRAY(i
12160 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12170 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 session_context"
12180 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 , session_id, (T
12190 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a cl_Size) ulen);.
121a0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 ../* Session tic
121b0 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c ket - client onl
121c0 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f y */..SSL_SESSIO
121d0 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 N_get0_ticket(se
121e0 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
121f0 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 &len2);..LAPPEND
12200 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
12210 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
12220 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 _ticket", ticket
12230 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e , (Tcl_Size) len
12240 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 2);.../* Session
12250 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 ticket lifetime
12260 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 hint (in second
12270 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c s) */..LAPPEND_L
12280 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ONG(interp, objP
12290 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 tr, "lifetime",
122a0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
122b0 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f ticket_lifetime_
122c0 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a hint(session));.
122d0 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 ../* Ticket app
122e0 64 61 74 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e data */.#if OPEN
122f0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
12300 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
12310 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 ..SSL_SESSION_ge
12320 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 t0_ticket_appdat
12330 61 28 28 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a a((SSL_SESSION *
12340 29 20 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b ) session, &tick
12350 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 et, &len2);..LAP
12360 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 PEND_BARRAY(inte
12370 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 rp, objPtr, "tic
12380 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 ket_app_data", t
12390 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 icket, (Tcl_Size
123a0 29 20 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 66 0a ) len2);.#endif.
123b0 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 ../* Get master
123c0 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 key */..len2 = S
123d0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d SL_SESSION_get_m
123e0 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f aster_key(sessio
123f0 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d n, buffer, SSL_M
12400 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 AX_MASTER_KEY_LE
12410 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f NGTH);..LAPPEND_
12420 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f BARRAY(interp, o
12430 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b bjPtr, "master_k
12440 65 79 22 2c 20 62 75 66 66 65 72 2c 20 28 54 63 ey", buffer, (Tc
12450 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a l_Size) len2);..
12460 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 ./* Compression
12470 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 id */..unsigned
12480 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 int id = SSL_SES
12490 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 SION_get_compres
124a0 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 s_id(session);..
124b0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
124c0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d rp, objPtr, "com
124d0 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 pression_id", id
124e0 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a == 1 ? "zlib" :
124f0 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 "none", -1);.
12500 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 }.. /* Comp
12510 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a ression info */.
12520 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e if (ssl != N
12530 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 ULL) {.#ifdef HA
12540 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 VE_SSL_COMPRESSI
12550 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d ON..const COMP_M
12560 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 ETHOD *comp, *ex
12570 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f pn;..comp = SSL_
12580 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 get_current_comp
12590 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 ression(ssl);..e
125a0 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 xpn = SSL_get_cu
125b0 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 rrent_expansion(
125c0 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f ssl);...LAPPEND_
125d0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
125e0 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e tr, "compression
125f0 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f ", comp ? SSL_CO
12600 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 MP_get_name(comp
12610 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b ) : "none", -1);
12620 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
12630 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 terp, objPtr, "e
12640 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 xpansion", expn
12650 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e ? SSL_COMP_get_n
12660 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e ame(expn) : "non
12670 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 e", -1);.#else..
12680 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12690 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d rp, objPtr, "com
126a0 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 pression", "none
126b0 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ", -1);..LAPPEND
126c0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
126d0 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 Ptr, "expansion"
126e0 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 , "none", -1);.#
126f0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 endif. }..
12700 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 /* Server info
12710 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d */. {..long m
12720 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 ode = SSL_CTX_ge
12730 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f t_session_cache_
12740 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 mode(statePtr->c
12750 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b tx);..char *msg;
12760 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 ...if (mode & SS
12770 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 L_SESS_CACHE_OFF
12780 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 ) {.. msg = "
12790 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 off";..} else if
127a0 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
127b0 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 S_CACHE_CLIENT)
127c0 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c {.. msg = "cl
127d0 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 ient";..} else i
127e0 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 f (mode & SSL_SE
127f0 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 SS_CACHE_SERVER)
12800 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 {.. msg = "s
12810 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 erver";..} else
12820 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
12830 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 ESS_CACHE_BOTH)
12840 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f {.. msg = "bo
12850 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 th";..} else {..
12860 20 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f msg = "unkno
12870 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 wn";..}..LAPPEND
12880 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12890 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 Ptr, "session_ca
128a0 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 che_mode", msg,
128b0 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 -1);. }..
128c0 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 /* CA List */.
128d0 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 /* IF not a se
128e0 72 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 rver, same as SS
128f0 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c L_get0_peer_CA_l
12900 69 73 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 ist. If server s
12910 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 ame as SSL_CTX_g
12920 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
12930 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 t */. listPtr
12940 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
12950 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 j(0, NULL);.
12960 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 STACK_OF(X509_NA
12970 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 ME) *ca_list;.
12980 20 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d if ((ca_list =
12990 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f SSL_get_client_
129a0 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d CA_list(ssl)) !=
129b0 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 NULL) {..char b
129c0 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 uffer[BUFSIZ];..
129d0 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 for (int i = 0;
129e0 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 i < sk_X509_NAME
129f0 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 _num(ca_list); i
12a00 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f ++) {.. X509_
12a10 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f NAME *name = sk_
12a20 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 X509_NAME_value(
12a30 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 ca_list, i);..
12a40 20 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 if (name) {...
12a50 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e X509_NAME_onelin
12a60 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 e(name, buffer,
12a70 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c BUFSIZ);...Tcl_L
12a80 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
12a90 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
12aa0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
12ab0 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 ngObj(buffer, -1
12ac0 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 ));.. }..}.
12ad0 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f }. LAPPEND_
12ae0 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OBJ(interp, objP
12af0 74 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 tr, "caList", li
12b00 73 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 stPtr);. LAPP
12b10 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 END_INT(interp,
12b20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 objPtr, "caListC
12b30 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e ount", sk_X509_N
12b40 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 AME_num(ca_list)
12b50 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f );.. Tcl_SetO
12b60 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
12b70 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
12b80 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
12b90 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
12ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
12be0 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d VersionObjCmd --
12bf0 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 return version
12c00 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e string from Open
12c10 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c SSL.. *. * Resul
12c20 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
12c30 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
12c40 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
12c50 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
12c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ca0 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
12cb0 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 nt.VersionObjCmd
12cc0 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
12cd0 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
12ce0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
12cf0 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
12d00 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
12d10 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
12d20 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 tr;. (void) c
12d30 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 28 lientData;. (
12d40 76 6f 69 64 29 20 6f 62 6a 63 3b 0a 20 20 20 20 void) objc;.
12d50 28 76 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 (void) objv;..
12d60 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
12d70 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 d");.. objPtr
12d80 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 = Tcl_NewString
12d90 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 Obj(OPENSSL_VERS
12da0 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 ION_TEXT, -1);.
12db0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
12dc0 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
12dd0 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e tr);.. return
12de0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
12df0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
12e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e30 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 -----. *. * Misc
12e40 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 ObjCmd -- misc c
12e50 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 ommands. *. * Re
12e60 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
12e70 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
12e80 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
12e90 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
12ea0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
12eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ee0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
12ef0 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 c int.MiscObjCmd
12f00 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
12f10 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
12f20 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
12f30 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
12f40 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
12f50 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 static const
12f60 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b char *commands [
12f70 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 ] = { "req", "st
12f80 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 rreq", NULL };.
12f90 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 enum command
12fa0 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 { C_REQ, C_STRRE
12fb0 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 Q, C_DUMMY };.
12fc0 20 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a Tcl_Size cmd;.
12fd0 20 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 int isStr;.
12fe0 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 char buffer[1
12ff0 36 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 6384];. (void
13000 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
13010 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
13020 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
13030 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f bjc < 2) {..Tcl_
13040 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
13050 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 erp, 1, objv, "s
13060 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f ubcommand ?args?
13070 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
13080 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
13090 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 if (Tcl_GetInde
130a0 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c xFromObj(interp,
130b0 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e objv[1], comman
130c0 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 ds, "command", 0
130d0 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f , &cmd) != TCL_O
130e0 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
130f0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
13100 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 ERR_clear_err
13110 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 or();.. isStr
13120 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 = (cmd == C_STR
13130 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 REQ);. switch
13140 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 ((enum command)
13150 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f cmd) {..case C_
13160 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 REQ:..case C_STR
13170 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f REQ: {.. EVP_
13180 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b PKEY *pkey=NULL;
13190 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 .. X509 *cert
131a0 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 =NULL;.. X509
131b0 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c _NAME *name=NULL
131c0 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a ;.. Tcl_Obj *
131d0 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c *listv;.. Tcl
131e0 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 _Size listc;..
131f0 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 int i;... B
13200 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 IO *out=NULL;...
13210 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 char *k_C=""
13220 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 ,*k_ST="",*k_L="
13230 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d ",*k_O="",*k_OU=
13240 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 "",*k_CN="",*k_E
13250 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 mail="";.. ch
13260 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f ar *keyout,*pemo
13270 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e ut,*str;.. in
13280 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c t keysize,serial
13290 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 =0,days=365;..#i
132a0 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
132b0 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
132c0 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 00000L.. BIGN
132d0 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a UM *bne = NULL;.
132e0 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 . RSA *rsa =
132f0 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 NULL;.#else..
13300 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 EVP_PKEY_CTX *c
13310 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 tx = NULL;.#endi
13320 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a f... if ((obj
13330 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 c<5) || (objc>6)
13340 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e ) {...Tcl_WrongN
13350 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 umArgs(interp, 2
13360 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 , objv, "keysize
13370 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c keyfile certfil
13380 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 e ?info?");...re
13390 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
133a0 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
133b0 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
133c0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
133d0 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 2], &keysize) !=
133e0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 TCL_OK) {...ret
133f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
13400 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 }.. keyou
13410 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 t=Tcl_GetString(
13420 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 objv[3]);.. p
13430 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 emout=Tcl_GetStr
13440 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 ing(objv[4]);..
13450 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a if (isStr) {.
13460 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 ..Tcl_SetVar(int
13470 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 erp,keyout,"",0)
13480 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 ;...Tcl_SetVar(i
13490 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c nterp,pemout,"",
134a0 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 0);.. }...
134b0 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a if (objc>=6) {.
134c0 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 ..if (Tcl_ListOb
134d0 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 jGetElements(int
134e0 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c erp, objv[5], &l
134f0 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d istc, &listv) !=
13500 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 TCL_OK) {...
13510 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
13520 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c R;...}....if ((l
13530 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a istc%2) != 0) {.
13540 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 .. Tcl_SetRes
13550 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f ult(interp,"Info
13560 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 rmation list mus
13570 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 t have even numb
13580 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 er of arguments"
13590 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 ,NULL);... re
135a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
135b0 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 ..}...for (i=0;
135c0 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b i<listc; i+=2) {
135d0 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 ... str=Tcl_G
135e0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
135f0 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 ]);... if (st
13600 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 rcmp(str,"days")
13610 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 ==0) {....if (Tc
13620 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
13630 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 interp,listv[i+1
13640 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b ],&days)!=TCL_OK
13650 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 ).... return
13660 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
13670 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
13680 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 mp(str,"serial")
13690 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 ==0) {....if (Tc
136a0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
136b0 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 interp,listv[i+1
136c0 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f ],&serial)!=TCL_
136d0 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 OK).... retur
136e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 n TCL_ERROR;...
136f0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
13700 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 rcmp(str,"C")==0
13710 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 ) {....k_C=Tcl_G
13720 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
13730 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
13740 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
13750 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 r,"ST")==0) {...
13760 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 .k_ST=Tcl_GetStr
13770 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
13780 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
13790 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 (strcmp(str,"L"
137a0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 )==0) {....k_L=T
137b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
137c0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
137d0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
137e0 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b p(str,"O")==0) {
137f0 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 ....k_O=Tcl_GetS
13800 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
13810 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
13820 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
13830 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f OU")==0) {....k_
13840 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 OU=Tcl_GetString
13850 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
13860 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
13870 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d trcmp(str,"CN")=
13880 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 =0) {....k_CN=Tc
13890 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
138a0 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
138b0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
138c0 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 (str,"Email")==0
138d0 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 ) {....k_Email=T
138e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
138f0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
13900 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f } else {....Tcl_
13910 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
13920 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 ,"Unknown parame
13930 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 ter",NULL);....r
13940 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
13950 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 ... }...}..
13960 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c }..#if OPENSSL
13970 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
13980 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 < 0x30000000L..
13990 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 bne = BN_new(
139a0 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 );.. rsa = RS
139b0 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b A_new();.. pk
139c0 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 ey = EVP_PKEY_ne
139d0 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e w();.. if (bn
139e0 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 e == NULL || rsa
139f0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 == NULL || pkey
13a00 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f == NULL || !BN_
13a10 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 set_word(bne,RSA
13a20 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 _F4) ||...!RSA_g
13a30 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 enerate_key_ex(r
13a40 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 sa, keysize, bne
13a50 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f , NULL) || !EVP_
13a60 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 PKEY_assign_RSA(
13a70 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 pkey, rsa)) {...
13a80 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
13a90 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 ey);.../* RSA_fr
13aa0 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 ee(rsa); freed b
13ab0 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 y EVP_PKEY_free
13ac0 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 */...BN_free(bne
13ad0 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b );.#else.. pk
13ae0 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e ey = EVP_RSA_gen
13af0 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 ((unsigned int)
13b00 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 keysize);.. c
13b10 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 tx = EVP_PKEY_CT
13b20 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 X_new(pkey,NULL)
13b30 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 ;.. if (pkey
13b40 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d == NULL || ctx =
13b50 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 = NULL || !EVP_P
13b60 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 KEY_keygen_init(
13b70 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 ctx) ||...!EVP_P
13b80 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f KEY_CTX_set_rsa_
13b90 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c keygen_bits(ctx,
13ba0 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 keysize) || !EV
13bb0 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 P_PKEY_keygen(ct
13bc0 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 x, &pkey)) {...E
13bd0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 VP_PKEY_free(pke
13be0 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 y);...EVP_PKEY_C
13bf0 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 TX_free(ctx);.#e
13c00 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 ndif...Tcl_SetRe
13c10 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 sult(interp,"Err
13c20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 or generating pr
13c30 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 ivate key",NULL)
13c40 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
13c50 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 RROR;.. } els
13c60 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 e {...if (isStr)
13c70 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
13c80 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 _new(BIO_s_mem()
13c90 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 );... PEM_wri
13ca0 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 te_bio_PrivateKe
13cb0 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c y(out,pkey,NULL,
13cc0 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c NULL,0,NULL,NULL
13cd0 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 );... i=BIO_r
13ce0 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 ead(out,buffer,s
13cf0 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 izeof(buffer)-1)
13d00 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 ;... i=(i<0)
13d10 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 ? 0 : i;... b
13d20 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 uffer[i]='\0';..
13d30 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 . Tcl_SetVar(
13d40 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 interp,keyout,bu
13d50 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 ffer,0);... B
13d60 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 IO_flush(out);..
13d70 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 . BIO_free(ou
13d80 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 t);...} else {..
13d90 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
13da0 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a (BIO_s_file());.
13db0 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f .. BIO_write_
13dc0 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 filename(out,key
13dd0 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f out);... PEM_
13de0 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 write_bio_Privat
13df0 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 eKey(out,pkey,NU
13e00 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e LL,NULL,0,NULL,N
13e10 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 ULL);... /* P
13e20 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 EM_write_bio_RSA
13e30 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 PrivateKey(out,
13e40 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c rsa, NULL, NULL,
13e50 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0, NULL, NULL);
13e60 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 */... BIO_fr
13e70 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 ee_all(out);.. .
13e80 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 }....if ((cert=X
13e90 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 509_new())==NULL
13ea0 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 ) {... Tcl_Se
13eb0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
13ec0 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 Error generating
13ed0 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 certificate req
13ee0 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 uest",NULL);...
13ef0 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 EVP_PKEY_free
13f00 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e (pkey);.#if OPEN
13f10 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
13f20 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
13f30 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 ... BN_free(b
13f40 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 ne);.#endif...
13f50 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 return(TCL_ERR
13f60 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 OR);...}....X509
13f70 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 _set_version(cer
13f80 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 t,2);...ASN1_INT
13f90 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 EGER_set(X509_ge
13fa0 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 t_serialNumber(c
13fb0 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 ert),serial);...
13fc0 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 X509_gmtime_adj(
13fd0 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 X509_getm_notBef
13fe0 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 ore(cert),0);...
13ff0 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 X509_gmtime_adj(
14000 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 X509_getm_notAft
14010 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 er(cert),(long)6
14020 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 0*60*24*days);..
14030 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 .X509_set_pubkey
14040 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 (cert,pkey);....
14050 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 name=X509_get_su
14060 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 bject_name(cert)
14070 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 ;....X509_NAME_a
14080 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
14090 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 name,"C", MBSTRI
140a0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
140b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
140c0 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b k_C, -1, -1, 0);
140d0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
140e0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
140f0 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e me,"ST", MBSTRIN
14100 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
14110 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
14120 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _ST, -1, -1, 0);
14130 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
14140 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
14150 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 me,"L", MBSTRING
14160 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
14170 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
14180 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 L, -1, -1, 0);..
14190 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
141a0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
141b0 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 ,"O", MBSTRING_A
141c0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
141d0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c ned char *) k_O,
141e0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
141f0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
14200 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
14210 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 OU", MBSTRING_AS
14220 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
14230 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c ed char *) k_OU,
14240 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
14250 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
14260 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
14270 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 CN", MBSTRING_AS
14280 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
14290 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c ed char *) k_CN,
142a0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
142b0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
142c0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
142d0 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 Email", MBSTRING
142e0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
142f0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
14300 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 Email, -1, -1, 0
14310 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 );....X509_set_s
14320 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 ubject_name(cert
14330 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 ,name);....if (!
14340 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 X509_sign(cert,p
14350 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 key,EVP_sha256()
14360 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f )) {... X509_
14370 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 free(cert);...
14380 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 EVP_PKEY_free(
14390 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 pkey);.#if OPENS
143a0 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
143b0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
143c0 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e .. BN_free(bn
143d0 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 e);.#endif...
143e0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
143f0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 nterp,"Error sig
14400 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ning certificate
14410 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 ",NULL);... r
14420 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
14430 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 ...}....if (isSt
14440 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 r) {... out=B
14450 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d IO_new(BIO_s_mem
14460 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ());... PEM_w
14470 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 rite_bio_X509(ou
14480 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 t,cert);... i
14490 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 =BIO_read(out,bu
144a0 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 ffer,sizeof(buff
144b0 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d er)-1);... i=
144c0 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 (i<0) ? 0 : i;..
144d0 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 . buffer[i]='
144e0 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 \0';... Tcl_S
144f0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d etVar(interp,pem
14500 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 out,buffer,0);..
14510 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f . BIO_flush(o
14520 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 ut);... BIO_f
14530 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c ree(out);...} el
14540 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 se {... out=B
14550 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c IO_new(BIO_s_fil
14560 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f e());... BIO_
14570 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f write_filename(o
14580 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 ut,pemout);...
14590 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
145a0 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a X509(out,cert);.
145b0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 .. BIO_free_a
145c0 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 ll(out);...}....
145d0 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b X509_free(cert);
145e0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
145f0 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e (pkey);.#if OPEN
14600 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
14610 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
14620 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b ...BN_free(bne);
14630 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 .#endif.. }..
14640 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 }..break;. de
14650 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 fault:..break;.
14660 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
14670 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a TCL_OK;.}.../***
14680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14690 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 */./* Init
146a0 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a */./*****
146b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
146c0 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
146d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
146e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
146f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
14710 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a Tls_Free --. *.
14720 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
14730 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e e cleans up when
14740 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
14750 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 sed channel. *.i
14760 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 s closed and its
14770 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
14780 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 falls below 1.
14790 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
147a0 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .none. *. * Side
147b0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 effects:. *.Fre
147c0 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 es all the state
147d0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
147e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
147f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14810 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
14820 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 id.Tls_Free(char
14830 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 *blockPtr) {.
14840 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
14850 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f r = (State *)blo
14860 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 ckPtr;.. dpri
14870 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
14880 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 Tls_Clean(st
14890 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 atePtr);. ckf
148a0 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d ree(blockPtr);.}
148b0 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
148c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
148d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
148e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
148f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
14900 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 * Tls_Clean --.
14910 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
14920 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 ure cleans up wh
14930 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 en a SSL socket
14940 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a based channel. *
14950 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 .is closed and i
14960 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 ts reference cou
14970 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 nt falls below 1
14980 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 . This should.
14990 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 *.be called sync
149a0 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 hronously by the
149b0 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 CloseProc, not
149c0 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 in the. *.Eventu
149d0 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 allyFree callbac
149e0 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 k.. *. * Results
149f0 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.none. *. *
14a00 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
14a10 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 .Frees all the s
14a20 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d tate. *. *------
14a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
14a70 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e /.void Tls_Clean
14a80 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 (State *statePtr
14a90 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ) {. dprintf(
14aa0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
14ab0 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 /*. * we're
14ac0 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 assuming here th
14ad0 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d at we're single-
14ae0 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f threaded. */
14af0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
14b00 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c r->timer != (Tcl
14b10 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c _TimerToken) NUL
14b20 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 L) {..Tcl_Delete
14b30 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 TimerHandler(sta
14b40 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 tePtr->timer);..
14b50 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
14b60 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 = NULL;. }..
14b70 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
14b80 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 >protos) {..ckfr
14b90 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f ee(statePtr->pro
14ba0 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d tos);..statePtr-
14bb0 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a >protos = NULL;.
14bc0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
14bd0 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 atePtr->bio) {..
14be0 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c /* This will cal
14bf0 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 l SSL_shutdown.
14c00 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 Bug 1414045 */..
14c10 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 dprintf("BIO_fre
14c20 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 e_all(%p)", stat
14c30 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f ePtr->bio);..BIO
14c40 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 _free_all(stateP
14c50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 tr->bio);..state
14c60 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b Ptr->bio = NULL;
14c70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
14c80 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a tatePtr->ssl) {.
14c90 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 .dprintf("SSL_fr
14ca0 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 ee(%p)", statePt
14cb0 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 r->ssl);..SSL_fr
14cc0 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ee(statePtr->ssl
14cd0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 );..statePtr->ss
14ce0 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a l = NULL;. }.
14cf0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
14d00 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 ->ctx) {..SSL_CT
14d10 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d X_free(statePtr-
14d20 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 >ctx);..statePtr
14d30 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->ctx = NULL;.
14d40 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
14d50 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 ePtr->callback)
14d60 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f {..Tcl_DecrRefCo
14d70 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 unt(statePtr->ca
14d80 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 llback);..stateP
14d90 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e tr->callback = N
14da0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
14db0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 f (statePtr->pas
14dc0 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 sword) {..Tcl_De
14dd0 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
14de0 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a Ptr->password);.
14df0 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 .statePtr->passw
14e00 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ord = NULL;.
14e10 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
14e20 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c tr->vcmd) {..Tcl
14e30 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _DecrRefCount(st
14e40 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 atePtr->vcmd);..
14e50 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
14e60 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
14e70 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 dprintf("Retur
14e80 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 23 69 66 20 ning");.}...#if
14e90 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
14ea0 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 N > 8.#define MI
14eb0 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a N_VERSION "9.0".
14ec0 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 #else.#define MI
14ed0 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a N_VERSION "8.5".
14ee0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d #endif../*. *---
14ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14f30 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 . *. * Tls_Init
14f40 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 --. *. *.This is
14f50 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 a package initi
14f60 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 alization proced
14f70 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 ure, which is ca
14f80 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 lled. *.by Tcl w
14f90 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 hen this package
14fa0 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 is to be added
14fb0 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 to an interprete
14fc0 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
14fd0 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 : Ssl configure
14fe0 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a d and loaded. *.
14ff0 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
15000 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 . *. create the
15010 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 ssl command, ini
15020 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 tialize ssl cont
15030 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ext. *. *-------
15040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
15080 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 .DLLEXPORT int T
15090 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 ls_Init(Tcl_Inte
150a0 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 rp *interp) {.
150b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 const char tls
150c0 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 TclInitScript[]
150d0 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c = {.#include "tl
150e0 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 s.tcl.h"..0x00.
150f0 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e };.. dprin
15100 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 tf("Called");..#
15110 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 ifdef USE_TCL_ST
15120 55 42 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f UBS. if (Tcl_
15130 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 InitStubs(interp
15140 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 , MIN_VERSION, 0
15150 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 ) == NULL) {..re
15160 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
15170 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 }.#endif.
15180 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 if (Tcl_PkgRequ
15190 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c ire(interp, "Tcl
151a0 22 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 ", MIN_VERSION,
151b0 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 0) == NULL) {..r
151c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
151d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
151e0 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d TlsLibInit(0) !=
151f0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f TCL_OK) {..Tcl_
15200 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
15210 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 erp, "could not
15220 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c initialize SSL l
15230 69 62 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a ibrary", (char *
15240 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
15250 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
15260 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 }.. Tcl_Creat
15270 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
15280 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 rp, "tls::cipher
15290 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d s", CiphersObjCm
152a0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
152b0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
152c0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
152d0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
152e0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
152f0 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 rp, "tls::connec
15300 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f tion", Connectio
15310 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c nInfoObjCmd, (Cl
15320 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
15330 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
15340 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
15350 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
15360 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
15370 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 ls::handshake",
15380 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c HandshakeObjCmd,
15390 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
153a0 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
153b0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
153c0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
153d0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
153e0 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c , "tls::import",
153f0 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 ImportObjCmd, (
15400 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
15410 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15420 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
15430 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15440 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
15450 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c "tls::unimport",
15460 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c UnimportObjCmd,
15470 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
15480 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
15490 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
154a0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
154b0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
154c0 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c , "tls::status",
154d0 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 StatusObjCmd, (
154e0 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
154f0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15500 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
15510 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15520 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
15530 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 "tls::version",
15540 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 VersionObjCmd, (
15550 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
15560 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15570 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
15580 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15590 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
155a0 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 "tls::misc", Mis
155b0 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 cObjCmd, (Client
155c0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
155d0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
155e0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
155f0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
15600 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
15610 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 protocols", Prot
15620 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c ocolsObjCmd, (Cl
15630 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
15640 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
15650 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 oc *) NULL);..
15660 20 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a if (interp) {.
15670 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 .Tcl_Eval(interp
15680 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 , tlsTclInitScri
15690 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 pt);. }..
156a0 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 return Tcl_PkgPr
156b0 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50 41 ovide(interp, PA
156c0 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b CKAGE_NAME, PACK
156d0 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a AGE_VERSION);.}.
156e0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
156f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
15720 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 . *.Tls_SafeInit
15730 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d --. *. *.------
15740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 ----------*. *.S
15770 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 tandard procedur
15780 65 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c e required by 'l
15790 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c oad'.. *.Initial
157a0 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 izes this extens
157b0 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 ion for a safe i
157c0 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d nterpreter.. *.-
157d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
15800 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 . *. *.Side effe
15810 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 cts:. *..As of '
15820 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 Tls_Init'. *. *.
15830 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 Result:. *..A st
15840 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 andard Tcl error
15850 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d code.. *. *----
15860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15890 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 --*. */.DLLEXPOR
158a0 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e T int Tls_SafeIn
158b0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 it(Tcl_Interp *i
158c0 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 nterp) {. dpr
158d0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
158e0 20 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 return(Tls_I
158f0 6e 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a nit(interp));.}.
15900 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
15910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
15940 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d . *.TlsLibInit -
15950 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d -. *. *.--------
15960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15980 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 --------*. *.Ini
15990 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 tializes SSL lib
159a0 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 rary once per ap
159b0 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d plication. *.---
159c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
159f0 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 *. *.Side effect
15a00 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a s:. *..initializ
15a10 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 es SSL library.
15a20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 *. *.Result:. *.
15a30 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .none. *. *-----
15a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a70 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e -*. */.static in
15a80 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 t TlsLibInit(int
15a90 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b uninitialize) {
15aa0 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 . static int
15ab0 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b initialized = 0;
15ac0 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 . int status
15ad0 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 = TCL_OK;.#if de
15ae0 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
15af0 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
15b00 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 d(TCL_THREADS).
15b10 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f size_t num_lo
15b20 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 cks;.#endif..
15b30 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a if (uninitializ
15b40 65 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 e) {..if (!initi
15b50 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 alized) {.. d
15b60 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f printf("Asked to
15b70 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 uninitialize, b
15b80 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e ut we are not in
15b90 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 itialized");...
15ba0 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b return(TCL_OK
15bb0 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 );..}...dprintf(
15bc0 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 "Asked to uninit
15bd0 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 ialize");..#if d
15be0 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
15bf0 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
15c00 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
15c10 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 .Tcl_MutexLock(&
15c20 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 init_mx);...if (
15c30 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 locks) {.. fr
15c40 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 ee(locks);..
15c50 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 locks = NULL;..
15c60 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 locksCount =
15c70 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 0;..}.#endif..in
15c80 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a itialized = 0;..
15c90 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
15ca0 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
15cb0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
15cc0 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 ADS)..Tcl_MutexU
15cd0 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b nlock(&init_mx);
15ce0 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e .#endif...return
15cf0 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a (TCL_OK);. }.
15d00 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c . if (initial
15d10 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 ized) {..dprintf
15d20 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 ("Called, but us
15d30 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 ing cached value
15d40 22 29 3b 0a 09 72 65 74 75 72 6e 28 73 74 61 74 ");..return(stat
15d50 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 us);. }..
15d60 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
15d70 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 );..#if defined(
15d80 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
15d90 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
15da0 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c THREADS). Tcl
15db0 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 _MutexLock(&init
15dc0 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 _mx);.#endif.
15dd0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 initialized = 1
15de0 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
15df0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
15e00 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
15e10 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f HREADS). num_
15e20 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c locks = 1;. l
15e30 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 ocksCount = (int
15e40 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 ) num_locks;.
15e50 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 locks = malloc(
15e60 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a sizeof(*locks) *
15e70 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 num_locks);.
15e80 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 memset(locks, 0
15e90 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 , sizeof(*locks)
15ea0 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 * num_locks);.#
15eb0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e endif.. /* In
15ec0 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 itialize BOTH li
15ed0 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 bcrypto and libs
15ee0 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 sl. */. OPENS
15ef0 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e SL_init_ssl(OPEN
15f00 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 SSL_INIT_LOAD_SS
15f10 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e L_STRINGS | OPEN
15f20 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 SSL_INIT_LOAD_CR
15f30 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 YPTO_STRINGS..|
15f40 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 OPENSSL_INIT_ADD
15f50 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f _ALL_CIPHERS | O
15f60 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f PENSSL_INIT_ADD_
15f70 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c ALL_DIGESTS, NUL
15f80 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 L);.. BIO_new
15f90 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a _tcl(NULL, 0);..
15fa0 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 #if 0. /*.
15fb0 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 * XXX:TODO: Re
15fc0 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 move this code a
15fd0 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 nd replace it wi
15fe0 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 th a check.
15ff0 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 * for enough ent
16000 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 ropy and do not
16010 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 try to create ou
16020 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 r own. * ter
16030 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 rible entropy.
16040 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 */. /*.
16050 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e * Seed the ran
16060 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 dom number gener
16070 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 ator in the SSL
16080 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 library,. *
16090 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 using the do/whi
160a0 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 le construct bec
160b0 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 ause of the bug
160c0 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 note in the.
160d0 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 * OpenSSL FAQ a
160e0 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 t http://www.ope
160f0 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 nssl.org/support
16100 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a /faq.html#USER1.
16110 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 *. * Th
16120 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 e crux of the pr
16130 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f oblem is that So
16140 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 laris 7 does not
16150 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f have a. * /
16160 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 dev/random or /d
16170 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 ev/urandom devic
16180 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 e so it cannot g
16190 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 ather enough.
161a0 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d * entropy from
161b0 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 the RAND_seed()
161c0 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 when TLS initia
161d0 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 lizes and refuse
161e0 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 s. * to go f
161f0 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 urther. Earlier
16200 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e versions of Open
16210 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 SSL carried on r
16220 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 egardless..
16230 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e */. srand((un
16240 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 signed int) time
16250 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c ((time_t *) NULL
16260 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f ));. do {..fo
16270 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 r (i = 0; i < 16
16280 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e ; i++) {.. rn
16290 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 d_seed[i] = 1 +
162a0 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 (char) (255.0 *
162b0 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 rand()/(RAND_MAX
162c0 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 +1.0));..}..RAND
162d0 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 _seed(rnd_seed,
162e0 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 sizeof(rnd_seed)
162f0 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 );. } while (
16300 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d RAND_status() !=
16310 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 1);.#endif..#if
16320 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
16330 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
16340 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
16350 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f )..Tcl_MutexUnlo
16360 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 ck(&init_mx);.#e
16370 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e ndif.. return
16380 28 73 74 61 74 75 73 29 3b 0a 7d 0a (status);.}.