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: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29 #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74 r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69 _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 ar *key,...char
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 tes, int level,
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 mask))..#define
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74 /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65 L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23 "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72 endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64 ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64 _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65 slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69 ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42 g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74 ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20 o/cryptlib.c of
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70 OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74 enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63 t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53 .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65 SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45 ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a ADS */..../*****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
09a0: 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 ./* Callbacks
09b0: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 --------. *. * E
0a20: 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d val Callback Com
0a30: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 mand --. *. *.Ev
0a40: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
0a50: 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e and and catch an
0a60: 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 y errors. *. * R
0a70: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43 esults:. *.0 = C
0a80: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20 ommand returned
0a90: 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74 fail or eval ret
0aa0: 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a urned TCL_ERROR.
0ab0: 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 *.1 = Command r
0ac0: 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20 eturned success
0ad0: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64 or eval returned
0ae0: 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 TCL_OK. *. * Si
0af0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45 de effects:. *.E
0b00: 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63 valuates callbac
0b10: 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d k command. *. *-
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b60: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
0b70: 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54 t.EvalCallback(T
0b80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
0b90: 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 p, State *stateP
0ba0: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 tr, Tcl_Obj *cmd
0bb0: 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63 Ptr) {. int c
0bc0: 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 ode, ok = 0;..
0bd0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
0be0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
0bf0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 rp);. Tcl_Pre
0c00: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 serve((ClientDat
0c10: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
0c20: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
0c30: 61 63 6b 20 77 69 74 68 20 73 75 63 63 65 73 73 ack with success
0c40: 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75 72 for ok or retur
0c50: 6e 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c 20 n value 1, fail
0c60: 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65 74 for error or ret
0c70: 75 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a 20 urn value 0 */.
0c80: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 Tcl_ResetResu
0c90: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 lt(interp);.
0ca0: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f code = Tcl_EvalO
0cb0: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 bjEx(interp, cmd
0cc0: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c Ptr, TCL_EVAL_GL
0cd0: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 OBAL);. if (c
0ce0: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b ode == TCL_OK) {
0cf0: 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c ../* Check resul
0d00: 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c t for return val
0d10: 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a ue */..Tcl_Obj *
0d20: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 result = Tcl_Get
0d30: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
0d40: 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d );..if (result =
0d50: 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 = NULL || Tcl_Ge
0d60: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 tIntFromObj(inte
0d70: 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 rp, result, &ok)
0d80: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 != TCL_OK) {..
0d90: 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 20 ok = 1;..}.
0da0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 } else {../* E
0db0: 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 rror - reject th
0dc0: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f e certificate */
0dd0: 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f .#if (TCL_MAJOR_
0de0: 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 VERSION == 8) &&
0df0: 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 (TCL_MINOR_VERS
0e00: 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 ION < 6)..Tcl_Ba
0e10: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e ckgroundError(in
0e20: 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 terp);.#else..Tc
0e30: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 l_BackgroundExce
0e40: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f ption(interp, co
0e50: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 de);.#endif.
0e60: 7d 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 }.. Tcl_Relea
0e70: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
0e80: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 statePtr);. T
0e90: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
0ea0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
0eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a . return ok;.
0ec0: 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
0f10: 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 * InfoCallback
0f20: 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 --. *. *.Monitor
0f30: 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e s SSL connection
0f40: 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52 process. *. * R
0f50: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
0f60: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
0f70: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
0f80: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
0f90: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d). *. *--------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
0fe0: 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f static void.Info
0ff0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
1000: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 SL *ssl, int whe
1010: 72 65 2c 20 69 6e 74 20 72 65 74 29 20 7b 0a 20 re, int ret) {.
1020: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
1030: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr = (State*)SSL
1040: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 _get_app_data((S
1050: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 SL *)ssl);. T
1060: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
1070: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
1080: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
1090: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 j *cmdPtr;. c
10a0: 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72 har *major; char
10b0: 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 *minor;.. dp
10c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
10d0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
10e0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 tr->callback ==
10f0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a (Tcl_Obj*)NULL).
1100: 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 .return;.. if
1110: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 (where & SSL_CB
1120: 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54 _HANDSHAKE_START
1130: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 ) {..major = "ha
1140: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 ndshake";..minor
1150: 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20 = "start";.
1160: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 } else if (where
1170: 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 & SSL_CB_HANDSH
1180: 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a AKE_DONE) {..maj
1190: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 or = "handshake"
11a0: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 ;..minor = "done
11b0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ";. } else {.
11c0: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c .if (where & SSL
11d0: 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f _CB_ALERT)..majo
11e0: 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c r = "alert";..el
11f0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
1200: 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d SL_ST_CONNECT).m
1210: 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22 ajor = "connect"
1220: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1230: 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50 e & SSL_ST_ACCEP
1240: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63 T)..major = "acc
1250: 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 ept";..else.....
1260: 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e major = "unknown
1270: 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26 ";...if (where &
1280: 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d SSL_CB_READ)..m
1290: 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09 inor = "read";..
12a0: 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 else if (where &
12b0: 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09 SSL_CB_WRITE)..
12c0: 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b minor = "write";
12d0: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 ..else if (where
12e0: 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 & SSL_CB_LOOP).
12f0: 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b .minor = "loop";
1300: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 ..else if (where
1310: 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09 & SSL_CB_EXIT).
1320: 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b .minor = "exit";
1330: 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72 ..else.....minor
1340: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 = "unknown";.
1350: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
1360: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
1370: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 al */. cmdPtr
1380: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
1390: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
13a0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c llback);. Tcl
13b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
13c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
13d0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
13e0: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d ingObj("info", -
13f0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
1400: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1410: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
1420: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
1430: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
1440: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
1450: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
1460: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1470: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1480: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1490: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
14a0: 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20 major, -1));.
14b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
14c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
14d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
14e0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72 wStringObj(minor
14f0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20 , -1));.. if
1500: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1510: 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69 ALERT) {..Tcl_Li
1520: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1530: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1540: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
1550: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 tringObj(SSL_ale
1560: 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c rt_desc_string_l
1570: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a ong(ret), -1));.
1580: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
1590: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
15a0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
15b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
15c0: 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 SSL_alert_type_s
15d0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c tring_long(ret),
15e0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 -1));. } els
15f0: 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a e {..Tcl_ListObj
1600: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1610: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
1620: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
1630: 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 Obj(SSL_state_st
1640: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 ring_long(ssl),
1650: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
1660: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1670: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1680: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1690: 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 ("info", -1));.
16a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 }.. /* Eva
16b0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
16c0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
16d0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
16e0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
16f0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
1700: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
1710: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
1720: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a ount(cmdPtr);.}.
1730: 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
1780: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b MessageCallback
1790: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f --. *. *.Monito
17a0: 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 rs SSL protocol
17b0: 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52 messages. *. * R
17c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
17d0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
17e0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
17f0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
1800: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d). *. *--------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
1850: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f #ifndef OPENSSL_
1860: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 61 NO_SSL_TRACE.sta
1870: 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 65 tic void.Message
1880: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 69 Callback(int wri
1890: 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 6f te_p, int versio
18a0: 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f 74 n, int content_t
18b0: 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 ype, const void
18c0: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 6e *buf, size_t len
18d0: 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 64 , SSL *ssl, void
18e0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
18f0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
1900: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 State*)arg;.
1910: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
1920: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
1930: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
1940: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
1950: 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 65 char *ver, *type
1960: 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a ;. BIO *bio;.
1970: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b char buffer[
1980: 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 66 15000];. buff
1990: 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 er[0] = 0;..
19a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
19b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
19c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
19d0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
19e0: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 )..return;..
19f0: 73 77 69 74 63 68 28 76 65 72 73 69 6f 6e 29 20 switch(version)
1a00: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 {.#if OPENSSL_VE
1a10: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
1a20: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
1a30: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
1a40: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
1a50: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
1a60: 20 63 61 73 65 20 53 53 4c 32 5f 56 45 52 53 49 case SSL2_VERSI
1a70: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 ON:..ver = "SSLv
1a80: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 2";..break;.#end
1a90: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
1aa0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
1ab0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
1ac0: 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20 53 SSL3). case S
1ad0: 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 SL3_VERSION:..ve
1ae0: 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62 72 r = "SSLv3";..br
1af0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
1b00: 63 61 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f case TLS1_VERSIO
1b10: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 N:..ver = "TLSv1
1b20: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 ";..break;. c
1b30: 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 ase TLS1_1_VERSI
1b40: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 ON:..ver = "TLSv
1b50: 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 1.1";..break;.
1b60: 20 20 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 case TLS1_2_VE
1b70: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 RSION:..ver = "T
1b80: 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b LSv1.2";..break;
1b90: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33 . case TLS1_3
1ba0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d _VERSION:..ver =
1bb0: 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 "TLSv1.3";..bre
1bc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a ak;. case 0:.
1bd0: 20 20 20 20 20 20 20 20 76 65 72 20 3d 20 22 6e ver = "n
1be0: 6f 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 one";..break;.
1bf0: 20 20 64 65 66 61 75 6c 74 3a 0a 09 76 65 72 20 default:..ver
1c00: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72 = "unknown";..br
1c10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 eak;. }..
1c20: 73 77 69 74 63 68 20 28 63 6f 6e 74 65 6e 74 5f switch (content_
1c30: 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61 73 65 type) {. case
1c40: 20 53 53 4c 33 5f 52 54 5f 48 45 41 44 45 52 3a SSL3_RT_HEADER:
1c50: 0a 09 74 79 70 65 20 3d 20 22 48 65 61 64 65 72 ..type = "Header
1c60: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b ";. break
1c70: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ;. case SSL3_
1c80: 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 RT_INNER_CONTENT
1c90: 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 _TYPE:..type = "
1ca0: 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 Inner Content Ty
1cb0: 70 65 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 pe";. bre
1cc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c ak;. case SSL
1cd0: 33 5f 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 48 3_RT_CHANGE_CIPH
1ce0: 45 52 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 3d ER_SPEC:..type =
1cf0: 20 22 43 68 61 6e 67 65 20 43 69 70 68 65 72 22 "Change Cipher"
1d00: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b ;. break;
1d10: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1d20: 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d T_ALERT:..type =
1d30: 20 22 41 6c 65 72 74 22 3b 0a 20 20 20 20 20 20 "Alert";.
1d40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 break;. cas
1d50: 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48 e SSL3_RT_HANDSH
1d60: 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61 AKE:..type = "Ha
1d70: 6e 64 73 68 61 6b 65 22 3b 0a 20 20 20 20 20 20 ndshake";.
1d80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 break;. cas
1d90: 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 43 e SSL3_RT_APPLIC
1da0: 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 70 ATION_DATA:..typ
1db0: 65 20 3d 20 22 41 70 70 20 44 61 74 61 22 3b 0a e = "App Data";.
1dc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
1dd0: 20 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54 case DTLS1_RT
1de0: 5f 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70 _HEARTBEAT:..typ
1df0: 65 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b e = "Heartbeat";
1e00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a . break;.
1e10: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 79 default:..ty
1e20: 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a pe = "unknown";.
1e30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65 }.. /* Ne
1e40: 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 eds compile time
1e50: 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 2d option "enable-
1e60: 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a 20 ssl-trace". */.
1e70: 20 20 20 69 66 20 28 28 62 69 6f 20 3d 20 42 49 if ((bio = BI
1e80: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 O_new(BIO_s_mem(
1e90: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ))) != NULL) {..
1ea0: 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 63 int n;..SSL_trac
1eb0: 65 28 77 72 69 74 65 5f 70 2c 20 76 65 72 73 69 e(write_p, versi
1ec0: 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 on, content_type
1ed0: 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c , buf, len, ssl,
1ee0: 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a 09 (void *)bio);..
1ef0: 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f n = BIO_read(bio
1f00: 2c 20 62 75 66 66 65 72 2c 20 6d 69 6e 28 42 49 , buffer, min(BI
1f10: 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 2c 20 O_pending(bio),
1f20: 31 34 39 39 39 29 29 3b 0a 09 6e 20 3d 20 28 6e 14999));..n = (n
1f30: 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 <0) ? 0 : n;..bu
1f40: 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 ffer[n] = 0;..(v
1f50: 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 69 oid)BIO_flush(bi
1f60: 6f 29 3b 0a 20 09 42 49 4f 5f 66 72 65 65 28 62 o);. .BIO_free(b
1f70: 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 2f io);. }.. /
1f80: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 * Create command
1f90: 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 to eval */.
1fa0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
1fb0: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
1fc0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 tr->callback);.
1fd0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
1fe0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
1ff0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
2000: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 65 NewStringObj("me
2010: 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20 ssage", -1));.
2020: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2030: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2040: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
2050: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2060: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
2070: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
2080: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lf), -1));. T
2090: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
20a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
20b0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
20c0: 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65 5f 70 tringObj(write_p
20d0: 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52 65 63 ? "Sent" : "Rec
20e0: 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20 eived", -1));.
20f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2100: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2110: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2120: 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65 72 2c ewStringObj(ver,
2130: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
2140: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2150: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2160: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
2170: 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29 29 3b gObj(type, -1));
2180: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2190: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
21a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
21b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 l_NewStringObj(b
21c0: 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 uffer, -1));..
21d0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
21e0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
21f0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
2200: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
2210: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
2220: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
2230: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
2240: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
2250: 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c Ptr);.}.#endif..
2260: 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
22b0: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d VerifyCallback -
22c0: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 -. *. *.Monitors
22d0: 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65 SSL certificate
22e0: 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63 validation proc
22f0: 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 6f 6e ess. Used to con
2300: 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 68 61 trol the. *.beha
2310: 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 53 53 vior when the SS
2320: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 66 6c L_VERIFY_PEER fl
2330: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 ag is set. This
2340: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 68 65 is called. *.whe
2350: 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63 never a certific
2360: 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 ate is inspected
2370: 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 61 or decided inva
2380: 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f 72 0a lid. Called for.
2390: 20 2a 09 65 61 63 68 20 63 65 72 74 69 66 69 63 *.each certific
23a0: 61 74 65 20 69 6e 20 74 68 65 20 63 65 72 74 20 ate in the cert
23b0: 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 68 65 chain.. *. * Che
23c0: 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69 66 69 63 cks:. *.certific
23d0: 61 74 65 20 63 68 61 69 6e 20 69 73 20 63 68 65 ate chain is che
23e0: 63 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 cked starting wi
23f0: 74 68 20 74 68 65 20 64 65 65 70 65 73 74 20 6e th the deepest n
2400: 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 esting level. *.
2410: 20 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63 (the root CA c
2420: 65 72 74 69 66 69 63 61 74 65 29 20 61 6e 64 20 ertificate) and
2430: 77 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f worked upward to
2440: 20 74 68 65 20 70 65 65 72 27 73 20 63 65 72 74 the peer's cert
2450: 69 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 ificate.. *.All
2460: 73 69 67 6e 61 74 75 72 65 73 20 61 72 65 20 76 signatures are v
2470: 61 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69 alid, current ti
2480: 6d 65 20 69 73 20 77 69 74 68 69 6e 20 66 69 72 me is within fir
2490: 73 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69 st and last vali
24a0: 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68 dity time.. *.Ch
24b0: 65 63 6b 20 74 68 61 74 20 74 68 65 20 63 65 72 eck that the cer
24c0: 74 69 66 69 63 61 74 65 20 69 73 20 69 73 73 75 tificate is issu
24d0: 65 64 20 62 79 20 74 68 65 20 69 73 73 75 65 72 ed by the issuer
24e0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73 certificate iss
24f0: 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 uer.. *.Check th
2500: 65 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 e revocation sta
2510: 74 75 73 20 66 6f 72 20 65 61 63 68 20 63 65 72 tus for each cer
2520: 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65 tificate.. *.Che
2530: 63 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79 20 ck the validity
2540: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c of the given CRL
2550: 20 61 6e 64 20 74 68 65 20 63 65 72 74 20 72 65 and the cert re
2560: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e vocation status.
2570: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f . *.Check the po
2580: 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68 licies of all th
2590: 65 20 63 65 72 74 69 66 69 63 61 74 65 73 0a 20 e certificates.
25a0: 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65 *. * Args. *.pre
25b0: 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61 verify_ok indica
25c0: 74 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20 tes whether the
25d0: 63 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69 certificate veri
25e0: 66 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20 fication passed
25f0: 28 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20 (1) or not (0).
2600: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
2610: 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e .A callback boun
2620: 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 d to the socket
2630: 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f may return one o
2640: 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20 f:. *. 0...-
2650: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
2660: 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 is deemed invali
2670: 64 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63 61 d, send verifica
2680: 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69 tion. *.... fai
2690: 6c 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65 lure alert to pe
26a0: 65 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 er, and terminat
26b0: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 e handshake.. *.
26c0: 20 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 1...- the ce
26d0: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 rtificate is dee
26e0: 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69 med valid, conti
26f0: 6e 75 65 20 77 69 74 68 20 68 61 6e 64 73 68 61 nue with handsha
2700: 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 ke.. *. empty
2710: 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 string.- no cha
2720: 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 63 61 nge to certifica
2730: 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a te validation. *
2740: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
2750: 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 :. *.The err fie
2760: 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e ld of the curren
2770: 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 tly operative St
2780: 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 ate is set. *.
2790: 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 to a string desc
27a0: 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e ribing the SSL n
27b0: 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 egotiation failu
27c0: 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d re reason. *. *-
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 2d 2d 2d 2d ----------------
2810: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
2820: 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b t.VerifyCallback
2830: 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 (int ok, X509_ST
2840: 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a ORE_CTX *ctx) {.
2850: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
2860: 50 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a Ptr;. SSL *
2870: 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30 ssl..= (SSL*)X50
2880: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 9_STORE_CTX_get_
2890: 65 78 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c ex_data(ctx, SSL
28a0: 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 _get_ex_data_X50
28b0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 9_STORE_CTX_idx(
28c0: 29 29 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63 ));. X509 *c
28d0: 65 72 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 ert..= X509_STOR
28e0: 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e E_CTX_get_curren
28f0: 74 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20 t_cert(ctx);.
2900: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
2910: 09 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 .= (State*)SSL_g
2920: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29 et_app_data(ssl)
2930: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
2940: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
2950: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
2960: 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35 int depth..= X5
2970: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
2980: 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78 _error_depth(ctx
2990: 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09 );. int err..
29a0: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 = X509_STORE_CTX
29b0: 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b _get_error(ctx);
29c0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 .. dprintf("V
29d0: 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29 3b erify: %d", ok);
29e0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
29f0: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c tr->vcmd == (Tcl
2a00: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69 _Obj*)NULL) {..i
2a10: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c f (statePtr->vfl
2a20: 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59 ags & SSL_VERIFY
2a30: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 _FAIL_IF_NO_PEER
2a40: 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 72 65 _CERT) {.. re
2a50: 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 turn ok;..} else
2a60: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31 {.. return 1
2a70: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
2a80: 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c 4c if (cert == NULL
2a90: 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 || ssl == NULL)
2aa0: 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 {..return 0;.
2ab0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
2ac0: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
2ad0: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 al */. cmdPtr
2ae0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
2af0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 Obj(statePtr->vc
2b00: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 md);. Tcl_Lis
2b10: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2b20: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2b30: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
2b40: 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 bj("verify", -1)
2b50: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2b60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2b70: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
2b80: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 .Tcl_NewStringOb
2b90: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
2ba0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
2bb0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
2bc0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2bd0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2be0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2bf0: 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a IntObj(depth));.
2c00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2c10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2c20: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 erp, cmdPtr, Tls
2c30: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 _NewX509Obj(inte
2c40: 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 rp, cert));.
2c50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2c60: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2c70: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2c80: 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 IntObj(ok));.
2c90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2ca0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2cb0: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e , cmdPtr,..Tcl_N
2cc0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 ewStringObj((cha
2cd0: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 r*)X509_verify_c
2ce0: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 ert_error_string
2cf0: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 (err), -1));..
2d00: 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f /* Prevent I/O
2d10: 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 while callback
2d20: 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a is in progress *
2d30: 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 /. /* statePt
2d40: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
2d50: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f TCL_CALLBACK; */
2d60: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
2d70: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
2d80: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
2d90: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
2da0: 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c ok = EvalCal
2db0: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
2dc0: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b atePtr, cmdPtr);
2dd0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
2de0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a Count(cmdPtr);..
2df0: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d /* statePtr-
2e00: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f >flags &= ~(TLS_
2e10: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a TCL_CALLBACK); *
2e20: 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 /. return(ok)
2e30: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c ;./* By default,
2e40: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 leave verificat
2e50: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a ion unchanged. *
2e60: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d /.}.../*. *-----
2e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2eb0: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d *. * Tls_Error -
2ec0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 -. *. *.Calls ca
2ed0: 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74 llback with list
2ee0: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 of errors.. *.
2ef0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
2f00: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 *.The err field
2f10: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c of the currentl
2f20: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 y operative Stat
2f30: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f e is set. *. to
2f40: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 a string descri
2f50: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 bing the SSL neg
2f60: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 otiation failure
2f70: 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d reason. *. *---
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fc0: 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 . */.void.Tls_Er
2fd0: 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 ror(State *state
2fe0: 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20 Ptr, char *msg)
2ff0: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 {. Tcl_Interp
3000: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
3010: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
3020: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
3030: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 , *listPtr;.
3040: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 unsigned long er
3050: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d r;. statePtr-
3060: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 >err = msg;..
3070: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
3080: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
3090: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
30a0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
30b0: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 L)..return;..
30c0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
30d0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
30e0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
30f0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
3100: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
3110: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
3120: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3130: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
3140: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
3150: 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 error", -1));.
3160: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
3170: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3180: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
3190: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
31a0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
31b0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
31c0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 lf), -1));. i
31d0: 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20 f (msg != NULL)
31e0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
31f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3200: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
3210: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 NewStringObj(msg
3220: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 , -1));.. } e
3230: 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54 lse if ((msg = T
3240: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
3250: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 Obj(Tcl_GetObjRe
3260: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55 sult(interp), NU
3270: 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a LL)) != NULL) {.
3280: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
3290: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
32a0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
32b0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 wStringObj(msg,
32c0: 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 -1));.. } els
32d0: 65 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 e {..listPtr = T
32e0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
32f0: 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 NULL);..while (
3300: 28 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 (err = ERR_get_e
3310: 72 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a rror()) != 0) {.
3320: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
3330: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3340: 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 terp, listPtr, T
3350: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3360: 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 ERR_reason_error
3370: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 _string(err), -1
3380: 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 ));..}..Tcl_List
3390: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
33a0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
33b0: 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d listPtr);. }
33c0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
33d0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
33e0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
33f0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
3400: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b EvalCallback
3410: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
3420: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 r, cmdPtr);.
3430: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
3440: 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a (cmdPtr);.}.../*
3450: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3490: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 ------. *. * Key
34a0: 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 LogCallback --.
34b0: 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 *. *.Write recei
34c0: 76 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 ved key data to
34d0: 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 log file.. *. *
34e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
34f0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .none. *. *-----
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3510: 2d 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 0a 20 --------------.
3540: 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 */.void KeyLogCa
3550: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
3560: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 *ssl, const cha
3570: 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 r *line) {. c
3580: 68 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e har *str = geten
3590: 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 v(SSLKEYLOGFILE)
35a0: 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a ;. FILE *fd;.
35b0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
35c0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
35d0: 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f (str) {..fd = fo
35e0: 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 pen(str, "a");..
35f0: 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c fprintf(fd, "%s\
3600: 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 n",line);..fclos
3610: 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c e(fd);. }.}..
3620: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
3670: 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 Password Callbac
3680: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 k --. *. *.Calle
3690: 64 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 d when a passwor
36a0: 64 20 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 d for a private
36b0: 6b 65 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 key loading/stor
36c0: 69 6e 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 ing a PEM. *.cer
36d0: 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e tificate with en
36e0: 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 cryption. Evals
36f0: 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 callback script
3700: 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 and returns. *.t
3710: 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 he result as the
3720: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 password string
3730: 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 in buf.. *. * R
3740: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
3750: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
3760: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
3770: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
3780: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 d). *. * Returns
3790: 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 :. *.Password si
37a0: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d ze in bytes or -
37b0: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 1 for an error..
37c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
3810: 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 tic int.Password
3820: 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 Callback(char *b
3830: 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e uf, int size, in
3840: 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a t rwflag, void *
3850: 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 udata) {. Sta
3860: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 te *statePtr.= (
3870: 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a State *) udata;.
3880: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
3890: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
38a0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
38b0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
38c0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 int code;..
38d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
38e0: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 ed");.. /* If
38f0: 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 no callback, us
3900: 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 e default callba
3910: 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 ck */. if (st
3920: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
3930: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 == NULL) {..if
3940: 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 (Tcl_EvalEx(inte
3950: 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f rp, "tls::passwo
3960: 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 rd", -1, TCL_EVA
3970: 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c L_GLOBAL) == TCL
3980: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 _OK) {.. char
3990: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 *ret = (char *)
39a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 Tcl_GetStringRe
39b0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 sult(interp);..
39c0: 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 strncpy(buf,
39d0: 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 ret, (size_t) si
39e0: 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e ze);.. return
39f0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 (int)strlen(ret
3a00: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 );..} else {..
3a10: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a return -1;..}.
3a20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
3a30: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
3a40: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
3a50: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
3a60: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
3a70: 70 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 password);. T
3a80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3a90: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3aa0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
3ab0: 74 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f tringObj("passwo
3ac0: 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 rd", -1));. T
3ad0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3ae0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3af0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 cmdPtr, Tcl_NewI
3b00: 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a ntObj(rwflag));.
3b10: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
3b20: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3b30: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3b40: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 _NewIntObj(size)
3b50: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
3b60: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
3b70: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 ) interp);. T
3b80: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
3b90: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
3ba0: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c r);.. /* Eval
3bb0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
3bc0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
3bd0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
3be0: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 );. code = Tc
3bf0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 l_EvalObjEx(inte
3c00: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f rp, cmdPtr, TCL_
3c10: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 EVAL_GLOBAL);.
3c20: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 if (code != TC
3c30: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c L_OK) {.#if (TCL
3c40: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d _MAJOR_VERSION =
3c50: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e = 8) && (TCL_MIN
3c60: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a OR_VERSION < 6).
3c70: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
3c80: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 rror(interp);.#e
3c90: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f lse..Tcl_Backgro
3ca0: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 undException(int
3cb0: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 erp, code);.#end
3cc0: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c if. }. Tcl
3cd0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
3ce0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f dPtr);.. Tcl_
3cf0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
3d00: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
3d10: 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65 . /* If succe
3d20: 73 73 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b ssful, pass back
3d30: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 password string
3d40: 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66 and truncate if
3d50: 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 too long */.
3d60: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c if (code == TCL
3d70: 5f 4f 4b 29 20 7b 0a 09 69 6e 74 20 6c 65 6e 3b _OK) {..int len;
3d80: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 ..char *ret = (c
3d90: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 har *) Tcl_GetSt
3da0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f ringFromObj(Tcl_
3db0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 GetObjResult(int
3dc0: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 erp), &len);..if
3dd0: 20 28 6c 65 6e 20 3e 20 73 69 7a 65 2d 31 29 20 (len > size-1)
3de0: 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 73 69 7a {.. len = siz
3df0: 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 e-1;..}..strncpy
3e00: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 (buf, ret, (size
3e10: 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c _t) len);..buf[l
3e20: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c en] = '\0';..Tcl
3e30: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
3e40: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 Data) interp);..
3e50: 72 65 74 75 72 6e 28 6c 65 6e 29 3b 0a 20 20 20 return(len);.
3e60: 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 }. Tcl_Relea
3e70: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
3e80: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 interp);. ret
3e90: 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 urn -1;.}.../*.
3ea0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ee0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 ----. *. * Sessi
3ef0: 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 on Callback for
3f00: 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a Clients --. *. *
3f10: 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e .Called when a n
3f20: 65 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 ew session is ad
3f30: 64 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 ded to the cache
3f40: 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 . In TLS 1.3. *.
3f50: 74 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 this may be rece
3f60: 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 ived multiple ti
3f70: 6d 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61 mes after the ha
3f80: 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 ndshake. For. *.
3f90: 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 earlier versions
3fa0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 , this will be r
3fb0: 65 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 eceived during t
3fc0: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a he handshake.. *
3fd0: 09 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65 .This is the pre
3fe0: 66 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 ferred way to ob
3ff0: 74 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 tain a resumable
4000: 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 session.. *. *
4010: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 Results:. *.None
4020: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
4030: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 cts:. *.Calls ca
4040: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e llback (if defin
4050: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e ed). *. * Return
4060: 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 codes:. *.0 = e
4070: 72 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 rror where sessi
4080: 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 on will be immed
4090: 69 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 iately removed f
40a0: 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c rom the internal
40b0: 20 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 cache.. *.1 = s
40c0: 75 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70 uccess where app
40d0: 20 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e retains session
40e0: 20 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 in session cach
40f0: 65 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c e, and must call
4100: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 SSL_SESSION_fre
4110: 65 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 e() when done..
4120: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
4170: 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 ic int.SessionCa
4180: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
4190: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 *ssl, SSL_SESSI
41a0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 ON *session) {.
41b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
41c0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr = (State*)SSL
41d0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 _get_app_data((S
41e0: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 SL *)ssl);. T
41f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
4200: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
4210: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
4220: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 j *cmdPtr;. c
4230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
4240: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 ar *ticket;.
4250: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
4260: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b har *session_id;
4270: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 . size_t len2
4280: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 ;. unsigned i
4290: 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 nt ulen;.. dp
42a0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
42b0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
42c0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 tr->callback ==
42d0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 (Tcl_Obj*)NULL)
42e0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
42f0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
4300: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 } else if (ssl
4310: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
4320: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
4330: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a R_NOACK;. }..
4340: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f /* Create co
4350: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f mmand to eval */
4360: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
4370: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
4380: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
4390: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 k);. Tcl_List
43a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
43b0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
43c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
43d0: 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 j("session", -1)
43e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
43f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
4400: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
4410: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
4420: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 ngObj(Tcl_GetCha
4430: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
4440: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a r->self), -1));.
4450: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 . /* Session
4460: 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f id */. sessio
4470: 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 n_id = SSL_SESSI
4480: 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f ON_get_id(sessio
4490: 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 n, &ulen);. T
44a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
44b0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
44c0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 cmdPtr, Tcl_NewB
44d0: 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 yteArrayObj(sess
44e0: 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c ion_id, (int) ul
44f0: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 en));.. /* Se
4500: 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a ssion ticket */.
4510: 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f SSL_SESSION_
4520: 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 get0_ticket(sess
4530: 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
4540: 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 en2);. Tcl_Li
4550: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4560: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4570: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 r, Tcl_NewByteAr
4580: 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 rayObj(ticket, (
4590: 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 int) len2));..
45a0: 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 /* Lifetime -
45b0: 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 number of second
45c0: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 s */. Tcl_Lis
45d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
45e0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
45f0: 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 ,..Tcl_NewLongOb
4600: 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 j((long) SSL_SES
4610: 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f SION_get_ticket_
4620: 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 lifetime_hint(se
4630: 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f ssion)));.. /
4640: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
4650: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
4660: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
4670: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 cmdPtr);. Eva
4680: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
4690: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
46a0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 tr);. Tcl_Dec
46b0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
46c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b );. return 0;
46d0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4720: 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 . * ALPN Callbac
4730: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e k for Servers an
4740: 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 d NPN Callback f
4750: 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a or Clients --. *
4760: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74 . *.Perform prot
4770: 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 ocol (http/1.1,
4780: 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65 h2, h3, etc.) se
4790: 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a lection for the.
47a0: 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e *.incoming conn
47b0: 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 ection. Called a
47c0: 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 fter Hello and s
47d0: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e erver callbacks.
47e0: 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20 . *.Where 'out'
47f0: 69 73 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 is selected prot
4800: 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73 ocol and 'in' is
4810: 20 74 68 65 20 70 65 65 72 20 61 64 76 65 72 74 the peer advert
4820: 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a ised list.. *. *
4830: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
4840: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
4850: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 ects:. *.Calls c
4860: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 allback (if defi
4870: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ned). *. * Retur
4880: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f n codes:. *.SSL_
4890: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 TLSEXT_ERR_OK: A
48a0: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c LPN protocol sel
48b0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 ected. The conne
48c0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
48d0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
48e0: 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 RR_ALERT_FATAL:
48f0: 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 There was no ove
4900: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 68 65 rlap between the
4910: 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 client's. *.
4920: 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61 supplied list a
4930: 6e 64 20 74 68 65 20 73 65 72 76 65 72 20 63 6f nd the server co
4940: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 nfiguration. The
4950: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c connection will
4960: 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 be aborted.. *.
4970: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
4980: 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f OACK: ALPN proto
4990: 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 col not selected
49a0: 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 , e.g., because
49b0: 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 no ALPN. *. p
49c0: 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e rotocols are con
49d0: 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 figured for this
49e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 connection. The
49f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
4a00: 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d inues.. *. *----
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4a50: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 */.static int.A
4a60: 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 LPNCallback(cons
4a70: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 t SSL *ssl, cons
4a80: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
4a90: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 **out, unsigned
4aa0: 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 char *outlen,..c
4ab0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
4ac0: 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 ar *in, unsigned
4ad0: 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 int inlen, void
4ae0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
4af0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
4b00: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 State*)arg;.
4b10: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
4b20: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
4b30: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
4b40: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
4b50: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a int code, res;..
4b60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
4b70: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
4b80: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 ssl == NULL || a
4b90: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 rg == NULL) {..r
4ba0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
4bb0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
4bc0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 }.. /* Select
4bd0: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 protocol */.
4be0: 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f if (SSL_select_
4bf0: 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20 next_proto(out,
4c00: 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 outlen, statePtr
4c10: 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 ->protos, stateP
4c20: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a tr->protos_len,.
4c30: 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f .in, inlen) == O
4c40: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 PENSSL_NPN_NEGOT
4c50: 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74 IATED) {../* Mat
4c60: 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73 ch found */..res
4c70: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 = SSL_TLSEXT_ER
4c80: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 R_OK;. } else
4c90: 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e {../* OPENSSL_N
4ca0: 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20 PN_NO_OVERLAP =
4cb0: 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75 No overlap, so u
4cc0: 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 66 72 se first item fr
4cd0: 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63 om client protoc
4ce0: 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20 ol list */..res
4cf0: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 = SSL_TLSEXT_ERR
4d00: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
4d10: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
4d20: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 >vcmd == (Tcl_Ob
4d30: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 j*)NULL) {..retu
4d40: 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20 rn res;. }..
4d50: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
4d60: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a mand to eval */.
4d70: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
4d80: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
4d90: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 atePtr->vcmd);.
4da0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4db0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4dc0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
4dd0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c NewStringObj("al
4de0: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 pn", -1));. T
4df0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
4e00: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
4e10: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
4e20: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
4e30: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
4e40: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
4e50: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
4e60: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
4e70: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
4e80: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
4e90: 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 ngObj(*out, -1))
4ea0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
4eb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
4ec0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
4ed0: 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a cl_NewBooleanObj
4ee0: 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 (res == SSL_TLSE
4ef0: 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 XT_ERR_OK));..
4f00: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
4f10: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
4f20: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
4f30: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
4f40: 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c if ((code = Eval
4f50: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c Callback(interp,
4f60: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 statePtr, cmdPt
4f70: 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 r)) > 1) {..res
4f80: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 = SSL_TLSEXT_ERR
4f90: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c _NOACK;. } el
4fa0: 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 se if (code == 1
4fb0: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 ) {..res = SSL_T
4fc0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 LSEXT_ERR_OK;.
4fd0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 } else {..res
4fe0: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 = SSL_TLSEXT_ERR
4ff0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 _ALERT_FATAL;.
5000: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 }. Tcl_Decr
5010: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
5020: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 ;. return res
5030: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5080: 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 *. * Advertise P
5090: 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 rotocols Callbac
50a0: 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f k for Next Proto
50b0: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 col Negotiation
50c0: 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 (NPN) in ServerH
50d0: 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 ello --. *. *.ca
50e0: 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 lled when a TLS
50f0: 73 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c server needs a l
5100: 69 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 ist of supported
5110: 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e protocols for N
5120: 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 ext. *.Protocol
5130: 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a Negotiation.. *.
5140: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
5150: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
5160: 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 ffects:. *. * Re
5170: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 turn codes:. *.S
5180: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
5190: 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 : NPN protocol s
51a0: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e elected. The con
51b0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
51c0: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s.. *.SSL_TLSEXT
51d0: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 _ERR_NOACK: NPN
51e0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c protocol not sel
51f0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 ected. The conne
5200: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
5210: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 ---------. */.#i
5260: 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 fdef USE_NPN.sta
5270: 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 tic int.NPNCallb
5280: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
5290: 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e sl, const unsign
52a0: 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 ed char **out, u
52b0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 nsigned int *out
52c0: 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 len, void *arg)
52d0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
52e0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
52f0: 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 arg;.. dprint
5300: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
5310: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c if (ssl == NUL
5320: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c L || arg == NULL
5330: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
5340: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
5350: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
5360: 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 Set protocols li
5370: 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 st */. if (st
5380: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 atePtr->protos !
5390: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 = NULL) {..*out
53a0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 = statePtr->prot
53b0: 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 os;..*outlen = s
53c0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f tatePtr->protos_
53d0: 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 len;. } else
53e0: 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a {..*out = NULL;.
53f0: 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 .*outlen = 0;..r
5400: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
5410: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
5420: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c }. return SSL
5430: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
5440: 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a }.#endif.../*. *
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5490: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 ---. *. * SNI Ca
54a0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 llback for Serve
54b0: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 rs --. *. *.Perf
54c0: 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 orm server-side
54d0: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c SNI hostname sel
54e0: 65 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 ection after rec
54f0: 65 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e eiving SNI exten
5500: 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e sion. *.in Clien
5510: 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 t Hello. Called
5520: 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c after hello call
5530: 62 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 back but before
5540: 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 ALPN callback..
5550: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
5560: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
5570: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
5580: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
5590: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
55a0: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 eturn codes:. *.
55b0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
55c0: 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 K: SNI hostname
55d0: 69 73 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 is accepted. The
55e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
55f0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c inues.. *.SSL_TL
5600: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 SEXT_ERR_ALERT_F
5610: 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 ATAL: SNI hostna
5620: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 me is not accept
5630: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
5640: 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f on. *. is abo
5650: 72 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f rted. Default fo
5660: 72 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 r alert is SSL_A
5670: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e D_UNRECOGNIZED_N
5680: 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 AME.. *.SSL_TLSE
5690: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 XT_ERR_ALERT_WAR
56a0: 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 NING: SNI hostna
56b0: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 me is not accept
56c0: 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 ed, warning aler
56d0: 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e t. *. sent (n
56e0: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 ot supported in
56f0: 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f TLSv1.3). The co
5700: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
5710: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es.. *.SSL_TLSEX
5720: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 T_ERR_NOACK: SNI
5730: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 hostname is not
5740: 20 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f accepted and no
5750: 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a t acknowledged,.
5760: 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 *. e.g. if S
5770: 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 NI has not been
5780: 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 configured. The
5790: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
57a0: 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nues.. *. *-----
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
57f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e */.static int.SN
5800: 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 ICallback(const
5810: 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 SSL *ssl, int *a
5820: 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 lert, void *arg)
5830: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
5840: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a atePtr = (State*
5850: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e )arg;. Tcl_In
5860: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
5870: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
5880: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
5890: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f dPtr;. int co
58a0: 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 68 61 de, res;. cha
58b0: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 r *servername =
58c0: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e NULL;.. dprin
58d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
58e0: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 if (ssl == NU
58f0: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c LL || arg == NUL
5900: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
5910: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
5920: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a K;. }.. /*
5930: 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 Only works for
5940: 54 4c 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c TLS 1.2 and earl
5950: 69 65 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65 ier */. serve
5960: 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f rname = SSL_get_
5970: 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 servername(ssl,
5980: 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f TLSEXT_NAMETYPE_
5990: 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 host_name);.
59a0: 69 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 if (!servername
59b0: 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d || servername[0]
59c0: 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74 == '\0') {..ret
59d0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
59e0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
59f0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
5a00: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f r->vcmd == (Tcl_
5a10: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 Obj*)NULL) {..re
5a20: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
5a30: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 ERR_OK;. }..
5a40: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
5a50: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a mand to eval */.
5a60: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
5a70: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
5a80: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 atePtr->vcmd);.
5a90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5aa0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5ab0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
5ac0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e NewStringObj("sn
5ad0: 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 i", -1));. Tc
5ae0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
5af0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
5b00: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
5b10: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
5b20: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
5b30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
5b40: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
5b50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5b60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5b70: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
5b80: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 gObj(servername
5b90: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 , -1));.. /*
5ba0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
5bb0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
5bc0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
5bd0: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 dPtr);. if ((
5be0: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 code = EvalCallb
5bf0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
5c00: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e ePtr, cmdPtr)) >
5c10: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 1) {..res = SSL
5c20: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 _TLSEXT_ERR_ALER
5c30: 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 T_WARNING;..*ale
5c40: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 rt = SSL_AD_UNRE
5c50: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f COGNIZED_NAME; /
5c60: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 * Not supported
5c70: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 by TLS 1.3 */.
5c80: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 } else if (cod
5c90: 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d e == 1) {..res =
5ca0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5cb0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b OK;. } else {
5cc0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
5cd0: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 XT_ERR_ALERT_FAT
5ce0: 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 AL;..*alert = SS
5cf0: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 L_AD_UNRECOGNIZE
5d00: 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 D_NAME; /* Not s
5d10: 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 upported by TLS
5d20: 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 1.3 */. }.
5d30: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
5d40: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 t(cmdPtr);. r
5d50: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f eturn res;.}.../
5d60: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c -------. *. * Cl
5db0: 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 ientHello Handsh
5dc0: 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 ake Callback for
5dd0: 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 Servers --. *.
5de0: 2a 09 55 73 65 64 20 62 79 20 73 65 72 76 65 72 *.Used by server
5df0: 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 to examine the
5e00: 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 server name indi
5e10: 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 cation (SNI) ext
5e20: 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 ension. *.provid
5e30: 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 ed by the client
5e40: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c in order to sel
5e50: 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 ect an appropria
5e60: 74 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 te certificate t
5e70: 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e o. *.present, an
5e80: 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e d make other con
5e90: 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 figuration adjus
5ea0: 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 tments relevant
5eb0: 74 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 to that server.
5ec0: 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 *.name and its c
5ed0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 onfiguration. Th
5ee0: 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 is includes swap
5ef0: 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 ping out the ass
5f00: 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 ociated. *.SSL_C
5f10: 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 TX pointer, modi
5f20: 66 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 fying the server
5f30: 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 's list of permi
5f40: 74 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e tted TLS version
5f50: 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 s,. *.changing t
5f60: 68 65 20 73 65 72 76 65 72 27 73 20 63 69 70 68 he server's ciph
5f70: 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f er list in respo
5f80: 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e nse to the clien
5f90: 74 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c t's cipher list,
5fa0: 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 etc.. *.Called
5fb0: 62 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 before SNI and A
5fc0: 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 LPN callbacks..
5fd0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
5fe0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
5ff0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
6000: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
6010: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
6020: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 eturn codes:. *.
6030: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
6040: 5f 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 _RETRY: suspend
6050: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 the handshake, a
6060: 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 nd the handshake
6070: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 function will r
6080: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c eturn immediatel
6090: 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f y. *.SSL_CLIENT_
60a0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 HELLO_ERROR: fai
60b0: 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 lure, terminate
60c0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 connection. Set
60d0: 61 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 alert to error c
60e0: 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 ode.. *.SSL_CLIE
60f0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 NT_HELLO_SUCCESS
6100: 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d : success. *. *-
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6150: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
6160: 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 t.HelloCallback(
6170: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 const SSL *ssl,
6180: 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 int *alert, void
6190: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
61a0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
61b0: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 State*)arg;.
61c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
61d0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
61e0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
61f0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
6200: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 int code, res;.
6210: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 const char *s
6220: 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 ervername;. c
6230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
6240: 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f ar *p;. size_
6250: 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 t len, remaining
6260: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
6270: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
6280: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d f (statePtr->vcm
6290: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e d == (Tcl_Obj*)N
62a0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
62b0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
62c0: 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 SUCCESS;. } e
62d0: 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 28 lse if (ssl == (
62e0: 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c const SSL *)NULL
62f0: 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f 69 64 || arg == (void
6300: 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 *)NULL) {..retu
6310: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
6320: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
6330: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d .. /* Get nam
6340: 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 es */. if (!S
6350: 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f SL_client_hello_
6360: 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c get0_ext(ssl, TL
6370: 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65 72 SEXT_TYPE_server
6380: 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61 _name, &p, &rema
6390: 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e ining) || remain
63a0: 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c ing <= 2) {..*al
63b0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 ert = SSL_R_SSLV
63c0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 3_ALERT_ILLEGAL_
63d0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 PARAMETER;..retu
63e0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
63f0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
6400: 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 .. /* Extract
6410: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 the length of t
6420: 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 he supplied list
6430: 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 of names. */.
6440: 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 len = (*(p++)
6450: 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b << 8);. len +
6460: 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 = *(p++);. if
6470: 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d (len + 2 != rem
6480: 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 aining) {..*aler
6490: 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f t = SSL_R_SSLV3_
64a0: 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 ALERT_ILLEGAL_PA
64b0: 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e RAMETER;..return
64c0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
64d0: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 O_ERROR;. }.
64e0: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c remaining = l
64f0: 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 en;.. /* The
6500: 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63 65 list in practice
6510: 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e 67 only has a sing
6520: 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 le element, so w
6530: 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20 e only consider
6540: 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a the first one. *
6550: 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e /. if (remain
6560: 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b ing == 0 || *p++
6570: 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 != TLSEXT_NAMET
6580: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b YPE_host_name) {
6590: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 ..*alert = SSL_R
65a0: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 _TLSV1_ALERT_INT
65b0: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 ERNAL_ERROR;..re
65c0: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
65d0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
65e0: 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 }. remaining
65f0: 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 --;.. /* Now
6600: 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70 we can finally p
6610: 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 65 ull out the byte
6620: 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20 array with the
6630: 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e actual hostname.
6640: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 */. if (rema
6650: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a ining <= 2) {..*
6660: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c alert = SSL_R_TL
6670: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e SV1_ALERT_INTERN
6680: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 AL_ERROR;..retur
6690: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
66a0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
66b0: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b len = (*(p++
66c0: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e ) << 8);. len
66d0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 += *(p++);.
66e0: 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 if (len + 2 > re
66f0: 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 maining) {..*ale
6700: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 rt = SSL_R_TLSV1
6710: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f _ALERT_INTERNAL_
6720: 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 ERROR;..return S
6730: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
6740: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
6750: 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e remaining = len
6760: 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 ;. servername
6770: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a = (const char *
6780: 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 )p;.. /* Crea
6790: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
67a0: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 al */. cmdPtr
67b0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
67c0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 Obj(statePtr->vc
67d0: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 md);. Tcl_Lis
67e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
67f0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
6800: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
6810: 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 bj("hello", -1))
6820: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
6830: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
6840: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
6850: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
6860: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
6870: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
6880: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
6890: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
68a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
68b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
68c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 NewStringObj(ser
68d0: 76 65 72 6e 61 6d 65 2c 20 28 69 6e 74 29 20 6c vername, (int) l
68e0: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 en));.. /* Ev
68f0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
6900: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
6910: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
6920: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f tr);. if ((co
6930: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 de = EvalCallbac
6940: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
6950: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 tr, cmdPtr)) > 1
6960: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 ) {..res = SSL_C
6970: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 LIENT_HELLO_RETR
6980: 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c Y;..*alert = SSL
6990: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55 _R_TLSV1_ALERT_U
69a0: 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 SER_CANCELLED;.
69b0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f } else if (co
69c0: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 de == 1) {..res
69d0: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c = SSL_CLIENT_HEL
69e0: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 LO_SUCCESS;.
69f0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
6a00: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
6a10: 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 _ERROR;..*alert
6a20: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c = SSL_R_TLSV1_AL
6a30: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 ERT_INTERNAL_ERR
6a40: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 OR;. }. Tc
6a50: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
6a60: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 mdPtr);. retu
6a70: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a rn res;.}.../***
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6a90: 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 */./* Commands
6aa0: 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a */./*****
6ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
6ac0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
6b10: 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d CiphersObjCmd -
6b20: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 - list available
6b30: 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 ciphers. *. *.T
6b40: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
6b50: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 invoked to proc
6b60: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 ess the "tls::ci
6b70: 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 phers" command.
6b80: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 *.to list availa
6b90: 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 ble ciphers, bas
6ba0: 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c ed upon protocol
6bb0: 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a selected.. *. *
6bc0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
6bd0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
6be0: 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 lt list.. *. * S
6bf0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
6c00: 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 constructs and d
6c10: 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 estroys SSL cont
6c20: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d ext (CTX). *. *-
6c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c70: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f --. */.static co
6c80: 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 nst char *protoc
6c90: 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 ols[] = {.."ssl2
6ca0: 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 ", "ssl3", "tls1
6cb0: 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c ", "tls1.1", "tl
6cc0: 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c s1.2", "tls1.3",
6cd0: 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 NULL.};.enum pr
6ce0: 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 otocol {. TLS
6cf0: 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c _SSL2, TLS_SSL3,
6d00: 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 TLS_TLS1, TLS_T
6d10: 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f LS1_1, TLS_TLS1_
6d20: 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 2, TLS_TLS1_3, T
6d30: 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 LS_NONE.};..stat
6d40: 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 ic int.CiphersOb
6d50: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
6d60: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
6d70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
6d80: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
6d90: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
6da0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
6db0: 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 objPtr = NULL;.
6dc0: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 SSL_CTX *ctx
6dd0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 = NULL;. SSL
6de0: 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *ssl = NULL;.
6df0: 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 STACK_OF(SSL_CI
6e00: 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 PHER) *sk;. c
6e10: 68 61 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 46 har *cp, buf[BUF
6e20: 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e SIZ];. int in
6e30: 64 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 dex, verbose = 0
6e40: 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 , use_supported
6e50: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 = 0;. const S
6e60: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f SL_METHOD *metho
6e70: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 d;.. dprintf(
6e80: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
6e90: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c if ((objc < 2) |
6ea0: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a | (objc > 4)) {.
6eb0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
6ec0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
6ed0: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 v, "protocol ?ve
6ee0: 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 rbose? ?supporte
6ef0: 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 d?");..return TC
6f00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
6f10: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
6f20: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
6f30: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 p, objv[1], prot
6f40: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c ocols, "protocol
6f50: 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d ", 0, &index) !=
6f60: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
6f70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
6f80: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a }. if ((obj
6f90: 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 c > 2) && Tcl_Ge
6fa0: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 tBooleanFromObj(
6fb0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c interp, objv[2],
6fc0: 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 &verbose) != TC
6fd0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
6fe0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
6ff0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e . if ((objc >
7000: 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 3) && Tcl_GetBo
7010: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 oleanFromObj(int
7020: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 erp, objv[3], &u
7030: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d se_supported) !=
7040: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
7050: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7060: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
7070: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
7080: 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 switch ((enum p
7090: 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b rotocol)index) {
70a0: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a ..case TLS_SSL2:
70b0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
70c0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 SION_NUMBER >= 0
70d0: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 x10100000L || de
70e0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c fined(NO_SSL2) |
70f0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
7100: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 L_NO_SSL2)..
7110: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7120: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
7130: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
7140: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
7150: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
7160: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
7170: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
7180: 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d method = SSLv2_m
7190: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a ethod(); break;.
71a0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 #endif..case TLS
71b0: 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e _SSL3:.#if defin
71c0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 ed(NO_SSL3) || d
71d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
71e0: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e O_SSL3) || defin
71f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
7200: 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 L3_METHOD)..
7210: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7220: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
7230: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
7240: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
7250: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
7260: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
7270: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
7280: 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d method = SSLv3_m
7290: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a ethod(); break;.
72a0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 #endif..case TLS
72b0: 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e _TLS1:.#if defin
72c0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 ed(NO_TLS1) || d
72d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
72e0: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e O_TLS1) || defin
72f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7300: 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 S1_METHOD)..
7310: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7320: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
7330: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
7340: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
7350: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
7360: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
7370: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
7380: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d method = TLSv1_m
7390: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a ethod(); break;.
73a0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 #endif..case TLS
73b0: 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 _TLS1_1:.#if def
73c0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
73d0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
73e0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c SL_NO_TLS1_1) ||
73f0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7400: 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f _NO_TLS1_1_METHO
7410: 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 D).. Tcl_Appe
7420: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
7430: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 protocols[index
7440: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e ], ": protocol n
7450: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
7460: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
7470: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c n TCL_ERROR;.#el
7480: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d se.. method =
7490: 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 TLSv1_1_method(
74a0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
74b0: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f ..case TLS_TLS1_
74c0: 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 2:.#if defined(N
74d0: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 O_TLS1_2) || def
74e0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
74f0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e TLS1_2) || defin
7500: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7510: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 S1_2_METHOD)..
7520: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
7530: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f lt(interp, proto
7540: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 cols[index], ":
7550: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
7560: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
7570: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
7580: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
7590: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 method = TLSv1
75a0: 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 _2_method(); bre
75b0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
75c0: 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 TLS_TLS1_3:.#if
75d0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
75e0: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _3) || defined(O
75f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
7600: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
7610: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
7620: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
7630: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
7640: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
7650: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
7660: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
7670: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 e.. method =
7680: 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 TLS_method();..
7690: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d SSL_CTX_set_m
76a0: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e in_proto_version
76b0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 (ctx, TLS1_3_VER
76c0: 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f SION);.. SSL_
76d0: 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 CTX_set_max_prot
76e0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 o_version(ctx, T
76f0: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a LS1_3_VERSION);.
7700: 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 . break;.#end
7710: 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 if..default:..
7720: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d method = TLS_m
7730: 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 62 72 ethod();.. br
7740: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 eak;. }..
7750: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
7760: 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 w(method);. i
7770: 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 f (ctx == NULL)
7780: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
7790: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 ult(interp, REAS
77a0: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ON(), NULL);..re
77b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
77c0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d }.. ssl =
77d0: 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 SSL_new(ctx);.
77e0: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 if (ssl == NU
77f0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
7800: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
7810: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b REASON(), NULL);
7820: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
7830: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c tx);..return TCL
7840: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
7850: 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 /* Use list a
7860: 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c nd order as woul
7870: 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43 d be sent in a C
7880: 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c lientHello or al
7890: 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 l available ciph
78a0: 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 ers */. if (u
78b0: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a se_supported) {.
78c0: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 .sk = SSL_get1_s
78d0: 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73 upported_ciphers
78e0: 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 (ssl);. } els
78f0: 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 e {..sk = SSL_ge
7900: 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a t_ciphers(ssl);.
7910: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
7920: 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 k != NULL) {..if
7930: 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 (!verbose) {..
7940: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
7950: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
7960: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 LL);.. for (i
7970: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b nt i = 0; i < sk
7980: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 _SSL_CIPHER_num(
7990: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f sk); i++) {...co
79a0: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a nst SSL_CIPHER *
79b0: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 c = sk_SSL_CIPHE
79c0: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a R_value(sk, i);.
79d0: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 ..if (c == NULL)
79e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a continue;..../*
79f0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 cipher name or
7a00: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d (NONE) */...cp =
7a10: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
7a20: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 name(c);...if (c
7a30: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b p == NULL) break
7a40: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
7a50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
7a60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
7a70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 _NewStringObj(cp
7a80: 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a , -1));.. }..
7a90: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f .} else {.. o
7aa0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 bjPtr = Tcl_NewS
7ab0: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a tringObj("",0);.
7ac0: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 . for (int i
7ad0: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f = 0; i < sk_SSL_
7ae0: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 CIPHER_num(sk);
7af0: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 i++) {...const S
7b00: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 SL_CIPHER *c = s
7b10: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c k_SSL_CIPHER_val
7b20: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 ue(sk, i);...if
7b30: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 (c == NULL) cont
7b40: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 inue;..../* text
7b50: 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 ual description
7b60: 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f of the cipher */
7b70: 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 ...if (SSL_CIPHE
7b80: 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c R_description(c,
7b90: 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 buf, sizeof(buf
7ba0: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 )) != NULL) {...
7bb0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f Tcl_AppendTo
7bc0: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c Obj(objPtr, buf,
7bd0: 20 28 69 6e 74 29 20 73 74 72 6c 65 6e 28 62 75 (int) strlen(bu
7be0: 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a f));...} else {.
7bf0: 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
7c00: 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 ToObj(objPtr, "U
7c10: 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 NKNOWN\n", 8);..
7c20: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 .}.. }..}..if
7c30: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 (use_supported)
7c40: 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 {.. sk_SSL_C
7c50: 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a IPHER_free(sk);.
7c60: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c .}. }. SSL
7c70: 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 _free(ssl);.
7c80: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
7c90: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f );.. Tcl_SetO
7ca0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
7cb0: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
7cc0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
7cd0: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
7ce0: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a tData;.}.../*. *
7cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d30: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 ---. *. * Protoc
7d40: 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 olsObjCmd -- lis
7d50: 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 t available prot
7d60: 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 ocols. *. *.This
7d70: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
7d80: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 voked to process
7d90: 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f the "tls::proto
7da0: 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a cols" command. *
7db0: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 .to list availab
7dc0: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a le protocols.. *
7dd0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
7de0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
7df0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 esult list.. *.
7e00: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
7e10: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.none. *. *---
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 2d 2d 2d 2d 2d 2d 2d ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e60: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
7e70: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 ProtocolsObjCmd(
7e80: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
7e90: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
7ea0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
7eb0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
7ec0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
7ed0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
7ee0: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 r;.. dprintf(
7ef0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
7f00: 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b if (objc != 1) {
7f10: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
7f20: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
7f30: 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e jv, "");..return
7f40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
7f50: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
7f60: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f _error();.. o
7f70: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
7f80: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
7f90: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
7fa0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
7fb0: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
7fc0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
7fd0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
7fe0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
7ff0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
8000: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
8010: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
8020: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
8030: 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 cols[TLS_SSL2],
8040: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 -1));.#endif.#if
8050: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
8060: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
8070: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 PENSSL_NO_SSL3)
8080: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
8090: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 SSL_NO_SSL3_METH
80a0: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 OD). Tcl_List
80b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
80c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
80d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
80e0: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
80f0: 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e SSL3], -1));.#en
8100: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
8110: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 (NO_TLS1) && !de
8120: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8130: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
8140: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
8150: 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 S1_METHOD). T
8160: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
8170: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
8180: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
8190: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
81a0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 ls[TLS_TLS1], -1
81b0: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
81c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
81d0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
81e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
81f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8200: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f ENSSL_NO_TLS1_1_
8210: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f METHOD). Tcl_
8220: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
8230: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
8240: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
8250: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
8260: 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 TLS_TLS1_1], -1)
8270: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
8280: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
8290: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
82a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
82b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
82c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d NSSL_NO_TLS1_2_M
82d0: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c ETHOD). Tcl_L
82e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
82f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
8300: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
8310: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
8320: 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 LS_TLS1_2], -1))
8330: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
8340: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
8350: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
8360: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
8370: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
8380: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
8390: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
83a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
83b0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
83c0: 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 _3], -1));.#endi
83d0: 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 f.. Tcl_SetOb
83e0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
83f0: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
8400: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
8410: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
8420: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8470: 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 --. *. * Handsha
8480: 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 keObjCmd --. *.
8490: 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 *.This command i
84a0: 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 s used to verify
84b0: 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e whether the han
84c0: 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 dshake is comple
84d0: 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a te. *.or not.. *
84e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
84f0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
8500: 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 esult. 1 means h
8510: 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 andshake complet
8520: 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 e, 0 means pendi
8530: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ng.. *. * Side e
8540: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 ffects:. *.May f
8550: 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 orce SSL negotia
8560: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 tion to take pla
8570: 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ce.. *. *-------
8580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
85c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 .static int Hand
85d0: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 shakeObjCmd(Clie
85e0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
85f0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
8600: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
8610: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
8620: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
8630: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 l_Channel chan;
8640: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 /* The ch
8650: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
8660: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 ode on. */. S
8670: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 tate *statePtr;
8680: 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 /* client
8690: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
86a0: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e ocket */. con
86b0: 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 st char *errStr
86c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
86d0: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 ret = 1;. int
86e0: 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 err = 0;.. d
86f0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
8700: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
8710: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
8720: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
8730: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
8740: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 nel");..return(T
8750: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
8760: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f .. ERR_clear_
8770: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 error();.. ch
8780: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
8790: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f nel(interp, Tcl_
87a0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
87b0: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c (objv[1], NULL),
87c0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
87d0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
87e0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
87f0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
8800: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
8810: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
8820: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
8830: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
8840: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
8850: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
8860: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 );. if (Tcl_G
8870: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
8880: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
8890: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
88a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
88b0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
88c0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
88d0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
88e0: 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 ,.. "\": not
88f0: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 a TLS channel",
8900: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 NULL);..Tcl_SetE
8910: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
8920: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 "TLS", "HANDSHA
8930: 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 KE", "CHANNEL",
8940: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 "INVALID", (char
8950: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
8960: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
8970: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 }. statePt
8980: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c r = (State *)Tcl
8990: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
89a0: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a nceData(chan);..
89b0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
89c0: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 ling Tls_WaitFor
89d0: 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 Connect");. r
89e0: 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 et = Tls_WaitFor
89f0: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 Connect(statePtr
8a00: 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 , &err, 1);.
8a10: 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 dprintf("Tls_Wai
8a20: 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 tForConnect retu
8a30: 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b rned: %i", ret);
8a40: 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 .. if (ret <
8a50: 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 0 && ((statePtr-
8a60: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c >flags & TLS_TCL
8a70: 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 _ASYNC) && (err
8a80: 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 == EAGAIN))) {..
8a90: 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 dprintf("Async s
8aa0: 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 et and err = EAG
8ab0: 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b AIN");..ret = 0;
8ac0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
8ad0: 72 65 74 20 3c 20 30 29 20 7b 0a 09 65 72 72 53 ret < 0) {..errS
8ae0: 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 tr = statePtr->e
8af0: 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 rr;..Tcl_ResetRe
8b00: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 sult(interp);..T
8b10: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 cl_SetErrno(err)
8b20: 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 ;...if (!errStr
8b30: 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 || (*errStr == 0
8b40: 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 )) {.. errStr
8b50: 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f = Tcl_PosixErro
8b60: 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 r(interp);..}...
8b70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
8b80: 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 (interp, "handsh
8b90: 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 ake failed: ", e
8ba0: 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 rrStr, (char *)
8bb0: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 NULL);..Tcl_SetE
8bc0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
8bd0: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 "TLS", "HANDSHA
8be0: 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 KE", "FAILED", (
8bf0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
8c00: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
8c10: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 ng TCL_ERROR wit
8c20: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c h handshake fail
8c30: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 ed: %s", errStr)
8c40: 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 ;..return(TCL_ER
8c50: 52 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ROR);. } else
8c60: 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 {..if (err != 0
8c70: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 ) {.. dprintf
8c80: 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 ("Got an error w
8c90: 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 ith a completed
8ca0: 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d handshake: err =
8cb0: 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 %i", err);..}..
8cc0: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a ret = 1;. }..
8cd0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
8ce0: 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 urning TCL_OK wi
8cf0: 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c th data \"%i\"",
8d00: 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 ret);. Tcl_S
8d10: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
8d20: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 rp, Tcl_NewIntOb
8d30: 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 j(ret));. ret
8d40: 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c urn(TCL_OK);..cl
8d50: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
8d60: 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d tData;.}../*. *-
8d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8db0: 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f --. *. * ImportO
8dc0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 bjCmd --. *. *.T
8dd0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
8de0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 invoked to proc
8df0: 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f ess the "ssl" co
8e00: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 mmand. *. *.The
8e10: 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 ssl command push
8e20: 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e es SSL over a (n
8e30: 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 ewly connected)
8e40: 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a tcp socket. *. *
8e50: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
8e60: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
8e70: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
8e80: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d ffects:. *.May m
8e90: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 odify the behavi
8ea0: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e or of an IO chan
8eb0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nel.. *. *------
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
8f00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 /.static int.Imp
8f10: 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 ortObjCmd(Client
8f20: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
8f30: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
8f40: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
8f50: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
8f60: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
8f70: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f Channel chan;../
8f80: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
8f90: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 set a mode on.
8fa0: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 */. State *st
8fb0: 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 atePtr;../* clie
8fc0: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c nt state for ssl
8fd0: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 socket */. S
8fe0: 53 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20 20 SL_CTX *ctx.
8ff0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
9000: 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 Tcl_Obj *script.
9010: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
9020: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 Tcl_Obj *pas
9030: 73 77 6f 72 64 09 20 20 20 20 20 20 20 20 3d 20 sword. =
9040: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
9050: 6a 20 2a 76 63 6d 64 09 20 20 20 20 20 20 20 20 j *vcmd.
9060: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
9070: 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 DString upperCha
9080: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c nnelTranslation,
9090: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f upperChannelBlo
90a0: 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e cking, upperChan
90b0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 nelEncoding, upp
90c0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
90d0: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c ;. int idx, l
90e0: 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 en;. int flag
90f0: 73 09 09 20 20 20 20 20 20 20 20 3d 20 54 4c 53 s.. = TLS
9100: 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 _TCL_INIT;. i
9110: 6e 74 20 73 65 72 76 65 72 09 09 20 20 20 20 20 nt server..
9120: 20 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f = 0;./* is co
9130: 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e nnection incomin
9140: 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a g or outgoing? *
9150: 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 /. char *keyf
9160: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ile. = NU
9170: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 LL;. char *ce
9180: 72 74 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d rtfile. =
9190: 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 NULL;. unsig
91a0: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20 20 09 ned char *key .
91b0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
91c0: 6b 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 key_len
91d0: 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 = 0;.
91e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
91f0: 63 65 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e cert = N
9200: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 63 65 72 ULL;. int cer
9210: 74 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 t_len
9220: 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 68 = 0;. ch
9230: 61 72 20 2a 63 69 70 68 65 72 73 09 20 20 20 20 ar *ciphers.
9240: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
9250: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 char *ciphersuit
9260: 65 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c es. = NUL
9270: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 L;. char *CAf
9280: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ile. = NU
9290: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 LL;. char *CA
92a0: 64 69 72 09 09 20 20 20 20 20 20 20 20 3d 20 4e dir.. = N
92b0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 ULL;. char *D
92c0: 48 70 61 72 61 6d 73 09 20 20 20 20 20 20 20 20 Hparams.
92d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
92e0: 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20 20 20 *model..
92f0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
9300: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 20 20 r *servername.
9310: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a = NULL;./*
9320: 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 hostname for Se
9330: 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 rver Name Indica
9340: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 tion */. cons
9350: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
9360: 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 *session_id = NU
9370: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 LL;. Tcl_Obj
9380: 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 *alpn..= NULL;.
9390: 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c int ssl2 = 0,
93a0: 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 ssl3 = 0;. i
93b0: 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 nt tls1 = 1, tls
93c0: 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 1_1 = 1, tls1_2
93d0: 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b = 1, tls1_3 = 1;
93e0: 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d . int proto =
93f0: 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 0, level = -1;.
9400: 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d int verify =
9410: 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 0, require = 0,
9420: 20 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f request = 1, po
9430: 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 st_handshake = 0
9440: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
9450: 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 Called");..#if d
9460: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
9470: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
9480: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 SL_NO_TLS1).
9490: 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 tls1 = 0;.#endif
94a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
94b0: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
94c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
94d0: 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 S1_1). tls1_1
94e0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
94f0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
9500: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
9510: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
9520: 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 ). tls1_2 = 0
9530: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
9540: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
9550: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
9560: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
9570: 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 tls1_3 = 0;.#e
9580: 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 ndif.. if (ob
9590: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 jc < 2) {..Tcl_W
95a0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
95b0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
95c0: 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 annel ?options?"
95d0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
95e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
95f0: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 ERR_clear_error
9600: 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 ();.. chan =
9610: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
9620: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 nterp, Tcl_GetSt
9630: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
9640: 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c [1], NULL), NULL
9650: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 );. if (chan
9660: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
9670: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
9680: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
9690: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 }.. /* Make s
96a0: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f ure to operate o
96b0: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 n the topmost ch
96c0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 annel */. cha
96d0: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
96e0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 annel(chan);..
96f0: 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 for (idx = 2;
9700: 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b idx < objc; idx+
9710: 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 +) {..char *opt
9720: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
9730: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d romObj(objv[idx]
9740: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f , NULL);...if (o
9750: 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 pt[0] != '-')..
9760: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f break;...OPTO
9770: 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e BJ("-alpn", alpn
9780: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64 );..OPTSTR("-cad
9790: 69 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 ir", CAdir);..OP
97a0: 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 TSTR("-cafile",
97b0: 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42 59 54 CAfile);..OPTBYT
97c0: 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c E("-cert", cert,
97d0: 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 cert_len);..OPT
97e0: 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c STR("-certfile",
97f0: 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 certfile);..OPT
9800: 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63 STR("-cipher", c
9810: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 iphers);..OPTSTR
9820: 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70 ("-ciphers", cip
9830: 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 hers);..OPTSTR("
9840: 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 20 -ciphersuites",
9850: 63 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09 ciphersuites);..
9860: 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 OPTOBJ("-command
9870: 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 ", script);..OPT
9880: 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c STR("-dhparams",
9890: 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 DHparams);..OPT
98a0: 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 BYTE("-key", key
98b0: 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 , key_len);..OPT
98c0: 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 STR("-keyfile",
98d0: 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 keyfile);..OPTST
98e0: 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 R("-model", mode
98f0: 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 l);..OPTOBJ("-pa
9900: 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 ssword", passwor
9910: 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 d);..OPTBOOL("-p
9920: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 ost_handshake",
9930: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b post_handshake);
9940: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 ..OPTBOOL("-requ
9950: 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a est", request);.
9960: 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 .OPTBOOL("-requi
9970: 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 re", require);..
9980: 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74 OPTINT("-securit
9990: 79 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b ylevel", level);
99a0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 ..OPTBOOL("-serv
99b0: 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f er", server);..O
99c0: 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61 PTSTR("-serverna
99d0: 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 me", servername)
99e0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73 ;..OPTSTR("-sess
99f0: 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e ion_id", session
9a00: 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 _id);..OPTBOOL("
9a10: 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 -ssl2", ssl2);..
9a20: 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c OPTBOOL("-ssl3",
9a30: 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c ssl3);..OPTBOOL
9a40: 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b ("-tls1", tls1);
9a50: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 ..OPTBOOL("-tls1
9a60: 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f .1", tls1_1);..O
9a70: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 PTBOOL("-tls1.2"
9a80: 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 , tls1_2);..OPTB
9a90: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 OOL("-tls1.3", t
9aa0: 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 ls1_3);..OPTOBJ(
9ab0: 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e "-validatecomman
9ac0: 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f d", vcmd);..OPTO
9ad0: 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 BJ("-vcmd", vcmd
9ae0: 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 );...OPTBAD("opt
9af0: 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 ion", "-alpn, -c
9b00: 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d adir, -cafile, -
9b10: 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c cert, -certfile,
9b20: 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 -cipher, -ciphe
9b30: 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e rsuites, -comman
9b40: 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b d, -dhparams, -k
9b50: 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d ey, -keyfile, -m
9b60: 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c odel, -password,
9b70: 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 -post_handshake
9b80: 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 71 , -request, -req
9b90: 75 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79 6c uire, -securityl
9ba0: 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d evel, -server, -
9bb0: 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 servername, -ses
9bc0: 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 sion_id, -ssl2,
9bd0: 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 -ssl3, -tls1, -t
9be0: 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 ls1.1, -tls1.2,
9bf0: 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c -tls1.3, or -val
9c00: 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a idatecommand");.
9c10: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
9c20: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
9c30: 20 28 72 65 71 75 65 73 74 29 09 09 76 65 72 69 (request)..veri
9c40: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 fy |= SSL_VERIFY
9c50: 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 _CLIENT_ONCE | S
9c60: 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a SL_VERIFY_PEER;.
9c70: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 if (request
9c80: 26 26 20 72 65 71 75 69 72 65 29 09 76 65 72 69 && require).veri
9c90: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 fy |= SSL_VERIFY
9ca0: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 _FAIL_IF_NO_PEER
9cb0: 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 _CERT;. if (r
9cc0: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 equest && post_h
9cd0: 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 andshake).verify
9ce0: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 |= SSL_VERIFY_P
9cf0: 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 OST_HANDSHAKE;.
9d00: 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d if (verify ==
9d10: 20 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 0)..verify = SS
9d20: 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a L_VERIFY_NONE;..
9d30: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 proto |= (ss
9d40: 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 l2 ? TLS_PROTO_S
9d50: 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 SL2 : 0);. pr
9d60: 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 oto |= (ssl3 ? T
9d70: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 LS_PROTO_SSL3 :
9d80: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
9d90: 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f (tls1 ? TLS_PRO
9da0: 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 TO_TLS1 : 0);.
9db0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
9dc0: 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _1 ? TLS_PROTO_T
9dd0: 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 LS1_1 : 0);.
9de0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 proto |= (tls1_2
9df0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
9e00: 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 1_2 : 0);. pr
9e10: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f oto |= (tls1_3 ?
9e20: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
9e30: 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 3 : 0);.. /*
9e40: 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 reset to NULL if
9e50: 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 blank string pr
9e60: 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 ovided */. if
9e70: 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 (cert && !*cert
9e80: 29 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09 ).. cert.
9e90: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
9ea0: 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 if (key && !
9eb0: 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b *key).. k
9ec0: 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c ey. = NUL
9ed0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 L;. if (certf
9ee0: 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c ile && !*certfil
9ef0: 65 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66 e) certf
9f00: 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ile.= NULL;.
9f10: 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 if (keyfile && !
9f20: 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 *keyfile)..keyfi
9f30: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c le. = NUL
9f40: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 L;. if (ciphe
9f50: 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 rs && !*ciphers)
9f60: 09 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73 . ciphers
9f70: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
9f80: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 . if (ciphers
9f90: 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 uites && !*ciphe
9fa0: 72 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73 rsuites) ciphers
9fb0: 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b uites = NULL;
9fc0: 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 . if (CAfile
9fd0: 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 && !*CAfile).
9fe0: 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 CAfile.
9ff0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a000: 69 66 20 28 43 41 64 69 72 20 26 26 20 21 2a 43 if (CAdir && !*C
a010: 41 64 69 72 29 09 20 20 20 20 20 20 20 20 43 41 Adir). CA
a020: 64 69 72 09 20 20 20 20 20 20 20 20 3d 20 4e 55 dir. = NU
a030: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61 LL;. if (DHpa
a040: 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61 rams && !*DHpara
a050: 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70 61 ms). DHpa
a060: 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55 rams = NU
a070: 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 LL;.. /* new
a080: 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 SSL state */.
a090: 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 74 statePtr..= (St
a0a0: 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 ate *) ckalloc((
a0b0: 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 unsigned) sizeof
a0c0: 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 (State));. me
a0d0: 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 mset(statePtr, 0
a0e0: 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 , sizeof(State))
a0f0: 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d ;.. statePtr-
a100: 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a >flags.= flags;.
a110: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e statePtr->in
a120: 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 terp.= interp;.
a130: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c statePtr->vfl
a140: 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 ags.= verify;.
a150: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09 statePtr->err.
a160: 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c = "";.. /* al
a170: 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f locate script */
a180: 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29 . if (script)
a190: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 {..(void) Tcl_G
a1a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
a1b0: 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 script, &len);..
a1c0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 if (len) {..
a1d0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
a1e0: 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 ck = script;..
a1f0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
a200: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c nt(statePtr->cal
a210: 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d lback);..}. }
a220: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 .. /* allocat
a230: 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 e password */.
a240: 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20 if (password)
a250: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 {..(void) Tcl_Ge
a260: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 tStringFromObj(p
a270: 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a assword, &len);.
a280: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 .if (len) {..
a290: 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 statePtr->passw
a2a0: 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a ord = password;.
a2b0: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
a2c0: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
a2d0: 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 password);..}.
a2e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f }.. /* allo
a2f0: 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f cate validate co
a300: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 mmand */. if
a310: 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 (vcmd) {..(void)
a320: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
a330: 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e omObj(vcmd, &len
a340: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
a350: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63 statePtr->vc
a360: 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 md = vcmd;..
a370: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
a380: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
a390: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
a3a0: 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c if (model != NUL
a3b0: 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a L) {..int mode;.
a3c0: 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 ./* Get the "mod
a3d0: 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 el" context */..
a3e0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
a3f0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f annel(interp, mo
a400: 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 del, &mode);..if
a410: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
a420: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
a430: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
a440: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
a450: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
a460: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
a470: 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 .. * Make sure t
a480: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
a490: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
a4a0: 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 .. */..chan = Tc
a4b0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
a4c0: 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f chan);..if (Tcl_
a4d0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
a4e0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
a4f0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20 nelType()) {..
a500: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
a510: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 lt(interp, "bad
a520: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c channel \"", Tcl
a530: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
a540: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f chan),..."\": no
a550: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 t a TLS channel"
a560: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 , NULL);.. Tc
a570: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
a580: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
a590: 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c MPORT", "CHANNEL
a5a0: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 ", "INVALID", (c
a5b0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
a5c0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
a5d0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
a5e0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
a5f0: 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d ERROR;..}..ctx =
a600: 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 ((State *)Tcl_G
a610: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
a620: 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 eData(chan))->ct
a630: 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a x;. } else {.
a640: 09 69 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f .if ((ctx = CTX_
a650: 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20 73 Init(statePtr, s
a660: 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 erver, proto, ke
a670: 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c yfile, certfile,
a680: 20 6b 65 79 2c 20 63 65 72 74 2c 20 6b 65 79 5f key, cert, key_
a690: 6c 65 6e 2c 0a 09 20 20 20 20 63 65 72 74 5f 6c len,.. cert_l
a6a0: 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c en, CAdir, CAfil
a6b0: 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 e, ciphers, ciph
a6c0: 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c ersuites, level,
a6d0: 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e DHparams)) == N
a6e0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f ULL) {.. Tls_
a6f0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
a700: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
a710: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
a720: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 .}. }.. st
a730: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 atePtr->ctx = ct
a740: 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 x;.. /*.
a750: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b * We need to mak
a760: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 e sure that the
a770: 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e channel works in
a780: 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65 binary (for the
a790: 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69 . * encrypti
a7a0: 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f on not to get go
a7b0: 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a ofed up).. *
a7c0: 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f We only want to
a7d0: 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66 adjust the buff
a7e0: 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 ering in pre-v2
a7f0: 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a channels, where.
a800: 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e * each chan
a810: 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b nel in the stack
a820: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20 maintained its
a830: 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20 own buffers..
a840: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 */. Tcl_DSt
a850: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
a860: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
a870: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 n);. Tcl_DStr
a880: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
a890: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a annelBlocking);.
a8a0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
a8b0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
a8c0: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 lEOFChar);. T
a8d0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
a8e0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
a8f0: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 ding);. Tcl_G
a900: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
a910: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
a920: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 eofchar", &upper
a930: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
a940: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
a950: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
a960: 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 , chan, "-encodi
a970: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e ng", &upperChann
a980: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 elEncoding);.
a990: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
a9a0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
a9b0: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f an, "-translatio
a9c0: 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 n", &upperChanne
a9d0: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 lTranslation);.
a9e0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
a9f0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
aa00: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 chan, "-blocking
aa10: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
aa20: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 Blocking);. T
aa30: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
aa40: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
aa50: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
aa60: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 , "binary");.
aa70: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
aa80: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
aa90: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c an, "-blocking",
aaa0: 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 "true");. dp
aab0: 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 rintf("Consuming
aac0: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 Tcl channel %s"
aad0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
aae0: 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 Name(chan));.
aaf0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 statePtr->self
ab00: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e = Tcl_StackChann
ab10: 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 el(interp, Tls_C
ab20: 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 hannelType(), (C
ab30: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
ab40: 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 Ptr, (TCL_READAB
ab50: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c LE | TCL_WRITABL
ab60: 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 E), chan);. d
ab70: 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 printf("Created
ab80: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 channel named %s
ab90: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
aba0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
abb0: 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 self));. if (
abc0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
abd0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
abe0: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 NULL) {../*.. *
abf0: 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 No use of Tcl_Ev
ac00: 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 entuallyFree bec
ac10: 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 ause no possible
ac20: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 Tcl_Preserve...
ac30: 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 */..Tls_Free((c
ac40: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
ac50: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
ac60: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
ac70: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
ac80: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
ac90: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 tePtr->self, "-t
aca0: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c ranslation", Tcl
acb0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
acc0: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
acd0: 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 lation));. Tc
ace0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
acf0: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 on(interp, state
ad00: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 Ptr->self, "-enc
ad10: 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 oding", Tcl_DStr
ad20: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 ingValue(&upperC
ad30: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 hannelEncoding))
ad40: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
ad50: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
ad60: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
ad70: 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 f, "-eofchar", T
ad80: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
ad90: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
ada0: 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f Char));. Tcl_
adb0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
adc0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
add0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b r->self, "-block
ade0: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e ing", Tcl_DStrin
adf0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
ae00: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a nnelBlocking));.
ae10: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 . /*. * S
ae20: 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f SL Initializatio
ae30: 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 n. */. st
ae40: 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 atePtr->ssl = SS
ae50: 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e L_new(statePtr->
ae60: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 ctx);. if (!s
ae70: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a tatePtr->ssl) {.
ae80: 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 ./* SSL library
ae90: 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 error */..Tcl_Ap
aea0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
aeb0: 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e p, "couldn't con
aec0: 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 struct ssl sessi
aed0: 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c on: ", REASON(),
aee0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
aef0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
af00: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
af10: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
af20: 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22 "INIT", "FAILED"
af30: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
af40: 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 ;..Tls_Free((cha
af50: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
af60: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
af70: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
af80: 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 Set host server
af90: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 name */. if
afa0: 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 (servername) {..
afb0: 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76 /* Sets the serv
afc0: 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 er name indicati
afd0: 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 on (SNI) in Clie
afe0: 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f ntHello extensio
aff0: 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 n */../* Per RFC
b000: 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 6066, hostname
b010: 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 is a ASCII encod
b020: 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 ed string, thoug
b030: 68 20 52 46 43 20 34 33 36 36 20 73 61 79 73 20 h RFC 4366 says
b040: 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 UTF-8. */..if (!
b050: 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 SSL_set_tlsext_h
b060: 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 ost_name(statePt
b070: 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 r->ssl, serverna
b080: 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20 me) && require)
b090: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
b0a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
b0b0: 22 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f 73 "setting TLS hos
b0c0: 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e t name extension
b0d0: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 failed", (char
b0e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b0f0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
b100: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
b110: 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 IMPORT", "SNI",
b120: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
b130: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b140: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
b150: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
b160: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
b170: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 R;..}.../* Set h
b180: 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 ostname for peer
b190: 20 63 65 72 74 69 66 69 63 61 74 65 20 68 6f 73 certificate hos
b1a0: 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 69 tname verificati
b1b0: 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 on in clients...
b1c0: 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c Don't use SSL
b1d0: 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 _set1_host since
b1e0: 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 it has limitati
b1f0: 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 ons. */..if (!SS
b200: 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 L_add1_host(stat
b210: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 ePtr->ssl, serve
b220: 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 rname)) {.. T
b230: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
b240: 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 interp, "setting
b250: 20 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66 DNS host name f
b260: 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 ailed", (char *)
b270: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c NULL);.. Tcl
b280: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
b290: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
b2a0: 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 PORT", "HOSTNAME
b2b0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
b2c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b2d0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
b2e0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
b2f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
b300: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a RROR;..}. }..
b310: 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 /* Resume se
b320: 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 ssion id */.
b330: 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 if (session_id &
b340: 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e & strlen(session
b350: 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f _id) <= SSL_MAX_
b360: 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 SID_CTX_LENGTH)
b370: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 {../* SSL_set_se
b380: 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 ssion() */..if (
b390: 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 !SSL_SESSION_set
b3a0: 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 1_id_context(SSL
b3b0: 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 _get_session(sta
b3c0: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73 tePtr->ssl), ses
b3d0: 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e sion_id, (unsign
b3e0: 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 ed int) strlen(s
b3f0: 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 ession_id))) {..
b400: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
b410: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 sult(interp, "Re
b420: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 sume session id
b430: 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 22 ", session_id, "
b440: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 failed", (char
b450: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b460: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
b470: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
b480: 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f IMPORT", "SESSIO
b490: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 N", "FAILED", (c
b4a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 har *) NULL);.
b4b0: 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 Tls_Fr
b4c0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
b4d0: 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 ePtr);.
b4e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
b4f0: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ROR;..}. }..
b500: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70 70 /* Enable App
b510: 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20 50 lication-Layer P
b520: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 rotocol Negotiat
b530: 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61 72 ion. Examples ar
b540: 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68 74 e: http/1.0,..ht
b550: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 tp/1.1, h2, h3,
b560: 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33 2c ftp, imap, pop3,
b570: 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78 6d xmpp-client, xm
b580: 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 74 2c pp-server, mqtt,
b590: 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 irc, etc. */.
b5a0: 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f if (alpn) {../
b5b0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 * Convert a TCL
b5c0: 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 list into a prot
b5d0: 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 ocol-list in wir
b5e0: 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 e-format */..uns
b5f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 igned char *prot
b600: 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 os, *p;..unsigne
b610: 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e d int protos_len
b620: 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 = 0;..int i, le
b630: 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a n, cnt;..Tcl_Obj
b640: 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 **list;...if (T
b650: 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 cl_ListObjGetEle
b660: 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c ments(interp, al
b670: 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 pn, &cnt, &list)
b680: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 != TCL_OK) {..
b690: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
b6a0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
b6b0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
b6c0: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 ERROR;..}.../* D
b6d0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d etermine the mem
b6e0: 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 ory required for
b6f0: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 the protocol-li
b700: 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 st */..for (i =
b710: 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 0; i < cnt; i++)
b720: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 {.. Tcl_GetS
b730: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 tringFromObj(lis
b740: 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 t[i], &len);..
b750: 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 if (len > 255)
b760: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 {...Tcl_AppendR
b770: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 esult(interp, "A
b780: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d LPN protocol nam
b790: 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 e too long", (ch
b7a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 ar *) NULL);...T
b7b0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
b7c0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
b7d0: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c IMPORT", "ALPN",
b7e0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
b7f0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 *) NULL);...Tls
b800: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
b810: 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 tatePtr);...retu
b820: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
b830: 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 }.. protos
b840: 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e 3b _len += 1 + len;
b850: 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 ..}.../* Build t
b860: 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 he complete prot
b870: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 ocol-list */..pr
b880: 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 otos = ckalloc(p
b890: 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 rotos_len);../*
b8a0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 protocol-lists c
b8b0: 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20 onsist of 8-bit
b8c0: 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c length-prefixed,
b8d0: 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f byte strings */
b8e0: 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 70 20 ..for (i = 0, p
b8f0: 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63 6e = protos; i < cn
b900: 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63 t; i++) {.. c
b910: 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 har *str = Tcl_G
b920: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
b930: 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a list[i], &len);.
b940: 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e 3b . *p++ = len;
b950: 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 .. memcpy(p,
b960: 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20 20 str, len);..
b970: 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f p += len;..}.../
b980: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 * SSL_set_alpn_p
b990: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f rotos makes a co
b9a0: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 py of the protoc
b9b0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e ol-list */../* N
b9c0: 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 ote: This functi
b9d0: 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 65 ons reverses the
b9e0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f return value co
b9f0: 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 nvention */..if
ba00: 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 (SSL_set_alpn_pr
ba10: 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 otos(statePtr->s
ba20: 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 sl, protos, prot
ba30: 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 os_len)) {..
ba40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
ba50: 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65 64 (interp, "failed
ba60: 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70 72 6f to set ALPN pro
ba70: 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20 2a tocols", (char *
ba80: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 ) NULL);.. Tc
ba90: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
baa0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
bab0: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 MPORT", "ALPN",
bac0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
bad0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
bae0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
baf0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
bb00: 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b ckfree(protos);
bb10: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
bb20: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
bb30: 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 Store protocols
bb40: 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 list */..statePt
bb50: 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 r->protos = prot
bb60: 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 os;..statePtr->p
bb70: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 rotos_len = prot
bb80: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c os_len;. } el
bb90: 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e se {..statePtr->
bba0: 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 protos = NULL;..
bbb0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
bbc0: 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a _len = 0;. }.
bbd0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 . /*. * S
bbe0: 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 SL Callbacks.
bbf0: 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 */. SSL_set
bc00: 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 _app_data(stateP
bc10: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a tr->ssl, (void *
bc20: 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 )statePtr);./* p
bc30: 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 oint back to us
bc40: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 */. SSL_set_v
bc50: 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e erify(statePtr->
bc60: 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 ssl, verify, Ver
bc70: 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 ifyCallback);.
bc80: 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 SSL_set_info_c
bc90: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 allback(statePtr
bca0: 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 ->ssl, InfoCallb
bcb0: 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 ack);.. /* Ca
bcc0: 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 llback for obser
bcd0: 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 ving protocol me
bce0: 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 ssages */.#ifnde
bcf0: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c f OPENSSL_NO_SSL
bd00: 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f _TRACE. /* vo
bd10: 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d id SSL_CTX_set_m
bd20: 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 sg_callback_arg(
bd30: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 statePtr->ctx, (
bd40: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
bd50: 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 ;. void SSL_C
bd60: 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 TX_set_msg_callb
bd70: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ack(statePtr->ct
bd80: 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 x, MessageCallba
bd90: 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f ck); */. SSL_
bda0: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
bdb0: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73 _arg(statePtr->s
bdc0: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 sl, (void *)stat
bdd0: 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 ePtr);. SSL_s
bde0: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 et_msg_callback(
bdf0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d statePtr->ssl, M
be00: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b essageCallback);
be10: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
be20: 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e Create Tcl_Chann
be30: 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a el BIO Handler *
be40: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e /. statePtr->
be50: 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f p_bio.= BIO_new_
be60: 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 tcl(statePtr, BI
be70: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 O_NOCLOSE);.
be80: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 statePtr->bio.=
be90: 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 BIO_new(BIO_f_ss
bea0: 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 l());.. if (s
beb0: 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 erver) {../* Ser
bec0: 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f ver callbacks */
bed0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c ..SSL_CTX_set_tl
bee0: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f sext_servername_
bef0: 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 arg(statePtr->ct
bf00: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 x, (void *)state
bf10: 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 Ptr);..SSL_CTX_s
bf20: 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 et_tlsext_server
bf30: 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 name_callback(st
bf40: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 atePtr->ctx, SNI
bf50: 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f Callback);..SSL_
bf60: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 CTX_set_client_h
bf70: 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 ello_cb(statePtr
bf80: 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c ->ctx, HelloCall
bf90: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 back, (void *)st
bfa0: 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 atePtr);..if (st
bfb0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 atePtr->protos !
bfc0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 = NULL) {.. S
bfd0: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f SL_CTX_set_alpn_
bfe0: 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 select_cb(stateP
bff0: 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c tr->ctx, ALPNCal
c000: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
c010: 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 tatePtr);.#ifdef
c020: 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 USE_NPN.. if
c030: 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 (tls1_2 == 0 &&
c040: 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a tls1_3 == 0) {.
c050: 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 ..SSL_CTX_set_ne
c060: 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 xt_protos_advert
c070: 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 ised_cb(statePtr
c080: 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 ->ctx, NPNCallba
c090: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
c0a0: 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 ePtr);.. }.#e
c0b0: 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 ndif..}.../* Ena
c0c0: 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 ble server to se
c0d0: 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74 20 nd cert request
c0e0: 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 after handshake
c0f0: 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a (TLS 1.3 only) *
c100: 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 /../* A write op
c110: 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b eration must tak
c120: 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20 e place for the
c130: 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71 75 Certificate Requ
c140: 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65 est to be.. se
c150: 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 nt to the client
c160: 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f , this can be do
c170: 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 ne with SSL_do_h
c180: 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 andshake(). */..
c190: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 if (request && p
c1a0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 ost_handshake &&
c1b0: 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 tls1_3) {..
c1c0: 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e SSL_verify_clien
c1d0: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 t_post_handshake
c1e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
c1f0: 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 ..}.../* set aut
c200: 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 6c omatic curve sel
c210: 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 ection */..SSL_s
c220: 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61 et_ecdh_auto(sta
c230: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a tePtr->ssl, 1);.
c240: 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 ../* Set server
c250: 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 mode */..statePt
c260: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
c270: 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c TCL_SERVER;..SSL
c280: 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 _set_accept_stat
c290: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
c2a0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
c2b0: 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 /* Client callba
c2c0: 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 cks */.#ifdef US
c2d0: 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 E_NPN..if (state
c2e0: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e Ptr->protos != N
c2f0: 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d ULL && tls1_2 ==
c300: 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 0 && tls1_3 ==
c310: 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 0) {.. SSL_CT
c320: 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f X_set_next_proto
c330: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 _select_cb(state
c340: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 Ptr->ctx, ALPNCa
c350: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
c360: 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 statePtr);..}.#e
c370: 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f ndif.../* Sessio
c380: 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 n caching */..SS
c390: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f L_CTX_set_sessio
c3a0: 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 n_cache_mode(sta
c3b0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f tePtr->ctx, SSL_
c3c0: 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e SESS_CACHE_CLIEN
c3d0: 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 T | SSL_SESS_CAC
c3e0: 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 HE_NO_INTERNAL_S
c3f0: 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f TORE);..SSL_CTX_
c400: 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 sess_set_new_cb(
c410: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 statePtr->ctx, S
c420: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b essionCallback);
c430: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 .../* Enable pos
c440: 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 t handshake Auth
c450: 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e entication exten
c460: 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e sion. TLS 1.3 on
c470: 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 ly, not http/2.
c480: 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 */..if (request
c490: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b && post_handshak
c4a0: 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 e) {.. SSL_se
c4b0: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 t_post_handshake
c4c0: 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e _auth(statePtr->
c4d0: 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a ssl, 1);..}.../*
c4e0: 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 Set client mode
c4f0: 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e */..SSL_set_con
c500: 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 nect_state(state
c510: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
c520: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f . SSL_set_bio
c530: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c540: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c statePtr->p_bio,
c550: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
c560: 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 );. BIO_set_s
c570: 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f sl(statePtr->bio
c580: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c , statePtr->ssl,
c590: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a BIO_NOCLOSE);..
c5a0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e /*. * En
c5b0: 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 d of SSL Init.
c5c0: 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 */. dprint
c5d0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 f("Returning %s"
c5e0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
c5f0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
c600: 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 elf));. Tcl_S
c610: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
c620: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 (char *) Tcl_Ge
c630: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
c640: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 tePtr->self), TC
c650: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 L_VOLATILE);..
c660: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
c670: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
c680: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
c690: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
c6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c6d0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e -------. *. * Un
c6e0: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a importObjCmd --.
c6f0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
c700: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
c710: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f to remove the to
c720: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 pmost channel fi
c730: 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 lter.. *. * Resu
c740: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
c750: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
c760: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
c770: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 s:. *.May modify
c780: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 the behavior of
c790: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a an IO channel..
c7a0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
c7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
c7f0: 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 tic int.Unimport
c800: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
c810: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
c820: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
c830: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
c840: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
c850: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
c860: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 nnel chan;../* T
c870: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 he channel to se
c880: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a t a mode on. */.
c890: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
c8a0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
c8b0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
c8c0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
c8d0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
c8e0: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
c8f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
c900: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 }.. chan
c910: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
c920: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 (interp, Tcl_Get
c930: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c String(objv[1]),
c940: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
c950: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
c960: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
c970: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
c980: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
c990: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
c9a0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
c9b0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
c9c0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
c9d0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
c9e0: 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 ;.. if (Tcl_G
c9f0: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
ca00: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
ca10: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
ca20: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
ca30: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
ca40: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
ca50: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
ca60: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 ,..."\": not a T
ca70: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
ca80: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
ca90: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
caa0: 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f , "TLS", "UNIMPO
cab0: 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 RT", "CHANNEL",
cac0: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 "INVALID", (char
cad0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..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 69 66 20 28 54 63 6c }.. if (Tcl
cb00: 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 _UnstackChannel(
cb10: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d interp, chan) ==
cb20: 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 TCL_ERROR) {..r
cb30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
cb40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 . }.. retu
cb50: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
cb60: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
cb70: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
cb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbc0: 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 -. *. * CTX_Init
cbd0: 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 -- construct a
cbe0: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 SSL_CTX instance
cbf0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
cc00: 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 *.A valid SSL_C
cc10: 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e TX instance or N
cc20: 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ULL.. *. * Side
cc30: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 effects:. *.cons
cc40: 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 tructs SSL conte
cc50: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d xt (CTX). *. *--
cc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cca0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c -. */.static SSL
ccb0: 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 _CTX *.CTX_Init(
ccc0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c State *statePtr,
ccd0: 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 int isServer, i
cce0: 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a nt proto, char *
ccf0: 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 keyfile, char *c
cd00: 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 ertfile,. uns
cd10: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c igned char *key,
cd20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
cd30: 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 cert, int key_le
cd40: 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c n, int cert_len,
cd50: 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 char *CAdir,.
cd60: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 char *CAfile,
cd70: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 char *ciphers, c
cd80: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
cd90: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 s, int level, ch
cda0: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a ar *DHparams) {.
cdb0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
cdc0: 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 interp = statePt
cdd0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 r->interp;. S
cde0: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 SL_CTX *ctx = NU
cdf0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 LL;. Tcl_DStr
ce00: 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f ing ds;. Tcl_
ce10: 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 DString ds1;.
ce20: 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 int off = 0;.
ce30: 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 int load_priva
ce40: 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 te_key;. cons
ce50: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 t SSL_METHOD *me
ce60: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e thod;.. dprin
ce70: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
ce80: 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b if (!proto) {
ce90: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
cea0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 lt(interp, "no v
ceb0: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 alid protocol se
cec0: 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a lected", NULL);.
ced0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
cee0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 }.. /* crea
cef0: 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a te SSL context *
cf00: 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 /.#if OPENSSL_VE
cf10: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 RSION_NUMBER >=
cf20: 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 0x10100000L || d
cf30: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
cf40: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
cf50: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 SL_NO_SSL2).
cf60: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
cf70: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c o, TLS_PROTO_SSL
cf80: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 2)) {..Tcl_Appen
cf90: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
cfa0: 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e "SSL2 protocol n
cfb0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
cfc0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
cfd0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
cfe0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
cff0: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
d000: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
d010: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
d020: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
d030: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c TO_SSL3)) {..Tcl
d040: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d050: 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 terp, "SSL3 prot
d060: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
d070: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
d080: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
d090: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
d0a0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 ed(NO_TLS1) || d
d0b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d0c0: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 O_TLS1). if (
d0d0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
d0e0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 LS_PROTO_TLS1))
d0f0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
d100: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
d110: 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.0 protocol no
d120: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
d130: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
d140: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
d150: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
d160: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_1) || define
d170: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d180: 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 1_1). if (ENA
d190: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
d1a0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b PROTO_TLS1_1)) {
d1b0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
d1c0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 lt(interp, "TLS
d1d0: 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 1.1 protocol not
d1e0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
d1f0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
d200: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
d210: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
d220: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
d230: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d240: 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 _2). if (ENAB
d250: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
d260: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a ROTO_TLS1_2)) {.
d270: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
d280: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
d290: 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .2 protocol not
d2a0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
d2b0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
d2c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 . }.#endif.#i
d2d0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
d2e0: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_3) || defined(
d2f0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
d300: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 3). if (ENABL
d310: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d320: 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 OTO_TLS1_3)) {..
d330: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d340: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e (interp, "TLS 1.
d350: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 3 protocol not s
d360: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
d370: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
d380: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 }.#endif.
d390: 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 if (proto == 0)
d3a0: 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 {../* Use full
d3b0: 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 range */..SSL_CT
d3c0: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f X_set_min_proto_
d3d0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b version(ctx, 0);
d3e0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 ..SSL_CTX_set_ma
d3f0: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 x_proto_version(
d400: 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a ctx, 0);. }..
d410: 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 switch (prot
d420: 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c o) {.#if OPENSSL
d430: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
d440: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 < 0x10100000L &&
d450: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
d460: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
d470: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
d480: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
d490: 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 TO_SSL2:..method
d4a0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 = isServer ? SS
d4b0: 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f Lv2_server_metho
d4c0: 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 d() : SSLv2_clie
d4d0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
d4e0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
d4f0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 !defined(NO_SSL3
d500: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d510: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 ENSSL_NO_SSL3) &
d520: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d530: 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f SL_NO_SSL3_METHO
d540: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
d550: 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 PROTO_SSL3:..met
d560: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
d570: 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 SSLv3_server_me
d580: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 thod() : SSLv3_c
d590: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
d5a0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
d5b0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
d5c0: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
d5d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d5e0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d5f0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 ENSSL_NO_TLS1_ME
d600: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 THOD). case T
d610: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 LS_PROTO_TLS1:..
d620: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
d630: 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 r ? TLSv1_server
d640: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 _method() : TLSv
d650: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 1_client_method(
d660: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
d670: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
d680: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
d690: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d6a0: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
d6b0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d6c0: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_1_METHOD).
d6d0: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
d6e0: 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f O_TLS1_1:..metho
d6f0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
d700: 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 LSv1_1_server_me
d710: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 thod() : TLSv1_1
d720: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
d730: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
d740: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
d750: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
d760: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d770: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
d780: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d790: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 LS1_2_METHOD).
d7a0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
d7b0: 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 _TLS1_2:..method
d7c0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c = isServer ? TL
d7d0: 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 Sv1_2_server_met
d7e0: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f hod() : TLSv1_2_
d7f0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
d800: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
d810: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
d820: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
d830: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d840: 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 LS1_3). case
d850: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
d860: 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 :../* Use the ge
d870: 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 neric method and
d880: 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 constraint rang
d890: 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 e after context
d8a0: 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d is created */..m
d8b0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
d8c0: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 ? TLS_server_me
d8d0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 thod() : TLS_cli
d8e0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
d8f0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 reak;.#endif.
d900: 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 default:../* Ne
d910: 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20 gotiate highest
d920: 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c available SSL/TL
d930: 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 S version */..me
d940: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
d950: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 ? TLS_server_met
d960: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 hod() : TLS_clie
d970: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 nt_method();.#if
d980: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
d990: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
d9a0: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 0000L && !define
d9b0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 d(NO_SSL2) && !d
d9c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d9d0: 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 O_SSL2)..off |=
d9e0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
d9f0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 TLS_PROTO_SSL2)
da00: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ? 0 : SSL_OP_N
da10: 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 O_SSLv2);.#endif
da20: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
da30: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
da40: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
da50: 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 L3)..off |= (ENA
da60: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
da70: 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 PROTO_SSL3) ?
da80: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 0 : SSL_OP_NO_SS
da90: 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 Lv3);.#endif.#if
daa0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
dab0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
dac0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a PENSSL_NO_TLS1).
dad0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
dae0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
daf0: 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 O_TLS1) ? 0 :
db00: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 SSL_OP_NO_TLSv1)
db10: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
db20: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
db30: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
db40: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a NSSL_NO_TLS1_1).
db50: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
db60: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
db70: 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 O_TLS1_1) ? 0 :
db80: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f SSL_OP_NO_TLSv1_
db90: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 1);.#endif.#if !
dba0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
dbb0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
dbc0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
dbd0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
dbe0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
dbf0: 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 OTO_TLS1_2) ? 0
dc00: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
dc10: 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 1_2);.#endif.#if
dc20: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
dc30: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
dc40: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
dc50: 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 _3)..off |= (ENA
dc60: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
dc70: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 PROTO_TLS1_3) ?
dc80: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 0 : SSL_OP_NO_TL
dc90: 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 Sv1_3);.#endif..
dca0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 break;. }..
dcb0: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
dcc0: 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 r();.. ctx =
dcd0: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 SSL_CTX_new(meth
dce0: 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74 od);. if (!ct
dcf0: 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c x) {..return(NUL
dd00: 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 L);. }.. i
dd10: 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 f (getenv(SSLKEY
dd20: 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c LOGFILE)) {..SSL
dd30: 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f _CTX_set_keylog_
dd40: 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 callback(ctx, Ke
dd50: 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 yLogCallback);.
dd60: 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e }..#if !defin
dd70: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 ed(NO_TLS1_3) &&
dd80: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
dd90: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
dda0: 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c if (proto == TL
ddb0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 S_PROTO_TLS1_3)
ddc0: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d {..SSL_CTX_set_m
ddd0: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e in_proto_version
dde0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 (ctx, TLS1_3_VER
ddf0: 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f SION);..SSL_CTX_
de00: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 set_max_proto_ve
de10: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f rsion(ctx, TLS1_
de20: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 3_VERSION);.
de30: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a }.#endif.. /*
de40: 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 Force cipher se
de50: 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 lection order by
de60: 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 server */. i
de70: 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a f (!isServer) {.
de80: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 .SSL_CTX_set_opt
de90: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 ions(ctx, SSL_OP
dea0: 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 _CIPHER_SERVER_P
deb0: 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 REFERENCE);.
dec0: 7d 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 }.. SSL_CTX_s
ded0: 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c et_app_data(ctx,
dee0: 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b (void*)interp);
def0: 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 ./* remember the
df00: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a interpreter */.
df10: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
df20: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c options(ctx, SSL
df30: 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c _OP_ALL);./* all
df40: 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f SSL bug workaro
df50: 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f unds */. SSL_
df60: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
df70: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 ctx, SSL_OP_NO_C
df80: 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 OMPRESSION);./*
df90: 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 disable compress
dfa0: 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 ion even if supp
dfb0: 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c orted */. SSL
dfc0: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
dfd0: 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 (ctx, off);../*
dfe0: 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c disable protocol
dff0: 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 versions */.#if
e000: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
e010: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
e020: 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 1000L. SSL_CT
e030: 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 X_set_mode(ctx,
e040: 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 SSL_MODE_AUTO_RE
e050: 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 TRY);./* handle
e060: 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 new handshakes i
e070: 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e n background. On
e080: 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f by default in O
e090: 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f penSSL 1.1.1. */
e0a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f .#endif. SSL_
e0b0: 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 CTX_sess_set_cac
e0c0: 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 he_size(ctx, 128
e0d0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 );.. /* Set u
e0e0: 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 ser defined ciph
e0f0: 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 ers, cipher suit
e100: 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 es, and security
e110: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 level */. if
e120: 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 ((ciphers != NU
e130: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f LL) && !SSL_CTX_
e140: 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 set_cipher_list(
e150: 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b ctx, ciphers)) {
e160: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
e170: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 lt(interp, "Set
e180: 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 ciphers failed:
e190: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 No valid ciphers
e1a0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
e1b0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
e1c0: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e (ctx);..return N
e1d0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
e1e0: 66 20 28 28 63 69 70 68 65 72 73 75 69 74 65 73 f ((ciphersuites
e1f0: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 != NULL) && !SS
e200: 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 L_CTX_set_cipher
e210: 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 suites(ctx, ciph
e220: 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 ersuites)) {..Tc
e230: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e240: 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 nterp, "Set ciph
e250: 65 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 er suites failed
e260: 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 : No valid ciphe
e270: 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 rs", (char *) NU
e280: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 LL);..SSL_CTX_fr
e290: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e ee(ctx);..return
e2a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
e2b0: 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 /* Set securit
e2c0: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 y level */. i
e2d0: 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 f (level > -1 &&
e2e0: 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f level < 6) {../
e2f0: 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 * SSL_set_securi
e300: 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c ty_level */..SSL
e310: 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 _CTX_set_securit
e320: 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 y_level(ctx, lev
e330: 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 el);. }..
e340: 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c /* set some call
e350: 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c backs */. SSL
e360: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 _CTX_set_default
e370: 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 _passwd_cb(ctx,
e380: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b PasswordCallback
e390: 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 );. SSL_CTX_s
e3a0: 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 et_default_passw
e3b0: 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 d_cb_userdata(ct
e3c0: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 x, (void *)state
e3d0: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 Ptr);.. /* re
e3e0: 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c ad a Diffie-Hell
e3f0: 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 man parameters f
e400: 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 ile, or use the
e410: 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a built-in one */.
e420: 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e #ifdef OPENSSL_N
e430: 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 O_DH. if (DHp
e440: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b arams != NULL) {
e450: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
e460: 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 lt(interp, "DH p
e470: 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 arameter support
e480: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c not available",
e490: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
e4a0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
e4b0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
e4c0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 L;. }.#else.
e4d0: 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 {..DH* dh;..i
e4e0: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e f (DHparams != N
e4f0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 ULL) {.. BIO
e500: 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 *bio;.. Tcl_D
e510: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b StringInit(&ds);
e520: 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f .. bio = BIO_
e530: 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 new_file(F2N(DHp
e540: 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 arams, &ds), "r"
e550: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f );.. if (!bio
e560: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
e570: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 gFree(&ds);...Tc
e580: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e590: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f nterp, "Could no
e5a0: 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 t find DH parame
e5b0: 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 ters file", (cha
e5c0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
e5d0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
e5e0: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
e5f0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 . }... dh
e600: 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 = PEM_read_bio_D
e610: 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c Hparams(bio, NUL
e620: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a L, NULL, NULL);.
e630: 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 . BIO_free(bi
e640: 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 o);.. Tcl_DSt
e650: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
e660: 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 if (!dh) {..
e670: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
e680: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 t(interp, "Could
e690: 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 not read DH par
e6a0: 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c ameters from fil
e6b0: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c e", (char *) NUL
e6c0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
e6d0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
e6e0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 n NULL;.. }..
e6f0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 68 } else {.. dh
e700: 20 3d 20 67 65 74 5f 64 68 50 61 72 61 6d 73 28 = get_dhParams(
e710: 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 );..}..SSL_CTX_s
e720: 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 et_tmp_dh(ctx, d
e730: 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 29 h);..DH_free(dh)
e740: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a ;. }.#endif..
e750: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 /* set our c
e760: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 ertificate */.
e770: 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b load_private_k
e780: 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 ey = 0;. if (
e790: 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c certfile != NULL
e7a0: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 ) {..load_privat
e7b0: 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c e_key = 1;...Tcl
e7c0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
e7d0: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 );...if (SSL_CTX
e7e0: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
e7f0: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 _file(ctx, F2N(c
e800: 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 ertfile, &ds), S
e810: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 SL_FILETYPE_PEM)
e820: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 <= 0) {.. Tc
e830: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
e840: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 s);.. Tcl_App
e850: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
e860: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 , "unable to set
e870: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c certificate fil
e880: 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 e ", certfile, "
e890: 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 : ",.... REA
e8a0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
e8b0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
e8c0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
e8d0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
e8e0: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 ..}. } else i
e8f0: 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 f (cert != NULL)
e900: 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 {..load_private
e910: 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 _key = 1;..if (S
e920: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 SL_CTX_use_certi
e930: 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c ficate_ASN1(ctx,
e940: 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 cert_len, cert)
e950: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 <= 0) {.. Tc
e960: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
e970: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 s);.. Tcl_App
e980: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
e990: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 , "unable to set
e9a0: 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c certificate: ",
e9b0: 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 .... REASON(
e9c0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
e9d0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
e9e0: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 free(ctx);..
e9f0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a return NULL;..}.
ea00: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 } else {..ce
ea10: 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 rtfile = (char*)
ea20: 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 X509_get_default
ea30: 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 _cert_file();...
ea40: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
ea50: 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 certificate_file
ea60: 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 (ctx, certfile,
ea70: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
ea80: 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a ) <= 0) {.#if 0.
ea90: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
eaa0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
eab0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
eac0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
ead0: 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 to use default
eae0: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 certificate file
eaf0: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a ", certfile, ":
eb00: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 ",.... REAS
eb10: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
eb20: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
eb30: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
eb40: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
eb50: 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a #endif..}. }.
eb60: 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 . /* set our
eb70: 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 private key */.
eb80: 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 if (load_priv
eb90: 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 ate_key) {..if (
eba0: 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 keyfile == NULL
ebb0: 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 && key == NULL)
ebc0: 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d {.. keyfile =
ebd0: 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 certfile;..}...
ebe0: 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e if (keyfile != N
ebf0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 ULL) {.. /* g
ec00: 65 74 20 74 68 65 20 70 72 69 76 61 74 65 20 6b et the private k
ec10: 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 ey associated wi
ec20: 74 68 20 74 68 69 73 20 63 65 72 74 69 66 69 63 th this certific
ec30: 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 ate */.. if (
ec40: 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 keyfile == NULL)
ec50: 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 {...keyfile = c
ec60: 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a ertfile;.. }.
ec70: 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 .. if (SSL_CT
ec80: 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 X_use_PrivateKey
ec90: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b _file(ctx, F2N(k
eca0: 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 eyfile, &ds), SS
ecb0: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 L_FILETYPE_PEM)
ecc0: 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 <= 0) {...Tcl_DS
ecd0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
ece0: 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 ../* flush the p
ecf0: 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 assphrase which
ed00: 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e might be left in
ed10: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 the result */..
ed20: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
ed30: 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c nterp, NULL, TCL
ed40: 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f _STATIC);...Tcl_
ed50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
ed60: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
ed70: 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 set public key f
ed80: 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 ile ", keyfile,
ed90: 22 20 22 2c 0a 09 09 09 20 20 20 20 20 20 20 20 " ",....
eda0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
edb0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
edc0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
edd0: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
ede0: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 }.. Tcl_D
edf0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
ee00: 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 ...} else if (ke
ee10: 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 y != NULL) {..
ee20: 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 if (SSL_CTX_us
ee30: 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e e_PrivateKey_ASN
ee40: 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 1(EVP_PKEY_RSA,
ee50: 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e ctx, key,key_len
ee60: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f ) <= 0) {...Tcl_
ee70: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
ee80: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 ;.../* flush the
ee90: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 passphrase whic
eea0: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 h might be left
eeb0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f in the result */
eec0: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
eed0: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 (interp, NULL, T
eee0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 CL_STATIC);...Tc
eef0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
ef00: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
ef10: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 o set public key
ef20: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 : ", REASON(), (
ef30: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
ef40: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
ef50: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c x);...return NUL
ef60: 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a L;.. }..}../*
ef70: 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 Now we know tha
ef80: 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 t a key and cert
ef90: 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 have been set a
efa0: 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 gainst.. * the S
efb0: 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 SL context */..i
efc0: 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 f (!SSL_CTX_chec
efd0: 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 k_private_key(ct
efe0: 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 x)) {.. Tcl_A
eff0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
f000: 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79 rp, "private key
f010: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 does not match
f020: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
f030: 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 public key",....
f040: 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 (char *) NU
f050: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
f060: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
f070: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 return NULL;..
f080: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
f090: 53 65 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e Set verification
f0a0: 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f CAs */. Tcl_
f0b0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
f0c0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
f0d0: 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 gInit(&ds1);.
f0e0: 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 /* There is one
f0f0: 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f default directo
f100: 72 79 2c 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 ry, one default
f110: 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 65 20 64 65 file, and one de
f120: 66 61 75 6c 74 20 73 74 6f 72 65 2e 0a 09 54 68 fault store...Th
f130: 65 20 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 e default CA cer
f140: 74 69 66 69 63 61 74 65 73 20 64 69 72 65 63 74 tificates direct
f150: 6f 72 79 20 28 61 6e 64 20 64 65 66 61 75 6c 74 ory (and default
f160: 20 73 74 6f 72 65 29 20 69 73 20 69 6e 20 74 68 store) is in th
f170: 65 20 4f 70 65 6e 53 53 4c 0a 09 63 65 72 74 73 e OpenSSL..certs
f180: 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63 directory. It c
f190: 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e an be overridden
f1a0: 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 by the SSL_CERT
f1b0: 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68 _DIR env var. Th
f1c0: 65 0a 09 64 65 66 61 75 6c 74 20 43 41 20 63 65 e..default CA ce
f1d0: 72 74 69 66 69 63 61 74 65 73 20 66 69 6c 65 20 rtificates file
f1e0: 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74 2e 70 is called cert.p
f1f0: 65 6d 20 69 6e 20 74 68 65 20 64 65 66 61 75 6c em in the defaul
f200: 74 20 4f 70 65 6e 53 53 4c 0a 09 64 69 72 65 63 t OpenSSL..direc
f210: 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 62 65 20 tory. It can be
f220: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 overridden by th
f230: 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 e SSL_CERT_FILE
f240: 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 09 2f 2a 20 env var. */../*
f250: 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f int SSL_CTX_set_
f260: 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 64 default_verify_d
f270: 69 72 28 53 53 4c 5f 43 54 58 20 2a 63 74 78 29 ir(SSL_CTX *ctx)
f280: 20 61 6e 64 20 69 6e 74 20 53 53 4c 5f 43 54 58 and int SSL_CTX
f290: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 _set_default_ver
f2a0: 69 66 79 5f 66 69 6c 65 28 53 53 4c 5f 43 54 58 ify_file(SSL_CTX
f2b0: 20 2a 63 74 78 29 20 2a 2f 0a 20 20 20 20 69 66 *ctx) */. if
f2c0: 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f (!SSL_CTX_load_
f2d0: 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 verify_locations
f2e0: 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 (ctx, F2N(CAfile
f2f0: 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 64 69 , &ds), F2N(CAdi
f300: 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 r, &ds1)) ||..!S
f310: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 SL_CTX_set_defau
f320: 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 lt_verify_paths(
f330: 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 ctx)) {.#if 0..T
f340: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
f350: 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e ds);..Tcl_DStrin
f360: 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a gFree(&ds1);../*
f370: 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 Don't currently
f380: 20 63 61 72 65 20 69 66 20 74 68 69 73 20 66 61 care if this fa
f390: 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 ils */..Tcl_Appe
f3a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
f3b0: 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76 65 "SSL default ve
f3c0: 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c 20 52 rify paths: ", R
f3d0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
f3e0: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
f3f0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
f400: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 turn NULL;.#endi
f410: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 f. }.. /*
f420: 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f https://sourcefo
f430: 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 rge.net/p/tls/bu
f440: 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a gs/57/ */. /*
f450: 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 XXX:TODO: Let t
f460: 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 he user supply v
f470: 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 alues here inste
f480: 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 ad of something
f490: 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 that exists on t
f4a0: 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f he filesystem */
f4b0: 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 . if (CAfile
f4c0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53 54 41 43 != NULL) {..STAC
f4d0: 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 K_OF(X509_NAME)
f4e0: 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c *certNames = SSL
f4f0: 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f _load_client_CA_
f500: 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c file(F2N(CAfile,
f510: 20 26 64 73 29 29 3b 0a 09 69 66 20 28 63 65 72 &ds));..if (cer
f520: 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 tNames != NULL)
f530: 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 {.. SSL_CTX_s
f540: 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
f550: 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 t(ctx, certNames
f560: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
f570: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
f580: 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 (&ds);. Tcl_D
f590: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 StringFree(&ds1)
f5a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 ;. return ctx
f5b0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
f5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
f600: 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d *. * StatusObjCm
f610: 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 d -- return cert
f620: 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e ificate for conn
f630: 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 ected peer.. *.
f640: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
f650: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
f660: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
f670: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
f680: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
f690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
f6d0: 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 tatic int.Status
f6e0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
f6f0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
f700: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
f710: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
f720: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
f730: 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a ]) {. State *
f740: 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 statePtr;. X5
f750: 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 09 *peer;. Tc
f760: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 l_Obj *objPtr;.
f770: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
f780: 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 han;. char *c
f790: 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 hannelName, *cip
f7a0: 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f hers;. int mo
f7b0: 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e de;. const un
f7c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f signed char *pro
f7d0: 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 to;. unsigned
f7e0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e int len;. in
f7f0: 74 20 6e 69 64 3b 0a 0a 20 20 20 20 64 70 72 69 t nid;.. dpri
f800: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
f810: 20 20 20 20 73 77 69 74 63 68 20 28 6f 62 6a 63 switch (objc
f820: 29 20 7b 0a 09 63 61 73 65 20 32 3a 0a 09 20 20 ) {..case 2:..
f830: 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 channelName =
f840: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
f850: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 mObj(objv[1], NU
f860: 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b LL);.. break;
f870: 0a 0a 09 63 61 73 65 20 33 3a 0a 09 20 20 20 20 ...case 3:..
f880: 69 66 20 28 21 73 74 72 63 6d 70 20 28 54 63 6c if (!strcmp (Tcl
f890: 5f 47 65 74 53 74 72 69 6e 67 20 28 6f 62 6a 76 _GetString (objv
f8a0: 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 [1]), "-local"))
f8b0: 20 7b 0a 09 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 {...channelName
f8c0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
f8d0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c FromObj(objv[2],
f8e0: 20 4e 55 4c 4c 29 3b 0a 09 09 62 72 65 61 6b 3b NULL);...break;
f8f0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2f 2a 20 .. }.. /*
f900: 65 6c 73 65 20 66 61 6c 6c 2d 74 68 72 6f 75 67 else fall-throug
f910: 68 20 2e 2e 2e 20 2a 2f 0a 23 69 66 20 64 65 66 h ... */.#if def
f920: 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 ined(__GNUC__)..
f930: 20 20 20 20 5f 5f 61 74 74 72 69 62 75 74 65 5f __attribute_
f940: 5f 28 28 66 61 6c 6c 74 68 72 6f 75 67 68 29 29 _((fallthrough))
f950: 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c ;.#endif..defaul
f960: 74 3a 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e t:.. Tcl_Wron
f970: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
f980: 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 1, objv, "?-loc
f990: 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 al? channel");..
f9a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
f9b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
f9c0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
f9d0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 hannel(interp, c
f9e0: 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 hannelName, &mod
f9f0: 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e e);. if (chan
fa00: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
fa10: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
fa20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
fa30: 20 7d 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 }. /* Make s
fa40: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f ure to operate o
fa50: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 n the topmost ch
fa60: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 annel */. cha
fa70: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
fa80: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 annel(chan);.
fa90: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
faa0: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
fab0: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
fac0: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e ()) {..Tcl_Appen
fad0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
fae0: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
faf0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
fb00: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c Name(chan),..."\
fb10: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
fb20: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 nnel", NULL);..T
fb30: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
fb40: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
fb50: 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 STATUS", "CHANNE
fb60: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 L", "INVALID", (
fb70: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
fb80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
fb90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 ;. }. stat
fba0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
fbb0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 Tcl_GetChannelI
fbc0: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e nstanceData(chan
fbd0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 );.. /* Get c
fbe0: 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 ertificate for p
fbf0: 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 eer or self */.
fc00: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 if (objc == 2
fc10: 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f ) {..peer = SSL_
fc20: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 get_peer_certifi
fc30: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 cate(statePtr->s
fc40: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 sl);. } else
fc50: 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 {..peer = SSL_ge
fc60: 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 t_certificate(st
fc70: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
fc80: 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 }. /* Get X
fc90: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 509 certificate
fca0: 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 info */. if (
fcb0: 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 peer) {..objPtr
fcc0: 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a = Tls_NewX509Obj
fcd0: 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a (interp, peer);.
fce0: 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 .if (objc == 2)
fcf0: 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 {.. X509_free
fd00: 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 (peer);.. pee
fd10: 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 r = NULL;..}.
fd20: 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 } else {..objPt
fd30: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
fd40: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 bj(0, NULL);.
fd50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 }.. /* Peer
fd60: 63 65 72 74 20 63 68 61 69 6e 20 28 63 6c 69 65 cert chain (clie
fd70: 6e 74 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20 nt only) */.
fd80: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20 STACK_OF(X509)*
fd90: 73 73 6c 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f ssl_certs = SSL_
fda0: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 5f 63 68 get_peer_cert_ch
fdb0: 61 69 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ain(statePtr->ss
fdc0: 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 5f l);. if (ssl_
fdd0: 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c certs == NULL ||
fde0: 20 73 6b 5f 58 35 30 39 5f 6e 75 6d 28 73 73 6c sk_X509_num(ssl
fdf0: 5f 63 65 72 74 73 29 20 3d 3d 20 30 29 20 7b 0a _certs) == 0) {.
fe00: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
fe10: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
fe20: 20 22 53 54 41 54 55 53 22 2c 20 22 43 45 52 54 "STATUS", "CERT
fe30: 49 46 49 43 41 54 45 22 2c 20 28 63 68 61 72 20 IFICATE", (char
fe40: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 49 *) NULL);..Tcl_I
fe50: 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 50 ncrRefCount(objP
fe60: 74 72 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65 tr);..Tcl_DecrRe
fe70: 66 43 6f 75 6e 74 28 6f 62 6a 50 74 72 29 3b 0a fCount(objPtr);.
fe80: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
fe90: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
fea0: 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 Peer name */.
feb0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
fec0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
fed0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
fee0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 ewStringObj("pee
fef0: 72 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20 rname", -1));.
ff00: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
ff10: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
ff20: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
ff30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
ff40: 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 get0_peername(st
ff50: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 atePtr->ssl), -1
ff60: 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 ));.. Tcl_Lis
ff70: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
ff80: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
ff90: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
ffa0: 62 6a 28 22 73 62 69 74 73 22 2c 20 2d 31 29 29 bj("sbits", -1))
ffb0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
ffc0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
ffd0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
ffe0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c cl_NewIntObj(SSL
fff0: 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 _get_cipher_bits
10000 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
10010 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 63 69 NULL)));.. ci
10020 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 phers = (char*)S
10030 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 SL_get_cipher(st
10040 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
10050 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 if ((ciphers !
10060 3d 20 4e 55 4c 4c 29 20 26 26 20 28 73 74 72 63 = NULL) && (strc
10070 6d 70 28 63 69 70 68 65 72 73 2c 20 22 28 4e 4f mp(ciphers, "(NO
10080 4e 45 29 22 29 20 21 3d 20 30 29 29 20 7b 0a 09 NE)") != 0)) {..
10090 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
100a0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
100b0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
100c0 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 StringObj("ciphe
100d0 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c r", -1));..Tcl_L
100e0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
100f0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
10100 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
10110 67 4f 62 6a 28 63 69 70 68 65 72 73 2c 20 2d 31 gObj(ciphers, -1
10120 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ));. }.. /
10130 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 * Verify the X50
10140 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 9 certificate pr
10150 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 esented by the p
10160 65 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c eer */. Tcl_L
10170 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10180 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
10190 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
101a0 67 4f 62 6a 28 22 76 65 72 69 66 79 52 65 73 75 gObj("verifyResu
101b0 6c 74 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lt", -1));. T
101c0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
101d0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
101e0 6f 62 6a 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 objPtr,..Tcl_New
101f0 53 74 72 69 6e 67 4f 62 6a 28 58 35 30 39 5f 76 StringObj(X509_v
10200 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 erify_cert_error
10210 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f _string(SSL_get_
10220 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 verify_result(st
10230 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d atePtr->ssl)), -
10240 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 1));.. /* Ver
10250 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 ify mode */.
10260 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
10270 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
10280 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
10290 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 StringObj("verif
102a0 79 4d 6f 64 65 22 2c 20 2d 31 29 29 3b 0a 20 20 yMode", -1));.
102b0 20 20 2f 2a 20 53 53 4c 5f 43 54 58 5f 67 65 74 /* SSL_CTX_get
102c0 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 63 74 78 _verify_mode(ctx
102d0 29 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 ) */. mode =
102e0 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d SSL_get_verify_m
102f0 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ode(statePtr->ss
10300 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 l);. if (mode
10310 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e && SSL_VERIFY_N
10320 4f 4e 45 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 ONE) {..Tcl_List
10330 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
10340 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10350 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
10360 6a 28 22 6e 6f 6e 65 22 2c 20 2d 31 29 29 3b 0a j("none", -1));.
10370 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
10380 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 l_Obj *listObjPt
10390 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
103a0 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 bj(0, NULL);..if
103b0 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 (mode && SSL_VE
103c0 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 RIFY_PEER) {..
103d0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
103e0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
103f0 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 p, listObjPtr, T
10400 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
10410 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d "peer", -1));..}
10420 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 ..if (mode && SS
10430 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 L_VERIFY_FAIL_IF
10440 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b _NO_PEER_CERT) {
10450 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
10460 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10470 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 nterp, listObjPt
10480 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
10490 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 Obj("fail if no
104a0 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29 peer cert", -1))
104b0 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 ;..}..if (mode &
104c0 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 & SSL_VERIFY_CLI
104d0 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 ENT_ONCE) {..
104e0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
104f0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10500 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 , listObjPtr, Tc
10510 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
10520 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 client once", -1
10530 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 ));..}..if (mode
10540 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 && SSL_VERIFY_P
10550 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b OST_HANDSHAKE) {
10560 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
10570 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10580 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 nterp, listObjPt
10590 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
105a0 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68 Obj("post handsh
105b0 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ake", -1));..}..
105c0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
105d0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
105e0 20 6f 62 6a 50 74 72 2c 20 6c 69 73 74 4f 62 6a objPtr, listObj
105f0 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 Ptr);. }..
10600 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 /* Verify mode
10610 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 54 63 6c depth */. Tcl
10620 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
10630 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
10640 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
10650 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 44 65 ingObj("verifyDe
10660 70 74 68 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 pth", -1));.
10670 2f 2a 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 76 /* SSL_CTX_get_v
10680 65 72 69 66 79 5f 64 65 70 74 68 28 63 74 78 29 erify_depth(ctx)
10690 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 */. Tcl_List
106a0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
106b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
106c0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 Tcl_NewIntObj(S
106d0 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 SL_get_verify_de
106e0 70 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 pth(statePtr->ss
106f0 6c 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 l)));.. /* Re
10700 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 port the selecte
10710 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 d protocol as a
10720 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 result of the ne
10730 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 gotiation */.
10740 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 SSL_get0_alpn_s
10750 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72 elected(statePtr
10760 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 ->ssl, &proto, &
10770 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 len);. Tcl_Li
10780 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
10790 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
107a0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
107b0 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 Obj("alpn", -1))
107c0 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
107d0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
107e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
107f0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
10800 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 (char *)proto, (
10810 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 20 20 20 20 int) len));.
10820 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
10830 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
10840 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
10850 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f StringObj("proto
10860 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 col", -1));.
10870 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
10880 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
10890 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
108a0 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 StringObj(SSL_ge
108b0 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 t_version(stateP
108c0 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a tr->ssl), -1));.
108d0 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f . /* Valid fo
108e0 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 r non-RSA signat
108f0 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 ure and TLS 1.3
10900 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f */. Tcl_ListO
10910 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10920 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10930 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10940 28 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 ("signatureHashA
10950 6c 67 6f 72 69 74 68 6d 22 2c 20 2d 31 29 29 3b lgorithm", -1));
10960 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d . if (objc ==
10970 20 32 20 3f 20 53 53 4c 5f 67 65 74 5f 70 65 65 2 ? SSL_get_pee
10980 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 r_signature_nid(
10990 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
109a0 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65 74 5f 73 nid) : SSL_get_s
109b0 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 ignature_nid(sta
109c0 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
109d0 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 )) {..Tcl_ListOb
109e0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
109f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
10a00 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
10a10 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c OBJ_nid2ln(nid),
10a20 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 -1));. } els
10a30 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a e {..Tcl_ListObj
10a40 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
10a50 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
10a60 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
10a70 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 ", -1));. }.
10a80 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
10a90 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10aa0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
10ab0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 NewStringObj("si
10ac0 67 6e 61 74 75 72 65 54 79 70 65 22 2c 20 2d 31 gnatureType", -1
10ad0 29 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 ));. if (objc
10ae0 20 3d 3d 20 32 20 3f 20 53 53 4c 5f 67 65 74 5f == 2 ? SSL_get_
10af0 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 peer_signature_t
10b00 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 ype_nid(statePtr
10b10 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20 53 ->ssl, &nid) : S
10b20 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 SL_get_signature
10b30 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 _type_nid(stateP
10b40 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 29 20 tr->ssl, &nid))
10b50 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
10b60 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10b70 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
10b80 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42 4a NewStringObj(OBJ
10b90 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 _nid2ln(nid), -1
10ba0 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ));. } else {
10bb0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
10bc0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10bd0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
10be0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 ewStringObj("",
10bf0 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 -1));. }..
10c00 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
10c10 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10c20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
10c30 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 L_OK;..clientDat
10c40 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a a = clientData;.
10c50 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
10c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
10ca0 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 * ConnectionInf
10cb0 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 oObjCmd -- retur
10cc0 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 n connection inf
10cd0 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a o from OpenSSL..
10ce0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
10cf0 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e *.A list of conn
10d00 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a ection info. *.
10d10 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
10d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d50 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
10d60 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e c int Connection
10d70 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e InfoObjCmd(Clien
10d80 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
10d90 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
10da0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
10db0 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
10dc0 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
10dd0 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 _Channel chan;..
10de0 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 /* The channel t
10df0 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e o set a mode on.
10e00 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 */. State *s
10e10 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 tatePtr;../* cli
10e20 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 ent state for ss
10e30 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 l socket */.
10e40 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c Tcl_Obj *objPtr,
10e50 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 *listPtr;. c
10e60 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 onst SSL *ssl;.
10e70 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 const SSL_CIP
10e80 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 HER *cipher;.
10e90 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 const SSL_SESSI
10ea0 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 ON *session;.
10eb0 20 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20 long mode;..
10ec0 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 if (objc != 2)
10ed0 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
10ee0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
10ef0 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b bjv, "channel");
10f00 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
10f10 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
10f20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
10f30 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 annel(interp, Tc
10f40 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
10f50 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c bj(objv[1], NULL
10f60 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 ), NULL);. if
10f70 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
10f80 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
10f90 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
10fa0 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f R);. }.. /
10fb0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
10fc0 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
10fd0 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
10fe0 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
10ff0 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
11000 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c an);. if (Tcl
11010 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
11020 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
11030 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
11040 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
11050 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
11060 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
11070 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
11080 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f n),.. "\": no
11090 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 t a TLS channel"
110a0 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 , NULL);..Tcl_Se
110b0 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
110c0 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 p, "TLS", "CONNE
110d0 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c CTION", "CHANNEL
110e0 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 ", "INVALID", (c
110f0 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
11100 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
11110 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a ;. }.. obj
11120 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
11130 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a tObj(0, NULL);..
11140 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f /* Connectio
11150 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 n info */. st
11160 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
11170 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c *)Tcl_GetChannel
11180 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
11190 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 n);. ssl = st
111a0 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 atePtr->ssl;.
111b0 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c if (ssl != NULL
111c0 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 ) {../* connecti
111d0 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 54 63 6c on state */..Tcl
111e0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
111f0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
11200 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
11210 69 6e 67 4f 62 6a 28 22 73 74 61 74 65 22 2c 20 ingObj("state",
11220 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
11230 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
11240 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11250 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
11260 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e (SSL_state_strin
11270 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 g_long(ssl), -1)
11280 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 );.../* Get SNI
11290 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65 72 requested server
112a0 20 6e 61 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 name */..Tcl_Li
112b0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
112c0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
112d0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
112e0 4f 62 6a 28 22 73 65 72 76 65 72 6e 61 6d 65 22 Obj("servername"
112f0 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
11300 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
11310 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
11320 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
11330 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 bj(SSL_get_serve
11340 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 rname(ssl, TLSEX
11350 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f T_NAMETYPE_host_
11360 6e 61 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f name), -1));.../
11370 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a * Get protocol *
11380 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
11390 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
113a0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
113b0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 NewStringObj("pr
113c0 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 09 otocol", -1));..
113d0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
113e0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
113f0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
11400 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 StringObj(SSL_ge
11410 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 t_version(ssl),
11420 2d 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 -1));.../* Reneg
11430 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 otiation allowed
11440 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
11450 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
11460 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
11470 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
11480 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20 renegotiation",
11490 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
114a0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
114b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
114c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
114d0 28 0a 09 20 20 20 20 53 53 4c 5f 67 65 74 5f 73 (.. SSL_get_s
114e0 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 ecure_renegotiat
114f0 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 ion_support(ssl)
11500 20 3f 20 22 73 75 70 70 6f 72 74 65 64 22 20 3a ? "supported" :
11510 20 22 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 "not supported"
11520 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 , -1));.../* Get
11530 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 security level
11540 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
11550 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
11560 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
11570 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
11580 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 2d ecuritylevel", -
11590 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
115a0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
115b0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
115c0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c cl_NewIntObj(SSL
115d0 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _get_security_le
115e0 76 65 6c 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a vel(ssl)));.../*
115f0 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f Session info */
11600 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
11610 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
11620 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
11630 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 ewStringObj("ses
11640 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d 31 sion_reused", -1
11650 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
11660 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
11670 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
11680 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 l_NewBooleanObj(
11690 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 SSL_session_reus
116a0 65 64 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 ed(ssl)));.../*
116b0 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a Is server info *
116c0 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
116d0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
116e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
116f0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 73 NewStringObj("is
11700 5f 73 65 72 76 65 72 22 2c 20 2d 31 29 29 3b 0a _server", -1));.
11710 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11720 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11730 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
11740 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f wBooleanObj(SSL_
11750 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 29 is_server(ssl)))
11760 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
11770 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 Cipher info */.
11780 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f cipher = SSL_
11790 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 get_current_ciph
117a0 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 er(ssl);. if
117b0 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 (cipher != NULL)
117c0 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 {..char buf[BUF
117d0 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 SIZ] = {0};..int
117e0 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b bits, alg_bits;
117f0 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ...Tcl_ListObjAp
11800 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
11810 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
11820 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 NewStringObj("ci
11830 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 pher", -1));..Tc
11840 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
11850 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
11860 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
11870 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 ringObj(SSL_CIPH
11880 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 ER_get_name(ciph
11890 65 72 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f er), -1));..Tcl_
118a0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
118b0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
118c0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
118d0 6e 67 4f 62 6a 28 22 73 74 61 6e 64 61 72 64 5f ngObj("standard_
118e0 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 name", -1));..Tc
118f0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
11900 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
11910 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
11920 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 ringObj(SSL_CIPH
11930 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 ER_standard_name
11940 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a (cipher), -1));.
11950 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 ..bits = SSL_CIP
11960 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 HER_get_bits(cip
11970 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b her, &alg_bits);
11980 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
11990 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
119a0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
119b0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 ewStringObj("sec
119c0 72 65 74 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b ret_bits", -1));
119d0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
119e0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
119f0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
11a00 65 77 49 6e 74 4f 62 6a 28 62 69 74 73 29 29 3b ewIntObj(bits));
11a10 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
11a20 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
11a30 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
11a40 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 67 ewStringObj("alg
11a50 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 2d 31 orithm_bits", -1
11a60 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
11a70 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
11a80 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
11a90 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6c 67 5f l_NewIntObj(alg_
11aa0 62 69 74 73 29 29 3b 0a 09 2f 2a 20 61 6c 67 5f bits));../* alg_
11ab0 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b bits is actual k
11ac0 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 ey secret bits.
11ad0 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 If use bits and
11ae0 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 secret (algorith
11af0 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a m) bits differ,.
11b00 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 . the rest of
11b10 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 the bits are fix
11b20 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d ed, i.e. for lim
11b30 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 ited export ciph
11b40 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 ers (bits < 56)
11b50 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
11b60 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
11b70 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
11b80 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d _NewStringObj("m
11b90 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 in_version", -1)
11ba0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
11bb0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
11bc0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
11bd0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
11be0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 L_CIPHER_get_ver
11bf0 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 sion(cipher), -1
11c00 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 ));.../* Get Ope
11c10 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 nSSL-specific ID
11c20 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f , not IANA ID */
11c30 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
11c40 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
11c50 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
11c60 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 64 22 ewStringObj("id"
11c70 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
11c80 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
11c90 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
11ca0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
11cb0 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 (int) SSL_CIPHER
11cc0 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 _get_id(cipher))
11cd0 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 );...if (SSL_CIP
11ce0 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 HER_description(
11cf0 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a cipher, buf, siz
11d00 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c eof(buf)) != NUL
11d10 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 L) {.. Tcl_Li
11d20 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
11d30 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
11d40 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
11d50 4f 62 6a 28 22 64 65 73 63 72 69 70 74 69 6f 6e Obj("description
11d60 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54 63 ", -1));.. Tc
11d70 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
11d80 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
11d90 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
11da0 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29 ringObj(buf, -1)
11db0 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
11dc0 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f /* Session info
11dd0 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 */. session
11de0 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f = SSL_get_sessio
11df0 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 n(ssl);. if (
11e00 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 session != NULL)
11e10 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e {..const unsign
11e20 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
11e30 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 ..size_t len2;..
11e40 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 unsigned int ule
11e50 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e n;..const unsign
11e60 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
11e70 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 63 68 _id, *proto;..ch
11e80 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 ar buffer[SSL_MA
11e90 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e X_MASTER_KEY_LEN
11ea0 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 GTH];.../* Repor
11eb0 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 t the selected p
11ec0 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 rotocol as a res
11ed0 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 ult of the ALPN
11ee0 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 negotiation */..
11ef0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
11f00 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 _alpn_selected(s
11f10 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 ession, &proto,
11f20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 &len2);..Tcl_Lis
11f30 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
11f40 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
11f50 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
11f60 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b bj("alpn", -1));
11f70 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
11f80 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
11f90 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
11fa0 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 ewStringObj((cha
11fb0 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 r *)proto, (int)
11fc0 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 52 65 len2));.../* Re
11fd0 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 port the selecte
11fe0 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 d protocol as a
11ff0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 result of the NP
12000 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f N negotiation */
12010 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a .#ifdef USE_NPN.
12020 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 .SSL_get0_next_p
12030 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 roto_negotiated(
12040 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c ssl, &proto, &ul
12050 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 en);..Tcl_ListOb
12060 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
12070 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
12080 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
12090 22 6e 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 "npn", -1));..Tc
120a0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
120b0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
120c0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
120d0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 ringObj((char *)
120e0 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 75 6c 65 proto, (int) ule
120f0 6e 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a n));.#endif.../*
12100 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 Resumable sessi
12110 6f 6e 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f on */..Tcl_ListO
12120 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
12130 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12140 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
12150 28 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 2d 31 ("resumable", -1
12160 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
12170 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
12180 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
12190 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f l_NewIntObj(SSL_
121a0 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d SESSION_is_resum
121b0 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 29 3b able(session)));
121c0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 .../* Session st
121d0 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 art time (second
121e0 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a s since epoch) *
121f0 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
12200 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
12210 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
12220 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 NewStringObj("st
12230 61 72 74 5f 74 69 6d 65 22 2c 20 2d 31 29 29 3b art_time", -1));
12240 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
12250 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
12260 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
12270 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 ewLongObj(SSL_SE
12280 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 SSION_get_time(s
12290 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 ession)));.../*
122a0 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 Timeout value -
122b0 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 SSL_CTX_get_time
122c0 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 out (in seconds)
122d0 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
122e0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
122f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
12300 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
12310 74 69 6d 65 6f 75 74 22 2c 20 2d 31 29 29 3b 0a timeout", -1));.
12320 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
12330 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
12340 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
12350 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 wLongObj(SSL_SES
12360 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 SION_get_timeout
12370 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f (session)));.../
12380 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 * Session ticket
12390 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 lifetime hint (
123a0 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 in seconds) */..
123b0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
123c0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
123d0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
123e0 53 74 72 69 6e 67 4f 62 6a 28 22 6c 69 66 65 74 StringObj("lifet
123f0 69 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ime", -1));..Tcl
12400 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
12410 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
12420 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e jPtr, Tcl_NewLon
12430 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e gObj(SSL_SESSION
12440 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 _get_ticket_life
12450 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f time_hint(sessio
12460 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 n)));.../* Sessi
12470 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 on id - TLSv1.2
12480 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a and below only *
12490 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 /..session_id =
124a0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
124b0 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 id(session, &ule
124c0 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a n);..Tcl_ListObj
124d0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
124e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
124f0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
12500 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 2d 31 29 session_id", -1)
12510 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
12520 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
12530 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
12540 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a _NewByteArrayObj
12550 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e (session_id, (in
12560 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 t) ulen));.../*
12570 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 Session context
12580 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d */..session_id =
12590 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
125a0 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 0_id_context(ses
125b0 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 54 sion, &ulen);..T
125c0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
125d0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
125e0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
125f0 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f tringObj("sessio
12600 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 2d 31 29 29 n_context", -1))
12610 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
12620 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
12630 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
12640 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
12650 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 session_id, (int
12660 29 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 53 ) ulen));.../* S
12670 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 ession ticket -
12680 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 client only */..
12690 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
126a0 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c _ticket(session,
126b0 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 &ticket, &len2)
126c0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
126d0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
126e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
126f0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 NewStringObj("se
12700 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 2d ssion_ticket", -
12710 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
12720 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
12730 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
12740 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f cl_NewByteArrayO
12750 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 bj(ticket, (int)
12760 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 54 69 len2));.../* Ti
12770 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f cket app data */
12780 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 ..SSL_SESSION_ge
12790 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 t0_ticket_appdat
127a0 61 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b a(session, &tick
127b0 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c et, &len2);..Tcl
127c0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
127d0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
127e0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
127f0 69 6e 67 4f 62 6a 28 22 74 69 63 6b 65 74 5f 61 ingObj("ticket_a
12800 70 70 5f 64 61 74 61 22 2c 20 2d 31 29 29 3b 0a pp_data", -1));.
12810 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
12820 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
12830 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
12840 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 wByteArrayObj(ti
12850 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 cket, (int) len2
12860 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 ));.../* Get mas
12870 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 ter key */..len2
12880 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
12890 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 et_master_key(se
128a0 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 ssion, buffer, S
128b0 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 SL_MAX_MASTER_KE
128c0 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 54 63 6c 5f Y_LENGTH);..Tcl_
128d0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
128e0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
128f0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
12900 6e 67 4f 62 6a 28 22 6d 61 73 74 65 72 5f 6b 65 ngObj("master_ke
12910 79 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c y", -1));..Tcl_L
12920 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
12930 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
12940 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 tr, Tcl_NewByteA
12950 72 72 61 79 4f 62 6a 28 62 75 66 66 65 72 2c 20 rrayObj(buffer,
12960 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 20 20 (int) len2));.
12970 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 }.. /* Comp
12980 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a ression info */.
12990 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e if (ssl != N
129a0 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 ULL) {.#ifdef HA
129b0 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 VE_SSL_COMPRESSI
129c0 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d ON..const COMP_M
129d0 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 ETHOD *comp, *ex
129e0 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f pn;..comp = SSL_
129f0 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 get_current_comp
12a00 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 ression(ssl);..e
12a10 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 xpn = SSL_get_cu
12a20 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 rrent_expansion(
12a30 73 73 6c 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 ssl);...Tcl_List
12a40 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
12a50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12a60 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
12a70 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c j("compression",
12a80 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
12a90 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
12aa0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12ab0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
12ac0 6a 28 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d j(comp ? SSL_COM
12ad0 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 P_get_name(comp)
12ae0 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b : "NONE", -1));
12af0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
12b00 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
12b10 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
12b20 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 ewStringObj("exp
12b30 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 ansion", -1));..
12b40 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
12b50 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
12b60 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
12b70 53 74 72 69 6e 67 4f 62 6a 28 65 78 70 6e 20 3f StringObj(expn ?
12b80 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 SSL_COMP_get_na
12b90 6d 65 28 65 78 70 6e 29 20 3a 20 22 4e 4f 4e 45 me(expn) : "NONE
12ba0 22 2c 20 2d 31 29 29 3b 0a 23 65 6c 73 65 0a 09 ", -1));.#else..
12bb0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
12bc0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
12bd0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
12be0 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 StringObj("compr
12bf0 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 ession", -1));..
12c00 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
12c10 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
12c20 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
12c30 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 StringObj("NONE"
12c40 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
12c50 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
12c60 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
12c70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
12c80 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 bj("expansion",
12c90 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
12ca0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
12cb0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12cc0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
12cd0 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 ("NONE", -1));.#
12ce0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 endif. }..
12cf0 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 /* Server info
12d00 2a 2f 0a 20 20 20 20 7b 0a 09 6d 6f 64 65 20 3d */. {..mode =
12d10 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 SSL_CTX_get_ses
12d20 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 sion_cache_mode(
12d30 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
12d40 09 63 68 61 72 20 2a 6d 73 67 3b 0a 09 0a 09 69 .char *msg;....i
12d50 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 f (mode & SSL_SE
12d60 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a SS_CACHE_OFF) {.
12d70 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 . msg = "off"
12d80 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f ;..} else if (mo
12d90 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
12da0 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 CHE_CLIENT) {..
12db0 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 msg = "client
12dc0 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d ";..} else if (m
12dd0 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 ode & SSL_SESS_C
12de0 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 ACHE_SERVER) {..
12df0 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 msg = "serve
12e00 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 r";..} else if (
12e10 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
12e20 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 CACHE_BOTH) {..
12e30 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b msg = "both";
12e40 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
12e50 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b msg = "unknown";
12e60 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ..}..Tcl_ListObj
12e70 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
12e80 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
12e90 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
12ea0 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f session_cache_mo
12eb0 64 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f de", -1));..Tcl_
12ec0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
12ed0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
12ee0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
12ef0 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b ngObj(msg, -1));
12f00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
12f10 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a A List */. /*
12f20 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 IF not a server
12f30 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 , same as SSL_ge
12f40 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e t0_peer_CA_list.
12f50 20 49 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 If server same
12f60 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 as SSL_CTX_get_c
12f70 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f lient_CA_list */
12f80 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 . listPtr = T
12f90 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
12fa0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 NULL);. STAC
12fb0 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 K_OF(X509_NAME)
12fc0 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 *ca_list;. if
12fd0 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c ((ca_list = SSL
12fe0 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c _get_client_CA_l
12ff0 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c ist(ssl)) != NUL
13000 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 L) {..char buffe
13010 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 r[BUFSIZ];..for
13020 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 (int i = 0; i <
13030 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d sk_X509_NAME_num
13040 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 (ca_list); i++)
13050 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 {.. X509_NAME
13060 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 *name = sk_X509
13070 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c _NAME_value(ca_l
13080 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 ist, i);.. if
13090 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 (name) {...X509
130a0 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 _NAME_oneline(na
130b0 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 me, buffer, BUFS
130c0 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f IZ);...Tcl_ListO
130d0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
130e0 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c interp, listPtr,
130f0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
13100 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a j(buffer, -1));.
13110 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a . }..}. }.
13120 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
13130 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
13140 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
13150 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 _NewStringObj("c
13160 61 4c 69 73 74 22 2c 20 2d 31 29 29 3b 0a 20 20 aList", -1));.
13170 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
13180 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
13190 70 2c 20 6f 62 6a 50 74 72 2c 20 6c 69 73 74 50 p, objPtr, listP
131a0 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 tr);.. Tcl_Se
131b0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
131c0 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
131d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
131e0 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
131f0 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
13200 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
13210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13240 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 -----. *. * Vers
13250 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 ionObjCmd -- ret
13260 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 urn version stri
13270 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e ng from OpenSSL.
13280 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
13290 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
132a0 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
132b0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
132c0 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
132d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
132e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
132f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
13310 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 */.static int.V
13320 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 ersionObjCmd(Cli
13330 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
13340 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
13350 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
13360 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
13370 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
13380 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a cl_Obj *objPtr;.
13390 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
133a0 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a lled");.. obj
133b0 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 Ptr = Tcl_NewStr
133c0 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 ingObj(OPENSSL_V
133d0 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 ERSION_TEXT, -1)
133e0 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a ;. Tcl_SetObj
133f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
13400 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 bjPtr);.. ret
13410 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
13420 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
13430 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 Data;..objc = ob
13440 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 jc;..objv = objv
13450 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
13460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
134a0 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 *. * MiscObjCmd
134b0 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 -- misc commands
134c0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
134d0 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
134e0 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
134f0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
13500 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
13510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
13550 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d */.static int.M
13560 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 iscObjCmd(Client
13570 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
13580 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
13590 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
135a0 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
135b0 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 jv[]) {. stat
135c0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 ic const char *c
135d0 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 ommands [] = { "
135e0 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 req", "strreq",
135f0 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d NULL };. enum
13600 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 command { C_REQ
13610 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 , C_STRREQ, C_DU
13620 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 MMY };. int c
13630 6d 64 2c 20 69 73 53 74 72 3b 0a 20 20 20 20 63 md, isStr;. c
13640 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 har buffer[16384
13650 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ];.. dprintf(
13660 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
13670 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a if (objc < 2) {.
13680 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
13690 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
136a0 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f v, "subcommand ?
136b0 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e args?");..return
136c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
136d0 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 }. if (Tcl_Ge
136e0 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e tIndexFromObj(in
136f0 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 terp, objv[1], c
13700 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e ommands, "comman
13710 64 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 d", 0,&cmd) != T
13720 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
13730 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
13740 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
13750 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 _error();.. i
13760 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 sStr = (cmd == C
13770 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 _STRREQ);. sw
13780 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d itch ((enum comm
13790 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 and) cmd) {..cas
137a0 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 e C_REQ:..case C
137b0 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 _STRREQ: {..
137c0 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e EVP_PKEY *pkey=N
137d0 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a ULL;.. X509 *
137e0 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 cert=NULL;..
137f0 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d X509_NAME *name=
13800 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f NULL;.. Tcl_O
13810 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 bj **listv;..
13820 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 int listc,i;...
13830 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c BIO *out=NUL
13840 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b L;... char *k
13850 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a _C="",*k_ST="",*
13860 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a k_L="",*k_O="",*
13870 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 k_OU="",*k_CN=""
13880 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 ,*k_Email="";..
13890 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c char *keyout,
138a0 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 *pemout,*str;..
138b0 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 int keysize,s
138c0 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 erial=0,days=365
138d0 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 ;..#if OPENSSL_V
138e0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
138f0 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 0x30000000L..
13900 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e BIGNUM *bne = N
13910 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 ULL;.. RSA *r
13920 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 sa = NULL;.#else
13930 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 .. EVP_PKEY_C
13940 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a TX *ctx = NULL;.
13950 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 #endif... if
13960 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 ((objc<5) || (ob
13970 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 jc>6)) {...Tcl_W
13980 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
13990 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 rp, 2, objv, "ke
139a0 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 ysize keyfile ce
139b0 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b rtfile ?info?");
139c0 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
139d0 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ROR;.. }...
139e0 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 if (Tcl_GetInt
139f0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
13a00 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a objv[2], &keysiz
13a10 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a e) != TCL_OK) {.
13a20 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
13a30 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 OR;.. }..
13a40 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 keyout=Tcl_GetSt
13a50 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 ring(objv[3]);..
13a60 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 pemout=Tcl_G
13a70 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d etString(objv[4]
13a80 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 );.. if (isSt
13a90 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 r) {...Tcl_SetVa
13aa0 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c r(interp,keyout,
13ab0 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 "",0);...Tcl_Set
13ac0 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 Var(interp,pemou
13ad0 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a t,"",0);.. }.
13ae0 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d .. if (objc>=
13af0 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 6) {...if (Tcl_L
13b00 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 istObjGetElement
13b10 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 s(interp, objv[5
13b20 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 26 6c ],....&listc, &l
13b30 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 istv) != TCL_OK)
13b40 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 {... return
13b50 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a TCL_ERROR;...}..
13b60 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 20 ..if ((listc%2)
13b70 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 != 0) {... Tc
13b80 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
13b90 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 rp,"Information
13ba0 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 65 list must have e
13bb0 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 ven number of ar
13bc0 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a guments",NULL);.
13bd0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
13be0 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f _ERROR;...}...fo
13bf0 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b r (i=0; i<listc;
13c00 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 i+=2) {... s
13c10 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 tr=Tcl_GetString
13c20 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 (listv[i]);...
13c30 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 if (strcmp(str
13c40 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 ,"days")==0) {..
13c50 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 ..if (Tcl_GetInt
13c60 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c FromObj(interp,l
13c70 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 istv[i+1],&days)
13c80 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 !=TCL_OK)....
13c90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
13ca0 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 R;... } else
13cb0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
13cc0 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 serial")==0) {..
13cd0 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 ..if (Tcl_GetInt
13ce0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c FromObj(interp,l
13cf0 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 istv[i+1],&seria
13d00 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 l)!=TCL_OK)....
13d10 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
13d20 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 ROR;... } els
13d30 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
13d40 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"C")==0) {....k
13d50 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _C=Tcl_GetString
13d60 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
13d70 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
13d80 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d trcmp(str,"ST")=
13d90 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 =0) {....k_ST=Tc
13da0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
13db0 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
13dc0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
13dd0 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a (str,"L")==0) {.
13de0 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 ...k_L=Tcl_GetSt
13df0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
13e00 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
13e10 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f f (strcmp(str,"O
13e20 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d ")==0) {....k_O=
13e30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
13e40 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
13e50 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
13e60 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 mp(str,"OU")==0)
13e70 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 {....k_OU=Tcl_G
13e80 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
13e90 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
13ea0 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
13eb0 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 r,"CN")==0) {...
13ec0 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 .k_CN=Tcl_GetStr
13ed0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
13ee0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
13ef0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d (strcmp(str,"Em
13f00 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ail")==0) {....k
13f10 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 _Email=Tcl_GetSt
13f20 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
13f30 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b ;... } else {
13f40 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c ....Tcl_SetResul
13f50 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 t(interp,"Unknow
13f60 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c n parameter",NUL
13f70 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 L);....return TC
13f80 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d L_ERROR;... }
13f90 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 ...}.. }..#if
13fa0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
13fb0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
13fc0 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 0000L.. bne =
13fd0 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 BN_new();..
13fe0 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b rsa = RSA_new();
13ff0 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 .. pkey = EVP
14000 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 _PKEY_new();..
14010 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c if (bne == NUL
14020 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c L || rsa == NULL
14030 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c || pkey == NULL
14040 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 || !BN_set_word
14050 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a (bne,RSA_F4) ||.
14060 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f ..!RSA_generate_
14070 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 key_ex(rsa, keys
14080 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 ize, bne, NULL)
14090 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 || !EVP_PKEY_ass
140a0 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 ign_RSA(pkey, rs
140b0 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 a)) {...EVP_PKEY
140c0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f _free(pkey);.../
140d0 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b * RSA_free(rsa);
140e0 20 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b freed by EVP_PK
140f0 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f EY_free */...BN_
14100 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 free(bne);.#else
14110 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 .. pkey = EVP
14120 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e _RSA_gen((unsign
14130 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 ed int) keysize)
14140 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 50 ;.. ctx = EVP
14150 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b _PKEY_CTX_new(pk
14160 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 ey,NULL);.. i
14170 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 f (pkey == NULL
14180 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c || ctx == NULL |
14190 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 | !EVP_PKEY_keyg
141a0 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a en_init(ctx) ||.
141b0 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f ..!EVP_PKEY_CTX_
141c0 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 set_rsa_keygen_b
141d0 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 its(ctx, keysize
141e0 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b ) || !EVP_PKEY_k
141f0 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 eygen(ctx, &pkey
14200 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f )) {...EVP_PKEY_
14210 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 free(pkey);...EV
14220 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 P_PKEY_CTX_free(
14230 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 ctx);.#endif...T
14240 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
14250 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 erp,"Error gener
14260 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65 ating private ke
14270 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 y",NULL);...retu
14280 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
14290 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 } else {...if
142a0 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 (isStr) {...
142b0 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f out=BIO_new(BIO
142c0 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 _s_mem());...
142d0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 PEM_write_bio_P
142e0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b rivateKey(out,pk
142f0 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e ey,NULL,NULL,0,N
14300 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 ULL,NULL);...
14310 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c i=BIO_read(out,
14320 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 buffer,sizeof(bu
14330 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 ffer)-1);...
14340 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b i=(i<0) ? 0 : i;
14350 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d ... buffer[i]
14360 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c ='\0';... Tcl
14370 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b _SetVar(interp,k
14380 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b eyout,buffer,0);
14390 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 ... BIO_flush
143a0 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f (out);... BIO
143b0 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 _free(out);...}
143c0 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 else {... out
143d0 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 =BIO_new(BIO_s_f
143e0 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 ile());... BI
143f0 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 O_write_filename
14400 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 (out,keyout);...
14410 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 PEM_write_bi
14420 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 o_PrivateKey(out
14430 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c ,pkey,NULL,NULL,
14440 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 0,NULL,NULL);...
14450 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 /* PEM_write
14460 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b _bio_RSAPrivateK
14470 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c ey(out, rsa, NUL
14480 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c L, NULL, 0, NULL
14490 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 , NULL); */...
144a0 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f BIO_free_all(o
144b0 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 ut);.. .}....if
144c0 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 ((cert=X509_new(
144d0 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 ))==NULL) {...
144e0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 Tcl_SetResult(
144f0 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 interp,"Error ge
14500 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 69 nerating certifi
14510 63 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55 cate request",NU
14520 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 LL);... EVP_P
14530 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
14540 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
14550 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
14560 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 0000000L... B
14570 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e N_free(bne);.#en
14580 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e dif... return
14590 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d (TCL_ERROR);...}
145a0 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 ....X509_set_ver
145b0 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 sion(cert,2);...
145c0 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 ASN1_INTEGER_set
145d0 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c (X509_get_serial
145e0 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 Number(cert),ser
145f0 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 ial);...X509_gmt
14600 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 ime_adj(X509_get
14610 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 m_notBefore(cert
14620 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 ),0);...X509_gmt
14630 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 ime_adj(X509_get
14640 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 m_notAfter(cert)
14650 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a ,(long)60*60*24*
14660 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 days);...X509_se
14670 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b t_pubkey(cert,pk
14680 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 ey);....name=X50
14690 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 9_get_subject_na
146a0 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 me(cert);....X50
146b0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
146c0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 _by_txt(name,"C"
146d0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
146e0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
146f0 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c char *) k_C, -1,
14700 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
14710 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
14720 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c y_txt(name,"ST",
14730 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
14740 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
14750 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c har *) k_ST, -1,
14760 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
14770 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
14780 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 y_txt(name,"L",
14790 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
147a0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
147b0 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d ar *) k_L, -1, -
147c0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
147d0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
147e0 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 txt(name,"O", MB
147f0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
14800 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
14810 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c *) k_O, -1, -1,
14820 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
14830 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
14840 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 t(name,"OU", MBS
14850 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
14860 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
14870 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c *) k_OU, -1, -1,
14880 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
14890 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
148a0 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 t(name,"CN", MBS
148b0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
148c0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
148d0 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c *) k_CN, -1, -1,
148e0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
148f0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
14900 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 t(name,"Email",
14910 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
14920 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
14930 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d ar *) k_Email, -
14940 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 1, -1, 0);....X5
14950 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 09_set_subject_n
14960 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a ame(cert,name);.
14970 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 ...if (!X509_sig
14980 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f n(cert,pkey,EVP_
14990 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 sha256())) {...
149a0 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 X509_free(cer
149b0 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b t);... EVP_PK
149c0 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 EY_free(pkey);.#
149d0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
149e0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
149f0 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 000000L... BN
14a00 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 _free(bne);.#end
14a10 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 if... Tcl_Set
14a20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 Result(interp,"E
14a30 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 rror signing cer
14a40 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b tificate",NULL);
14a50 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
14a60 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 L_ERROR;...}....
14a70 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
14a80 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
14a90 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
14aa0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
14ab0 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b _X509(out,cert);
14ac0 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 ... i=BIO_rea
14ad0 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a d(out,buffer,siz
14ae0 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a eof(buffer)-1);.
14af0 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 .. i=(i<0) ?
14b00 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 0 : i;... buf
14b10 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 fer[i]='\0';...
14b20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e Tcl_SetVar(in
14b30 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 terp,pemout,buff
14b40 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f er,0);... BIO
14b50 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 _flush(out);...
14b60 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 BIO_free(out)
14b70 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 ;...} else {...
14b80 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
14b90 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 IO_s_file());...
14ba0 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 BIO_write_fi
14bb0 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 lename(out,pemou
14bc0 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 t);... PEM_wr
14bd0 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 ite_bio_X509(out
14be0 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 ,cert);... BI
14bf0 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
14c00 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 ...}....X509_fre
14c10 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 e(cert);...EVP_P
14c20 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
14c30 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
14c40 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
14c50 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 0000000L...BN_fr
14c60 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
14c70 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b . }..}..break
14c80 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 ;. default:..
14c90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 break;. }.
14ca0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
14cb0 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
14cc0 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
14cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14ce0 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 ***/./* Init
14cf0 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a */./***
14d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14d10 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d */../*. *-------
14d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
14d60 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 * Tls_Free --.
14d70 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
14d80 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 ure cleans up wh
14d90 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 en a SSL socket
14da0 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a based channel. *
14db0 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 .is closed and i
14dc0 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 ts reference cou
14dd0 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 nt falls below 1
14de0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
14df0 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.none. *. * Si
14e00 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 de effects:. *.F
14e10 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 rees all the sta
14e20 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d te. *. *--------
14e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
14e70 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 void.Tls_Free(ch
14e80 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a ar *blockPtr) {.
14e90 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
14ea0 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 Ptr = (State *)b
14eb0 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 lockPtr;.. dp
14ec0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
14ed0 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 .. Tls_Clean(
14ee0 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 statePtr);. c
14ef0 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b kfree(blockPtr);
14f00 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
14f50 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d . * Tls_Clean --
14f60 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
14f70 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 edure cleans up
14f80 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
14f90 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
14fa0 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 *.is closed and
14fb0 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 its reference c
14fc0 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 ount falls below
14fd0 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 1. This should
14fe0 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 . *.be called sy
14ff0 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 nchronously by t
15000 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f he CloseProc, no
15010 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e t in the. *.Even
15020 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 tuallyFree callb
15030 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ack.. *. * Resul
15040 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 ts:. *.none. *.
15050 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
15060 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 *.Frees all the
15070 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d state. *. *----
15080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
150a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
150b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
150c0 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 */.void Tls_Cle
150d0 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 an(State *stateP
150e0 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 tr) {. dprint
150f0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
15100 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 /*. * we'r
15110 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 e assuming here
15120 74 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c that we're singl
15130 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 e-threaded.
15140 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
15150 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 Ptr->timer != (T
15160 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
15170 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 ULL) {..Tcl_Dele
15180 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 teTimerHandler(s
15190 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b tatePtr->timer);
151a0 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 ..statePtr->time
151b0 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a r = NULL;. }.
151c0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
151d0 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b r->protos) {..ck
151e0 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 free(statePtr->p
151f0 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 rotos);..statePt
15200 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c r->protos = NULL
15210 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
15220 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b statePtr->bio) {
15230 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 ../* This will c
15240 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e all SSL_shutdown
15250 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f . Bug 1414045 */
15260 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 ..dprintf("BIO_f
15270 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 ree_all(%p)", st
15280 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 atePtr->bio);..B
15290 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 IO_free_all(stat
152a0 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 ePtr->bio);..sta
152b0 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c tePtr->bio = NUL
152c0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
152d0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 (statePtr->ssl)
152e0 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f {..dprintf("SSL_
152f0 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 free(%p)", state
15300 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f Ptr->ssl);..SSL_
15310 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 free(statePtr->s
15320 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e sl);..statePtr->
15330 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ssl = NULL;.
15340 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
15350 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f tr->ctx) {..SSL_
15360 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 CTX_free(statePt
15370 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 r->ctx);..stateP
15380 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a tr->ctx = NULL;.
15390 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
153a0 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
153b0 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 ) {..Tcl_DecrRef
153c0 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
153d0 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 callback);..stat
153e0 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
153f0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
15400 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
15410 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f assword) {..Tcl_
15420 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 DecrRefCount(sta
15430 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
15440 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 ;..statePtr->pas
15450 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 sword = NULL;.
15460 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
15470 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 ePtr->vcmd) {..T
15480 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
15490 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
154a0 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 ..statePtr->vcmd
154b0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a = NULL;. }..
154c0 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
154d0 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a urning");.}.../*
154e0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
154f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15520 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
15530 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 _Init --. *. *.T
15540 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 his is a package
15550 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 initialization
15560 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 procedure, which
15570 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 is called. *.by
15580 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 Tcl when this p
15590 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 ackage is to be
155a0 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 added to an inte
155b0 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 rpreter.. *. * R
155c0 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e esults: Ssl con
155d0 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 figured and load
155e0 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ed. *. * Side ef
155f0 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 fects:. *. creat
15600 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e e the ssl comman
15610 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 d, initialize ss
15620 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d l context. *. *-
15630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15670 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 --. */.DLLEXPORT
15680 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 int Tls_Init(Tc
15690 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
156a0 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 ) {. const ch
156b0 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 ar tlsTclInitScr
156c0 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 ipt[] = {.#inclu
156d0 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 de "tls.tcl.h"..
156e0 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 0x00. };..
156f0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
15700 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 ");.. /*.
15710 20 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f * We only suppo
15720 72 74 20 54 63 6c 20 38 2e 34 20 6f 72 20 6e 65 rt Tcl 8.4 or ne
15730 77 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 wer. */.
15740 69 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 5f if (.#ifdef USE_
15750 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c 5f 49 TCL_STUBS..Tcl_I
15760 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c nitStubs(interp,
15770 20 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c 73 65 "8.4", 0).#else
15780 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 ..Tcl_PkgRequire
15790 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 (interp, "Tcl",
157a0 22 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e 64 69 "8.4-", 0).#endi
157b0 66 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 f.. == NULL) {..
157c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
157d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
157e0 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 (TlsLibInit(0) !
157f0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c = TCL_OK) {..Tcl
15800 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
15810 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 terp, "could not
15820 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 initialize SSL
15830 6c 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 3b library", NULL);
15840 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
15850 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
15860 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
15870 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
15880 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 ::ciphers", Ciph
15890 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 ersObjCmd, (Clie
158a0 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
158b0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
158c0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
158d0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
158e0 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 (interp, "tls::c
158f0 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e onnection", Conn
15900 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 ectionInfoObjCmd
15910 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
15920 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15930 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
15940 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15950 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
15960 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 "tls::handshake"
15970 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d , HandshakeObjCm
15980 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
15990 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
159a0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
159b0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
159c0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
159d0 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 "tls::import",
159e0 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 ImportObjCmd, (C
159f0 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
15a00 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
15a10 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
15a20 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
15a30 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
15a40 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 ::unimport", Uni
15a50 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c mportObjCmd, (Cl
15a60 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
15a70 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
15a80 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
15a90 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
15aa0 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
15ab0 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 :status", Status
15ac0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
15ad0 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
15ae0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
15af0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
15b00 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
15b10 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 terp, "tls::vers
15b20 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a ion", VersionObj
15b30 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
15b40 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
15b50 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
15b60 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
15b70 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
15b80 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 p, "tls::misc",
15b90 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 MiscObjCmd, (Cli
15ba0 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
15bb0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
15bc0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
15bd0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
15be0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
15bf0 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 protocols", Prot
15c00 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c ocolsObjCmd, (Cl
15c10 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
15c20 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
15c30 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 *) NULL);.. i
15c40 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 63 f (interp) {..Tc
15c50 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 l_Eval(interp, t
15c60 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 lsTclInitScript)
15c70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 ;. }.. ret
15c80 75 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f 76 69 urn(Tcl_PkgProvi
15c90 64 65 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 22 de(interp, "tls"
15ca0 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f , PACKAGE_VERSIO
15cb0 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d N));.}../*. *---
15cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15cf0 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 ---*. *. *.Tls_S
15d00 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a afeInit --. *. *
15d10 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
15d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d40 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 -*. *.Standard p
15d50 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65 rocedure require
15d60 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 d by 'load'.. *.
15d70 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 Initializes this
15d80 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 extension for a
15d90 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 safe interprete
15da0 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d r.. *.----------
15db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15dd0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 ------*. *. *.Si
15de0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 de effects:. *..
15df0 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 As of 'Tls_Init'
15e00 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 . *. *.Result:.
15e10 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *..A standard Tc
15e20 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a l error code.. *
15e30 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
15e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 ---------*. */.D
15e70 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 LLEXPORT int Tls
15e80 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e _SafeInit(Tcl_In
15e90 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a terp *interp) {.
15ea0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
15eb0 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 led");. retur
15ec0 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 n(Tls_Init(inter
15ed0 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d p));.}../*. *---
15ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f10 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 ---*. *. *.TlsLi
15f20 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d bInit --. *. *.-
15f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
15f60 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 . *.Initializes
15f70 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 SSL library once
15f80 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e per application
15f90 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
15fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15fc0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 ----*. *. *.Side
15fd0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e effects:. *..in
15fe0 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 itializes SSL li
15ff0 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 brary. *. *.Resu
16000 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a lt:. *..none. *.
16010 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
16020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16040 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 --------*. */.st
16050 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 atic int TlsLibI
16060 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 nit(int uninitia
16070 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 lize) {. stat
16080 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a ic int initializ
16090 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 ed = 0;. int
160a0 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b status = TCL_OK;
160b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
160c0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
160d0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
160e0 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 EADS). size_t
160f0 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 num_locks;.#end
16100 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e if.. if (unin
16110 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 itialize) {..if
16120 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b (!initialized) {
16130 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 .. dprintf("A
16140 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 sked to uninitia
16150 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 lize, but we are
16160 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 not initialized
16170 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e ");... return
16180 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 (TCL_OK);..}...d
16190 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f printf("Asked to
161a0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b uninitialize");
161b0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
161c0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
161d0 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
161e0 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 READS)..Tcl_Mute
161f0 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b xLock(&init_mx);
16200 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a ...if (locks) {.
16210 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 . free(locks)
16220 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e ;.. locks = N
16230 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 ULL;.. locksC
16240 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e ount = 0;..}.#en
16250 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 dif..initialized
16260 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e = 0;..#if defin
16270 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
16280 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
16290 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c CL_THREADS)..Tcl
162a0 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e _MutexUnlock(&in
162b0 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a it_mx);.#endif..
162c0 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b .return(TCL_OK);
162d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
162e0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
162f0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c dprintf("Called,
16300 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 but using cache
16310 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 d value");..retu
16320 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 20 rn(status);.
16330 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 }.. dprintf("
16340 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 Called");..#if d
16350 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
16360 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
16370 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
16380 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 Tcl_MutexLoc
16390 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e k(&init_mx);.#en
163a0 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 dif. initiali
163b0 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 zed = 1;..#if de
163c0 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
163d0 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
163e0 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 d(TCL_THREADS).
163f0 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 num_locks = 1
16400 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 ;. locksCount
16410 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 = (int) num_loc
16420 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 ks;. locks =
16430 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c malloc(sizeof(*l
16440 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b ocks) * num_lock
16450 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c s);. memset(l
16460 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 ocks, 0, sizeof(
16470 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f *locks) * num_lo
16480 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 cks);.#endif..
16490 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 /* Initialize
164a0 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 BOTH libcrypto a
164b0 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 nd libssl. */.
164c0 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 OPENSSL_init_s
164d0 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f sl(OPENSSL_INIT_
164e0 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 LOAD_SSL_STRINGS
164f0 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f | OPENSSL_INIT_
16500 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 LOAD_CRYPTO_STRI
16510 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 NGS..| OPENSSL_I
16520 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 NIT_ADD_ALL_CIPH
16530 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e ERS | OPENSSL_IN
16540 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 IT_ADD_ALL_DIGES
16550 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 TS, NULL);..
16560 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c BIO_new_tcl(NULL
16570 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 , 0);..#if 0.
16580 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 /*. * XXX:T
16590 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 ODO: Remove this
165a0 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 code and replac
165b0 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63 e it with a chec
165c0 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f k. * for eno
165d0 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 ugh entropy and
165e0 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 do not try to cr
165f0 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 eate our own.
16600 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 * terrible ent
16610 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ropy. */.
16620 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 /*. * Seed
16630 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 the random numbe
16640 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 r generator in t
16650 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a he SSL library,.
16660 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 * using the
16670 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 do/while constr
16680 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 uct because of t
16690 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 he bug note in t
166a0 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 he. * OpenSS
166b0 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f L FAQ at http://
166c0 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f www.openssl.org/
166d0 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c support/faq.html
166e0 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 #USER1. *.
166f0 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 * The crux of
16700 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 the problem is
16710 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 that Solaris 7 d
16720 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 oes not have a.
16730 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f * /dev/rando
16740 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f m or /dev/urando
16750 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 m device so it c
16760 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f annot gather eno
16770 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f ugh. * entro
16780 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 py from the RAND
16790 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 _seed() when TLS
167a0 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 initializes and
167b0 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 refuses. *
167c0 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 to go further. E
167d0 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 arlier versions
167e0 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 of OpenSSL carri
167f0 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 ed on regardless
16800 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 .. */. sr
16810 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e and((unsigned in
16820 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 t) time((time_t
16830 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 *) NULL));. d
16840 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b o {..for (i = 0;
16850 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a i < 16; i++) {.
16860 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d . rnd_seed[i]
16870 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 = 1 + (char) (2
16880 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 55.0 * rand()/(R
16890 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 AND_MAX+1.0));..
168a0 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 }..RAND_seed(rnd
168b0 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e _seed, sizeof(rn
168c0 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 d_seed));. }
168d0 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 while (RAND_stat
168e0 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 us() != 1);.#end
168f0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 if..#if defined(
16900 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
16910 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
16920 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 THREADS)..Tcl_Mu
16930 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f texUnlock(&init_
16940 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 mx);.#endif...re
16950 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a turn(status);.}.