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 4f Called");..#if O
9460: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
9470: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
9480: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 00L && !defined(
9490: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
94a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f && !defined(NO_
94b0: 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e 65 64 SSL2) && defined
94c0: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 66 (NO_SSL3) && def
94d0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 ined(NO_TLS1) &&
94e0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
94f0: 5f 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e _1) && defined(N
9500: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 64 65 66 O_TLS1_2) && def
9510: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a ined(NO_TLS1_3).
9520: 20 20 20 20 73 73 6c 32 20 3d 20 31 3b 0a 23 65 ssl2 = 1;.#e
9530: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
9540: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
9550: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 3) && !defined(N
9560: 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 66 69 6e O_SSL3) && defin
9570: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 ed(NO_SSL2) && d
9580: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
9590: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
95a0: 53 31 5f 31 29 20 26 26 20 64 65 66 69 6e 65 64 S1_1) && defined
95b0: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 64 (NO_TLS1_2) && d
95c0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
95d0: 29 0a 20 20 20 20 73 73 6c 33 20 3d 20 31 3b 0a ). ssl3 = 1;.
95e0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
95f0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 ed(NO_TLS1) || d
9600: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
9610: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 O_TLS1). tls1
9620: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
9630: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
9640: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
9650: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
9660: 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 ). tls1_1 = 0
9670: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
9680: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
9690: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
96a0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 SL_NO_TLS1_2).
96b0: 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 tls1_2 = 0;.#e
96c0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
96d0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 (NO_TLS1_3) || d
96e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
96f0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c O_TLS1_3). tl
9700: 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 s1_3 = 0;.#endif
9710: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c .. if (objc <
9720: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
9730: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
9740: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
9750: 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 l ?options?");..
9760: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
9770: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
9780: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
9790: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
97a0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
97b0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
97c0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
97d0: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 NULL), NULL);.
97e0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
97f0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
9800: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
9810: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
9820: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
9830: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
9840: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
9850: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
9860: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
9870: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f l(chan);.. fo
9880: 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 r (idx = 2; idx
9890: 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b < objc; idx++) {
98a0: 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 ..char *opt = Tc
98b0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
98c0: 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 bj(objv[idx], NU
98d0: 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 LL);...if (opt[0
98e0: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 ] != '-').. b
98f0: 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 reak;...OPTOBJ("
9900: 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 -alpn", alpn);..
9910: 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c OPTSTR("-cadir",
9920: 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52 CAdir);..OPTSTR
9930: 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 ("-cafile", CAfi
9940: 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d le);..OPTBYTE("-
9950: 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72 cert", cert, cer
9960: 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 t_len);..OPTSTR(
9970: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 "-certfile", cer
9980: 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 tfile);..OPTSTR(
9990: 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 "-cipher", ciphe
99a0: 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 rs);..OPTSTR("-c
99b0: 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 iphers", ciphers
99c0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 );..OPTSTR("-cip
99d0: 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 hersuites", ciph
99e0: 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f ersuites);..OPTO
99f0: 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 BJ("-command", s
9a00: 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 cript);..OPTSTR(
9a10: 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 "-dhparams", DHp
9a20: 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45 arams);..OPTBYTE
9a30: 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 ("-key", key, ke
9a40: 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 y_len);..OPTSTR(
9a50: 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 "-keyfile", keyf
9a60: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
9a70: 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a model", model);.
9a80: 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f .OPTOBJ("-passwo
9a90: 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a rd", password);.
9aa0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f .OPTBOOL("-post_
9ab0: 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 handshake", post
9ac0: 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 _handshake);..OP
9ad0: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 TBOOL("-request"
9ae0: 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 , request);..OPT
9af0: 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c BOOL("-require",
9b00: 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49 require);..OPTI
9b10: 4e 54 28 22 2d 73 65 63 75 72 69 74 79 6c 65 76 NT("-securitylev
9b20: 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 el", level);..OP
9b30: 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c TBOOL("-server",
9b40: 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 server);..OPTST
9b50: 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c R("-servername",
9b60: 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f servername);..O
9b70: 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f PTSTR("-session_
9b80: 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 id", session_id)
9b90: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c ;..OPTBOOL("-ssl
9ba0: 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 2", ssl2);..OPTB
9bb0: 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c OOL("-ssl3", ssl
9bc0: 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 3);..OPTBOOL("-t
9bd0: 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 ls1", tls1);..OP
9be0: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c TBOOL("-tls1.1",
9bf0: 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f tls1_1);..OPTBO
9c00: 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c OL("-tls1.2", tl
9c10: 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 s1_2);..OPTBOOL(
9c20: 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f "-tls1.3", tls1_
9c30: 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61 3);..OPTOBJ("-va
9c40: 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 lidatecommand",
9c50: 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 vcmd);..OPTOBJ("
9c60: 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a -vcmd", vcmd);..
9c70: 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 .OPTBAD("option"
9c80: 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 , "-alpn, -cadir
9c90: 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 , -cafile, -cert
9ca0: 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 , -certfile, -ci
9cb0: 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 pher, -ciphersui
9cc0: 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d tes, -command, -
9cd0: 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 dhparams, -key,
9ce0: 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c -keyfile, -model
9cf0: 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f , -password, -po
9d00: 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 st_handshake, -r
9d10: 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65 equest, -require
9d20: 2c 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c , -securitylevel
9d30: 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 , -server, -serv
9d40: 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e ername, -session
9d50: 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c _id, -ssl2, -ssl
9d60: 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 3, -tls1, -tls1.
9d70: 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 1, -tls1.2, -tls
9d80: 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 1.3, or -validat
9d90: 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 ecommand");...re
9da0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9db0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 }. if (re
9dc0: 71 75 65 73 74 29 09 09 76 65 72 69 66 79 20 7c quest)..verify |
9dd0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 = SSL_VERIFY_CLI
9de0: 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 ENT_ONCE | SSL_V
9df0: 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 ERIFY_PEER;.
9e00: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72 if (request && r
9e10: 65 71 75 69 72 65 29 09 76 65 72 69 66 79 20 7c equire).verify |
9e20: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 = SSL_VERIFY_FAI
9e30: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 L_IF_NO_PEER_CER
9e40: 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 T;. if (reque
9e50: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 st && post_hands
9e60: 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 hake).verify |=
9e70: 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f SSL_VERIFY_POST_
9e80: 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 HANDSHAKE;. i
9e90: 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 f (verify == 0).
9ea0: 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 .verify = SSL_VE
9eb0: 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 RIFY_NONE;..
9ec0: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f proto |= (ssl2 ?
9ed0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 TLS_PROTO_SSL2
9ee0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
9ef0: 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 |= (ssl3 ? TLS_P
9f00: 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a ROTO_SSL3 : 0);.
9f10: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
9f20: 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 s1 ? TLS_PROTO_T
9f30: 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 LS1 : 0);. pr
9f40: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f oto |= (tls1_1 ?
9f50: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
9f60: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 1 : 0);. prot
9f70: 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 o |= (tls1_2 ? T
9f80: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 LS_PROTO_TLS1_2
9f90: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
9fa0: 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 |= (tls1_3 ? TLS
9fb0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 _PROTO_TLS1_3 :
9fc0: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 0);.. /* rese
9fd0: 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 t to NULL if bla
9fe0: 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 nk string provid
9ff0: 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 ed */. if (ce
a000: 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 rt && !*cert)..
a010: 20 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20 cert.
a020: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a030: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 if (key && !*key
a040: 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 ).. key.
a050: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a060: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 if (certfile
a070: 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 && !*certfile)
a080: 20 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 certfile.
a090: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
a0a0: 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 keyfile && !*key
a0b0: 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 file)..keyfile.
a0c0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a0d0: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26 if (ciphers &
a0e0: 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 & !*ciphers).
a0f0: 20 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20 ciphers.
a100: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
a110: 20 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65 if (ciphersuite
a120: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 s && !*ciphersui
a130: 74 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65 tes) ciphersuite
a140: 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 s = NULL;.
a150: 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 if (CAfile && !
a160: 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 *CAfile).
a170: 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 CAfile.
a180: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
a190: 43 41 64 69 72 20 26 26 20 21 2a 43 41 64 69 72 CAdir && !*CAdir
a1a0: 29 09 20 20 20 20 20 20 20 20 43 41 64 69 72 09 ). CAdir.
a1b0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a1c0: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 if (DHparams
a1d0: 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09 && !*DHparams).
a1e0: 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73 DHparams
a1f0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a200: 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 . /* new SSL
a210: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 state */. sta
a220: 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20 tePtr..= (State
a230: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 *) ckalloc((unsi
a240: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61 gned) sizeof(Sta
a250: 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 te));. memset
a260: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 (statePtr, 0, si
a270: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 zeof(State));..
a280: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 statePtr->fla
a290: 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 gs.= flags;.
a2a0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
a2b0: 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 .= interp;. s
a2c0: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 tatePtr->vflags.
a2d0: 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74 = verify;. st
a2e0: 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 atePtr->err.= ""
a2f0: 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 ;.. /* alloca
a300: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 te script */.
a310: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09 if (script) {..
a320: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 (void) Tcl_GetSt
a330: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 ringFromObj(scri
a340: 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 pt, &len);..if (
a350: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 len) {.. stat
a360: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
a370: 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63 script;.. Tc
a380: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 l_IncrRefCount(s
a390: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
a3a0: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 k);..}. }..
a3b0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 /* allocate pa
a3c0: 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 ssword */. if
a3d0: 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 (password) {..(
a3e0: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 void) Tcl_GetStr
a3f0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 ingFromObj(passw
a400: 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 ord, &len);..if
a410: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 (len) {.. sta
a420: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 tePtr->password
a430: 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 = password;..
a440: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
a450: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 t(statePtr->pass
a460: 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a word);..}. }.
a470: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 . /* allocate
a480: 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e validate comman
a490: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d d */. if (vcm
a4a0: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c d) {..(void) Tcl
a4b0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
a4c0: 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 j(vcmd, &len);..
a4d0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 if (len) {..
a4e0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
a4f0: 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f vcmd;.. Tcl_
a500: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 IncrRefCount(sta
a510: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d tePtr->vcmd);..}
a520: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
a530: 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b model != NULL) {
a540: 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 ..int mode;../*
a550: 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 Get the "model"
a560: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e context */..chan
a570: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
a580: 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c l(interp, model,
a590: 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 &mode);..if (ch
a5a0: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
a5b0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 el) NULL) {..
a5c0: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
a5d0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
a5e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
a5f0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a ROR;..}.../*.. *
a600: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
a610: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
a620: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a most channel.. *
a630: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
a640: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
a650: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 );..if (Tcl_GetC
a660: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
a670: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
a680: 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 ype()) {.. Tc
a690: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
a6a0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
a6b0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
a6c0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
a6d0: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
a6e0: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
a6f0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
a700: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
a710: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
a720: 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 T", "CHANNEL", "
a730: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
a740: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
a750: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
a760: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
a770: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
a780: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 R;..}..ctx = ((S
a790: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
a7a0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
a7b0: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 a(chan))->ctx;.
a7c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
a7d0: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 ((ctx = CTX_Init
a7e0: 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 (statePtr, serve
a7f0: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c r, proto, keyfil
a800: 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 e, certfile, key
a810: 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c , cert, key_len,
a820: 0a 09 20 20 20 20 63 65 72 74 5f 6c 65 6e 2c 20 .. cert_len,
a830: 43 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 CAdir, CAfile, c
a840: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 iphers, ciphersu
a850: 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 ites, level, DHp
a860: 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 arams)) == NULL)
a870: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
a880: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
a890: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
a8a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
a8b0: 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 }.. stateP
a8c0: 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a tr->ctx = ctx;..
a8d0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 /*. * We
a8e0: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 need to make su
a8f0: 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e re that the chan
a900: 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e nel works in bin
a910: 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 ary (for the.
a920: 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e * encryption n
a930: 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 ot to get goofed
a940: 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 up).. * We
a950: 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a only want to adj
a960: 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69 6e ust the bufferin
a970: 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e g in pre-v2 chan
a980: 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20 nels, where.
a990: 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 * each channel
a9a0: 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69 in the stack mai
a9b0: 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 ntained its own
a9c0: 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f buffers.. */
a9d0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
a9e0: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
a9f0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
aa00: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
aa10: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
aa20: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 lBlocking);.
aa30: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
aa40: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
aa50: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 Char);. Tcl_D
aa60: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
aa70: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
aa80: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
aa90: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
aaa0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 rp, chan, "-eofc
aab0: 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e har", &upperChan
aac0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 nelEOFChar);.
aad0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
aae0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
aaf0: 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c an, "-encoding",
ab00: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e &upperChannelEn
ab10: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c coding);. Tcl
ab20: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
ab30: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
ab40: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 "-translation",
ab50: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
ab60: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 nslation);. T
ab70: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
ab80: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
ab90: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 , "-blocking", &
aba0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
abb0: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 king);. Tcl_S
abc0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
abd0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
abe0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 translation", "b
abf0: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c inary");. Tcl
ac00: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
ac10: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
ac20: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 "-blocking", "tr
ac30: 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 ue");. dprint
ac40: 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c f("Consuming Tcl
ac50: 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 channel %s", Tc
ac60: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
ac70: 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 (chan));. sta
ac80: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 tePtr->self = Tc
ac90: 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 l_StackChannel(i
aca0: 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e nterp, Tls_Chann
acb0: 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e elType(), (Clien
acc0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c tData) statePtr,
acd0: 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c (TCL_READABLE |
ace0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 TCL_WRITABLE),
acf0: 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e chan);. dprin
ad00: 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e tf("Created chan
ad10: 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 nel named %s", T
ad20: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
ad30: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
ad40: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 ));. if (stat
ad50: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 ePtr->self == (T
ad60: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
ad70: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 ) {../*.. * No u
ad80: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 se of Tcl_Eventu
ad90: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 allyFree because
ada0: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c no possible Tcl
adb0: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a _Preserve... */.
adc0: 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 .Tls_Free((char
add0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 *) statePtr);..r
ade0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
adf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
ae00: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
ae10: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
ae20: 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 r->self, "-trans
ae30: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 lation", Tcl_DSt
ae40: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
ae50: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
ae60: 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 on));. Tcl_Se
ae70: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
ae80: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
ae90: 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e >self, "-encodin
aea0: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 g", Tcl_DStringV
aeb0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
aec0: 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 elEncoding));.
aed0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
aee0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 Option(interp, s
aef0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 tatePtr->self, "
af00: 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 -eofchar", Tcl_D
af10: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
af20: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
af30: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ));. Tcl_SetC
af40: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
af50: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
af60: 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 elf, "-blocking"
af70: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
af80: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
af90: 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 Blocking));..
afa0: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 /*. * SSL I
afb0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 nitialization.
afc0: 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 */. stateP
afd0: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 tr->ssl = SSL_ne
afe0: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 w(statePtr->ctx)
aff0: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65 ;. if (!state
b000: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 Ptr->ssl) {../*
b010: 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f SSL library erro
b020: 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 r */..Tcl_Append
b030: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b040: 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 couldn't constru
b050: 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 ct ssl session:
b060: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 ", REASON(), (ch
b070: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b080: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
b090: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
b0a0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 , "IMPORT", "INI
b0b0: 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 T", "FAILED", (c
b0c0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 har *) NULL);..T
b0d0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
b0e0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 statePtr);..ret
b0f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
b100: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 }.. /* Set
b110: 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d host server nam
b120: 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 e */. if (ser
b130: 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 vername) {../* S
b140: 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e ets the server n
b150: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 ame indication (
b160: 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 SNI) in ClientHe
b170: 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f llo extension */
b180: 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 ../* Per RFC 606
b190: 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 6, hostname is a
b1a0: 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 ASCII encoded s
b1b0: 74 72 69 6e 67 2e 20 2a 2f 0a 09 69 66 20 28 21 tring. */..if (!
b1c0: 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 SSL_set_tlsext_h
b1d0: 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 ost_name(statePt
b1e0: 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 r->ssl, serverna
b1f0: 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20 me) && require)
b200: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
b210: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
b220: 22 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f 73 "setting TLS hos
b230: 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e t name extension
b240: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 failed", (char
b250: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b260: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
b270: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
b280: 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 IMPORT", "SNI",
b290: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
b2a0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b2b0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
b2c0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
b2d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
b2e0: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 66 69 R;..}.../* Confi
b2f0: 67 75 72 65 20 73 65 72 76 65 72 20 68 6f 73 74 gure server host
b300: 20 6e 61 6d 65 20 63 68 65 63 6b 73 20 69 6e 20 name checks in
b310: 74 68 65 20 53 53 4c 20 63 6c 69 65 6e 74 2e 20 the SSL client.
b320: 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 Set DNS hostname
b330: 20 74 6f 0a 09 20 20 20 6e 61 6d 65 20 66 6f 72 to.. name for
b340: 20 70 65 65 72 20 63 65 72 74 69 66 69 63 61 74 peer certificat
b350: 65 20 63 68 65 63 6b 73 2e 20 53 53 4c 5f 73 65 e checks. SSL_se
b360: 74 31 5f 68 6f 73 74 20 68 61 73 20 6c 69 6d 69 t1_host has limi
b370: 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 tations. */..if
b380: 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 (!SSL_add1_host(
b390: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 statePtr->ssl, s
b3a0: 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 ervername)) {..
b3b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
b3c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74 ult(interp, "set
b3d0: 74 69 6e 67 20 44 4e 53 20 68 6f 73 74 20 6e 61 ting DNS host na
b3e0: 6d 65 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 me failed", (cha
b3f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
b400: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 Tcl_SetErrorCod
b410: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
b420: 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 "IMPORT", "HOST
b430: 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c NAME", "FAILED",
b440: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b450: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
b460: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
b470: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
b480: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 CL_ERROR;..}.
b490: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d }.. /* Resum
b4a0: 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a e session id */.
b4b0: 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f if (session_
b4c0: 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 id && strlen(ses
b4d0: 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f sion_id) <= SSL_
b4e0: 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 MAX_SID_CTX_LENG
b4f0: 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 TH) {../* SSL_se
b500: 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 t_session() */..
b510: 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e if (!SSL_SESSION
b520: 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 _set1_id_context
b530: 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e (SSL_get_session
b540: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c (statePtr->ssl),
b550: 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e session_id, (un
b560: 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c signed int) strl
b570: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 en(session_id)))
b580: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
b590: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
b5a0: 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e "Resume session
b5b0: 20 69 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69 id ", session_i
b5c0: 64 2c 20 22 20 66 61 69 6c 65 64 22 2c 20 28 63 d, " failed", (c
b5d0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
b5e0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
b5f0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
b600: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 ", "IMPORT", "SE
b610: 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 SSION", "FAILED"
b620: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b630: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6c ;. Tl
b640: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
b650: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 statePtr);.
b660: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 return TC
b670: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 L_ERROR;..}.
b680: 7d 0a 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 }.. if (alpn)
b690: 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 {../* Convert a
b6a0: 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 TCL list into a
b6b0: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 protocol-list i
b6c0: 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f n wire-format */
b6d0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
b6e0: 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e *protos, *p;..un
b6f0: 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f signed int proto
b700: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 s_len = 0;..int
b710: 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 i, len, cnt;..Tc
b720: 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 l_Obj **list;...
b730: 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 if (Tcl_ListObjG
b740: 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 etElements(inter
b750: 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 p, alpn, &cnt, &
b760: 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 list) != TCL_OK)
b770: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
b780: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
b790: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
b7a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
b7b0: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 ./* Determine th
b7c0: 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 e memory require
b7d0: 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 d for the protoc
b7e0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 ol-list */..for
b7f0: 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b (i = 0; i < cnt;
b800: 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c i++) {.. Tcl
b810: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
b820: 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 j(list[i], &len)
b830: 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e ;.. if (len >
b840: 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 255) {...Tcl_Ap
b850: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
b860: 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f p, "ALPN protoco
b870: 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 l name too long"
b880: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b890: 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 ;...Tcl_SetError
b8a0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
b8b0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 S", "IMPORT", "A
b8c0: 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 LPN", "FAILED",
b8d0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
b8e0: 09 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 ..Tls_Free((char
b8f0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
b900: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
b910: 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 R;.. }.. p
b920: 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b rotos_len += 1 +
b930: 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 len;..}.../* Bu
b940: 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 ild the complete
b950: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a protocol-list *
b960: 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c /..protos = ckal
b970: 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b loc(protos_len);
b980: 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 ../* protocol-li
b990: 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 sts consist of 8
b9a0: 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 -bit length-pref
b9b0: 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e ixed, byte strin
b9c0: 67 73 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 gs */..for (i =
b9d0: 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 69 0, p = protos; i
b9e0: 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 < cnt; i++) {..
b9f0: 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 char *str =
ba00: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
ba10: 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c mObj(list[i], &l
ba20: 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d en);.. *p++ =
ba30: 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 len;.. memcp
ba40: 79 28 70 2c 20 73 74 72 2c 20 6c 65 6e 29 3b 0a y(p, str, len);.
ba50: 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 . p += len;..
ba60: 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 }.../* SSL_set_a
ba70: 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 lpn_protos makes
ba80: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 a copy of the p
ba90: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a rotocol-list */.
baa0: 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 ./* Note: This f
bab0: 75 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 73 65 unctions reverse
bac0: 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c s the return val
bad0: 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f ue convention */
bae0: 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c ..if (SSL_set_al
baf0: 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 pn_protos(stateP
bb00: 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c tr->ssl, protos,
bb10: 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a protos_len)) {.
bb20: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
bb30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 esult(interp, "f
bb40: 61 69 6c 65 64 20 74 6f 20 73 65 74 20 41 4c 50 ailed to set ALP
bb50: 4e 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 N protocols", (c
bb60: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
bb70: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
bb80: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
bb90: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c ", "IMPORT", "AL
bba0: 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 PN", "FAILED", (
bbb0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
bbc0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
bbd0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
bbe0: 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72 6f .. ckfree(pro
bbf0: 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72 tos);.. retur
bc00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
bc10: 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f ../* Store proto
bc20: 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74 cols list */..st
bc30: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d atePtr->protos =
bc40: 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50 protos;..stateP
bc50: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d tr->protos_len =
bc60: 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 protos_len;.
bc70: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 } else {..state
bc80: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 Ptr->protos = NU
bc90: 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 LL;..statePtr->p
bca0: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 rotos_len = 0;.
bcb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
bcc0: 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b * SSL Callback
bcd0: 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 s. */. SS
bce0: 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 73 L_set_app_data(s
bcf0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 tatePtr->ssl, (v
bd00: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
bd10: 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 ./* point back t
bd20: 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f o us */. SSL_
bd30: 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 65 set_verify(state
bd40: 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 Ptr->ssl, verify
bd50: 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b , VerifyCallback
bd60: 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 );. SSL_set_i
bd70: 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 nfo_callback(sta
bd80: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f tePtr->ssl, Info
bd90: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 Callback);..
bda0: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 /* Callback for
bdb0: 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74 6f 63 observing protoc
bdc0: 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23 ol messages */.#
bdd0: 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e ifndef OPENSSL_N
bde0: 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20 20 20 O_SSL_TRACE.
bdf0: 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f /* void SSL_CTX_
be00: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
be10: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 _arg(statePtr->c
be20: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 tx, (void *)stat
be30: 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69 64 20 ePtr);. void
be40: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f SSL_CTX_set_msg_
be50: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
be60: 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67 65 43 r->ctx, MessageC
be70: 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 allback); */.
be80: 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c SSL_set_msg_cal
be90: 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 lback_arg(stateP
bea0: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a tr->ssl, (void *
beb0: 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 )statePtr);.
bec0: 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c SSL_set_msg_call
bed0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 back(statePtr->s
bee0: 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 sl, MessageCallb
bef0: 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 ack);.#endif..
bf00: 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f /* Create Tcl_
bf10: 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 Channel BIO Hand
bf20: 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 ler */. state
bf30: 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f Ptr->p_bio.= BIO
bf40: 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74 _new_tcl(statePt
bf50: 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b r, BIO_NOCLOSE);
bf60: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 . statePtr->b
bf70: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f io.= BIO_new(BIO
bf80: 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 _f_ssl());..
bf90: 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f if (server) {../
bfa0: 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63 * Server callbac
bfb0: 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 ks */..SSL_CTX_s
bfc0: 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 et_tlsext_server
bfd0: 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74 name_arg(statePt
bfe0: 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 r->ctx, (void *)
bff0: 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f statePtr);..SSL_
c000: 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 CTX_set_tlsext_s
c010: 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 ervername_callba
c020: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ck(statePtr->ctx
c030: 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a , SNICallback);.
c040: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 .SSL_CTX_set_cli
c050: 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 ent_hello_cb(sta
c060: 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c tePtr->ctx, Hell
c070: 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 oCallback, (void
c080: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 69 *)statePtr);..i
c090: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f f (statePtr->pro
c0a0: 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 tos != NULL) {..
c0b0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
c0c0: 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 alpn_select_cb(s
c0d0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c tatePtr->ctx, AL
c0e0: 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 PNCallback, (voi
c0f0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 23 d *)statePtr);.#
c100: 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 ifdef USE_NPN..
c110: 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d if (tls1_2 ==
c120: 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 0 && tls1_3 ==
c130: 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 0) {...SSL_CTX_s
c140: 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 et_next_protos_a
c150: 64 76 65 72 74 69 73 65 64 5f 63 62 28 73 74 61 dvertised_cb(sta
c160: 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 tePtr->ctx, NPNC
c170: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
c180: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 )statePtr);..
c190: 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f }.#endif..}.../
c1a0: 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72 20 * Enable server
c1b0: 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65 71 to send cert req
c1c0: 75 65 73 74 20 61 66 74 65 72 20 68 61 6e 64 73 uest after hands
c1d0: 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e hake (TLS 1.3 on
c1e0: 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 ly) */../* A wri
c1f0: 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 te operation mus
c200: 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 t take place for
c210: 20 74 68 65 20 43 65 72 74 69 66 69 63 61 74 65 the Certificate
c220: 20 52 65 71 75 65 73 74 20 74 6f 20 62 65 0a 09 Request to be..
c230: 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65 20 63 sent to the c
c240: 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 lient, this can
c250: 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53 53 4c be done with SSL
c260: 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e _do_handshake().
c270: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 */..if (request
c280: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 && post_handsha
c290: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 ke) {.. SSL_v
c2a0: 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 erify_client_pos
c2b0: 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74 t_handshake(stat
c2c0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a ePtr->ssl);..}..
c2d0: 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d ./* Set server m
c2e0: 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 ode */..statePtr
c2f0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 ->flags |= TLS_T
c300: 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f CL_SERVER;..SSL_
c310: 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 set_accept_state
c320: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
c330: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f . } else {../
c340: 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 * Client callbac
c350: 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 ks */.#ifdef USE
c360: 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50 _NPN..if (stateP
c370: 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 tr->protos != NU
c380: 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 LL && tls1_2 ==
c390: 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 0 && tls1_3 == 0
c3a0: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 ) {.. SSL_CTX
c3b0: 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f _set_next_proto_
c3c0: 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 select_cb(stateP
c3d0: 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c tr->ctx, ALPNCal
c3e0: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
c3f0: 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e tatePtr);..}.#en
c400: 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e dif.../* Session
c410: 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c caching */..SSL
c420: 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e _CTX_set_session
c430: 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 _cache_mode(stat
c440: 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 ePtr->ctx, SSL_S
c450: 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 ESS_CACHE_CLIENT
c460: 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 | SSL_SESS_CACH
c470: 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 E_NO_INTERNAL_ST
c480: 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ORE);..SSL_CTX_s
c490: 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 ess_set_new_cb(s
c4a0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 tatePtr->ctx, Se
c4b0: 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a ssionCallback);.
c4c0: 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 ../* Enable post
c4d0: 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 handshake Authe
c4e0: 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 ntication extens
c4f0: 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c ion. TLS 1.3 onl
c500: 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a y, not http/2. *
c510: 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 /..if (request &
c520: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 & post_handshake
c530: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 ) {.. SSL_set
c540: 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f _post_handshake_
c550: 61 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 auth(statePtr->s
c560: 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 sl, 1);..}.../*
c570: 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 Set client mode
c580: 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e */..SSL_set_conn
c590: 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 ect_state(stateP
c5a0: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a tr->ssl);. }.
c5b0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 SSL_set_bio(
c5c0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 statePtr->ssl, s
c5d0: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 tatePtr->p_bio,
c5e0: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 statePtr->p_bio)
c5f0: 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 ;. BIO_set_ss
c600: 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c l(statePtr->bio,
c610: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 statePtr->ssl,
c620: 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 BIO_NOCLOSE);..
c630: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 /*. * End
c640: 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 of SSL Init.
c650: 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 */. dprintf
c660: 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c ("Returning %s",
c670: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
c680: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
c690: 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 lf));. Tcl_Se
c6a0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
c6b0: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
c6c0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
c6d0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c ePtr->self), TCL
c6e0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 _VOLATILE);..
c6f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
c700: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
c710: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
c720: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
c730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c760: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 ------. *. * Uni
c770: 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 mportObjCmd --.
c780: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
c790: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ure is invoked t
c7a0: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 o remove the top
c7b0: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c most channel fil
c7c0: 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ter.. *. * Resul
c7d0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
c7e0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
c7f0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
c800: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 :. *.May modify
c810: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 the behavior of
c820: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 an IO channel..
c830: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
c840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c870: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
c880: 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f ic int.UnimportO
c890: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
c8a0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
c8b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
c8c0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
c8d0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
c8e0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ) {. Tcl_Chan
c8f0: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 nel chan;../* Th
c900: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 e channel to set
c910: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a a mode on. */..
c920: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
c930: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
c940: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 objc != 2) {..Tc
c950: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
c960: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
c970: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 "channel");..ret
c980: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
c990: 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d }.. chan =
c9a0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
c9b0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
c9c0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 tring(objv[1]),
c9d0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
c9e0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
c9f0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
ca00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
ca10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
ca20: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
ca30: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
ca40: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
ca50: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
ca60: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
ca70: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 .. if (Tcl_Ge
ca80: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
ca90: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
caa0: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f lType()) {..Tcl_
cab0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
cac0: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
cad0: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
cae0: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
caf0: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c ..."\": not a TL
cb00: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c S channel", NULL
cb10: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
cb20: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
cb30: 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 "TLS", "UNIMPOR
cb40: 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 T", "CHANNEL", "
cb50: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
cb60: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
cb70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
cb80: 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f }.. if (Tcl_
cb90: 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 UnstackChannel(i
cba0: 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 nterp, chan) ==
cbb0: 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 TCL_ERROR) {..re
cbc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
cbd0: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 }.. retur
cbe0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e n TCL_OK;..clien
cbf0: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
cc00: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ta;.}.../*. *---
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc50: 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 . *. * CTX_Init
cc60: 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 -- construct a S
cc70: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a SL_CTX instance.
cc80: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
cc90: 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 *.A valid SSL_CT
cca0: 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 X instance or NU
ccb0: 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 LL.. *. * Side e
ccc0: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 ffects:. *.const
ccd0: 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 ructs SSL contex
cce0: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d t (CTX). *. *---
ccf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd30: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f . */.static SSL_
cd40: 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 CTX *.CTX_Init(S
cd50: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
cd60: 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e int isServer, in
cd70: 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b t proto, char *k
cd80: 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 eyfile, char *ce
cd90: 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 rtfile,. unsi
cda0: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 gned char *key,
cdb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 unsigned char *c
cdc0: 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e ert, int key_len
cdd0: 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 , int cert_len,
cde0: 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 20 char *CAdir,.
cdf0: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 char *CAfile, c
ce00: 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 har *ciphers, ch
ce10: 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 ar *ciphersuites
ce20: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 , int level, cha
ce30: 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 r *DHparams) {.
ce40: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
ce50: 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 nterp = statePtr
ce60: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 ->interp;. SS
ce70: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c L_CTX *ctx = NUL
ce80: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 L;. Tcl_DStri
ce90: 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 ng ds;. Tcl_D
cea0: 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 String ds1;.
ceb0: 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 int off = 0;.
cec0: 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 int load_privat
ced0: 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 e_key;. const
cee0: 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 SSL_METHOD *met
cef0: 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 hod;.. dprint
cf00: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
cf10: 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a if (!proto) {.
cf20: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
cf30: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 t(interp, "no va
cf40: 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c lid protocol sel
cf50: 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 ected", NULL);..
cf60: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
cf70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 }.. /* creat
cf80: 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f e SSL context */
cf90: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
cfa0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 SION_NUMBER >= 0
cfb0: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 x10100000L || de
cfc0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c fined(NO_SSL2) |
cfd0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
cfe0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 L_NO_SSL2). i
cff0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
d000: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 , TLS_PROTO_SSL2
d010: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
d020: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d030: 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f SSL2 protocol no
d040: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
d050: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
d060: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
d070: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 #if defined(NO_S
d080: 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 SL3) || defined(
d090: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
d0a0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
d0b0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
d0c0: 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f O_SSL3)) {..Tcl_
d0d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d0e0: 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f erp, "SSL3 proto
d0f0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
d100: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 d", NULL);..retu
d110: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
d120: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
d130: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 d(NO_TLS1) || de
d140: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d150: 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 _TLS1). if (E
d160: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
d170: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b S_PROTO_TLS1)) {
d180: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
d190: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 lt(interp, "TLS
d1a0: 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 1.0 protocol not
d1b0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
d1c0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
d1d0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
d1e0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
d1f0: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
d200: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d210: 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 _1). if (ENAB
d220: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
d230: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a ROTO_TLS1_1)) {.
d240: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
d250: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
d260: 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .1 protocol not
d270: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
d280: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
d290: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 . }.#endif.#i
d2a0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
d2b0: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
d2c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
d2d0: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 2). if (ENABL
d2e0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d2f0: 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 OTO_TLS1_2)) {..
d300: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d310: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e (interp, "TLS 1.
d320: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 2 protocol not s
d330: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
d340: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
d350: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
d360: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
d370: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _3) || defined(O
d380: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
d390: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
d3a0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
d3b0: 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 TO_TLS1_3)) {..T
d3c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d3d0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 interp, "TLS 1.3
d3e0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
d3f0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
d400: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
d410: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 }.#endif..
d420: 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 switch (proto)
d430: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 {.#if OPENSSL_VE
d440: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
d450: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
d460: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
d470: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
d480: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
d490: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
d4a0: 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 SSL2:..method =
d4b0: 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 isServer ? SSLv2
d4c0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
d4d0: 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f : SSLv2_client_
d4e0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
d4f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
d500: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
d510: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d520: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 SL_NO_SSL3) && !
d530: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d540: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a NO_SSL3_METHOD).
d550: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
d560: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 TO_SSL3:..method
d570: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 = isServer ? SS
d580: 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f Lv3_server_metho
d590: 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 d() : SSLv3_clie
d5a0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
d5b0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
d5c0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
d5d0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d5e0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 ENSSL_NO_TLS1) &
d5f0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d600: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
d610: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
d620: 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 PROTO_TLS1:..met
d630: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
d640: 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 TLSv1_server_me
d650: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 thod() : TLSv1_c
d660: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
d670: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
d680: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
d690: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
d6a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d6b0: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
d6c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d6d0: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_1_METHOD).
d6e0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
d6f0: 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_1:..method =
d700: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
d710: 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 1_1_server_metho
d720: 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c d() : TLSv1_1_cl
d730: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
d740: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
d750: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
d760: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
d770: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d780: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
d790: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d7a0: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 _2_METHOD). c
d7b0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
d7c0: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 S1_2:..method =
d7d0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 isServer ? TLSv1
d7e0: 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 _2_server_method
d7f0: 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 () : TLSv1_2_cli
d800: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
d810: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
d820: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
d830: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
d840: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d850: 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 _3). case TLS
d860: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 _PROTO_TLS1_3:..
d870: 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 /* Use the gener
d880: 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f ic method and co
d890: 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 nstraint range a
d8a0: 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 fter context is
d8b0: 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 created */..meth
d8c0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
d8d0: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f TLS_server_metho
d8e0: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 d() : TLS_client
d8f0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
d900: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 k;.#endif. de
d910: 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 fault:../* Negot
d920: 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61 iate highest ava
d930: 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 ilable SSL/TLS v
d940: 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f ersion */..metho
d950: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
d960: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 LS_server_method
d970: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f () : TLS_client_
d980: 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 method();.#if OP
d990: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
d9a0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
d9b0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
d9c0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
d9d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
d9e0: 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e SL2)..off |= (EN
d9f0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
da00: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f _PROTO_SSL2) ?
da10: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 0 : SSL_OP_NO_S
da20: 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 SLv2);.#endif.#i
da30: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
da40: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
da50: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
da60: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
da70: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
da80: 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a TO_SSL3) ? 0 :
da90: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 SSL_OP_NO_SSLv3
daa0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
dab0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
dac0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
dad0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 SSL_NO_TLS1)..of
dae0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
daf0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
db00: 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c LS1) ? 0 : SSL
db10: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 _OP_NO_TLSv1);.#
db20: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
db30: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
db40: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
db50: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 L_NO_TLS1_1)..of
db60: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
db70: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
db80: 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c LS1_1) ? 0 : SSL
db90: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b _OP_NO_TLSv1_1);
dba0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
dbb0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
dbc0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
dbd0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 SSL_NO_TLS1_2)..
dbe0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
dbf0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
dc00: 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 _TLS1_2) ? 0 : S
dc10: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 SL_OP_NO_TLSv1_2
dc20: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
dc30: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
dc40: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
dc50: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
dc60: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
dc70: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
dc80: 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a TO_TLS1_3) ? 0 :
dc90: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
dca0: 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 _3);.#endif..bre
dcb0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 ak;. }.. E
dcc0: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
dcd0: 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c ;.. ctx = SSL
dce0: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 _CTX_new(method)
dcf0: 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20 ;. if (!ctx)
dd00: 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b {..return(NULL);
dd10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
dd20: 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 getenv(SSLKEYLOG
dd30: 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 FILE)) {..SSL_CT
dd40: 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c X_set_keylog_cal
dd50: 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f lback(ctx, KeyLo
dd60: 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 gCallback);.
dd70: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 }..#if !defined(
dd80: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
dd90: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
dda0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 O_TLS1_3). if
ddb0: 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 (proto == TLS_P
ddc0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 ROTO_TLS1_3) {..
ddd0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f SSL_CTX_set_min_
dde0: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
ddf0: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f x, TLS1_3_VERSIO
de00: 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 N);..SSL_CTX_set
de10: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _max_proto_versi
de20: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 on(ctx, TLS1_3_V
de30: 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 ERSION);. }.#
de40: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f endif.. /* Fo
de50: 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 rce cipher selec
de60: 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 tion order by se
de70: 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 rver */. if (
de80: 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 !isServer) {..SS
de90: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e L_CTX_set_option
dea0: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 s(ctx, SSL_OP_CI
deb0: 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 PHER_SERVER_PREF
dec0: 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a ERENCE);. }..
ded0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
dee0: 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76 app_data(ctx, (v
def0: 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a oid*)interp);./*
df00: 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e remember the in
df10: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 terpreter */.
df20: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 SSL_CTX_set_opt
df30: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 ions(ctx, SSL_OP
df40: 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 _ALL);./* all SS
df50: 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 L bug workaround
df60: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 s */. SSL_CTX
df70: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 _set_options(ctx
df80: 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 , off);../* disa
df90: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 ble protocol ver
dfa0: 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 sions */.#if OPE
dfb0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
dfc0: 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 BER < 0x10101000
dfd0: 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 L. SSL_CTX_se
dfe0: 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f t_mode(ctx, SSL_
dff0: 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 MODE_AUTO_RETRY)
e000: 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 ;./* handle new
e010: 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61 handshakes in ba
e020: 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 ckground. On by
e030: 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 default in OpenS
e040: 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e SL 1.1.1. */.#en
e050: 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f dif. SSL_CTX_
e060: 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 sess_set_cache_s
e070: 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a ize(ctx, 128);..
e080: 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 /* Set user
e090: 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c defined ciphers,
e0a0: 20 63 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 cipher suites,
e0b0: 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 and security lev
e0c0: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 el */. if ((c
e0d0: 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 iphers != NULL)
e0e0: 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f && !SSL_CTX_set_
e0f0: 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c cipher_list(ctx,
e100: 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 54 63 ciphers)) {..Tc
e110: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e120: 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 nterp, "Set ciph
e130: 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 ers failed: No v
e140: 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 alid ciphers", (
e150: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
e160: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
e170: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
e180: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
e190: 63 69 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 ciphersuites !=
e1a0: 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 NULL) && !SSL_CT
e1b0: 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 X_set_ciphersuit
e1c0: 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 es(ctx, ciphersu
e1d0: 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ites)) {..Tcl_Ap
e1e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
e1f0: 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 20 73 p, "Set cipher s
e200: 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f uites failed: No
e210: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c valid ciphers",
e220: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
e230: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
e240: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
e250: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a L;. }.. /*
e260: 20 53 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 Set security le
e270: 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c vel */. if (l
e280: 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 evel > -1 && lev
e290: 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 el < 6) {../* SS
e2a0: 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c L_set_security_l
e2b0: 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 evel */..SSL_CTX
e2c0: 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _set_security_le
e2d0: 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b vel(ctx, level);
e2e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 . }.. /* s
e2f0: 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b et some callback
e300: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 s */. SSL_CTX
e310: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 _set_default_pas
e320: 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73 swd_cb(ctx, Pass
e330: 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 wordCallback);.
e340: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 SSL_CTX_set_d
e350: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 efault_passwd_cb
e360: 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 28 _userdata(ctx, (
e370: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
e380: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61 ;.. /* read a
e390: 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 Diffie-Hellman
e3a0: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c parameters file,
e3b0: 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 6c or use the buil
e3c0: 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 t-in one */.#ifd
e3d0: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 ef OPENSSL_NO_DH
e3e0: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d . if (DHparam
e3f0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 s != NULL) {..Tc
e400: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e410: 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d nterp, "DH param
e420: 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 eter support not
e430: 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 available", (ch
e440: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 ar *) NULL);..SS
e450: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
e460: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
e470: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b }.#else. {
e480: 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 ..DH* dh;..if (D
e490: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 Hparams != NULL)
e4a0: 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f {.. BIO *bio
e4b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 ;.. Tcl_DStri
e4c0: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 ngInit(&ds);..
e4d0: 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f bio = BIO_new_
e4e0: 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d file(F2N(DHparam
e4f0: 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 s, &ds), "r");..
e500: 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a if (!bio) {.
e510: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
e520: 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 e(&ds);...Tcl_Ap
e530: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
e540: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 p, "Could not fi
e550: 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 nd DH parameters
e560: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 file", (char *)
e570: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
e580: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
e590: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
e5a0: 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45 }... dh = PE
e5b0: 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 M_read_bio_DHpar
e5c0: 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e ams(bio, NULL, N
e5d0: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ULL, NULL);..
e5e0: 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a BIO_free(bio);.
e5f0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
e600: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
e610: 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c if (!dh) {...Tcl
e620: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e630: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 terp, "Could not
e640: 20 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 74 read DH paramet
e650: 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 ers from file",
e660: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
e670: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
e680: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
e690: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c LL;.. }..} el
e6a0: 73 65 20 7b 0a 09 20 20 20 20 64 68 20 3d 20 67 se {.. dh = g
e6b0: 65 74 5f 64 68 50 61 72 61 6d 73 28 29 3b 0a 09 et_dhParams();..
e6c0: 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 }..SSL_CTX_set_t
e6d0: 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a mp_dh(ctx, dh);.
e6e0: 09 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 20 20 .DH_free(dh);.
e6f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 }.#endif..
e700: 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 /* set our certi
e710: 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f ficate */. lo
e720: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d ad_private_key =
e730: 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 0;. if (cert
e740: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
e750: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 .load_private_ke
e760: 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 y = 1;...Tcl_DSt
e770: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a ringInit(&ds);..
e780: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 .if (SSL_CTX_use
e790: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c _certificate_fil
e7a0: 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 e(ctx, F2N(certf
e7b0: 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 ile, &ds), SSL_F
e7c0: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 ILETYPE_PEM) <=
e7d0: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 0) {.. Tcl_DS
e7e0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
e7f0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
e800: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
e810: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 nable to set cer
e820: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c tificate file ",
e830: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c certfile, ": ",
e840: 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 .... REASON(
e850: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
e860: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
e870: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 free(ctx);..
e880: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a return NULL;..}.
e890: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
e8a0: 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ert != NULL) {..
e8b0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 load_private_key
e8c0: 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43 = 1;..if (SSL_C
e8d0: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 TX_use_certifica
e8e0: 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 72 te_ASN1(ctx, cer
e8f0: 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 t_len, cert) <=
e900: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 0) {.. Tcl_DS
e910: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
e920: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
e930: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
e940: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 nable to set cer
e950: 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 09 tificate: ",....
e960: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 REASON(), (
e970: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
e980: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
e990: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 (ctx);.. retu
e9a0: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 rn NULL;..}.
e9b0: 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 } else {..certfi
e9c0: 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 le = (char*)X509
e9d0: 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 _get_default_cer
e9e0: 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 t_file();...if (
e9f0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 SSL_CTX_use_cert
ea00: 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 ificate_file(ctx
ea10: 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f , certfile, SSL_
ea20: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d FILETYPE_PEM) <=
ea30: 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 0) {.#if 0..
ea40: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
ea50: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f (&ds);.. Tcl_
ea60: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
ea70: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
ea80: 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 use default cert
ea90: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 ificate file ",
eaa0: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a certfile, ": ",.
eab0: 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 ... REASON()
eac0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
ead0: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
eae0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
eaf0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 eturn NULL;.#end
eb00: 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 if..}. }..
eb10: 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 /* set our priv
eb20: 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 ate key */. i
eb30: 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f f (load_private_
eb40: 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 key) {..if (keyf
eb50: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b ile == NULL && k
eb60: 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 ey == NULL) {..
eb70: 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 keyfile = cer
eb80: 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 tfile;..}...if (
eb90: 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 keyfile != NULL)
eba0: 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 {.. /* get t
ebb0: 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 he private key a
ebc0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 ssociated with t
ebd0: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 his certificate
ebe0: 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 */.. if (keyf
ebf0: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile == NULL) {..
ec00: 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 .keyfile = certf
ec10: 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ile;.. }...
ec20: 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 if (SSL_CTX_us
ec30: 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c e_PrivateKey_fil
ec40: 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 e(ctx, F2N(keyfi
ec50: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 le, &ds), SSL_FI
ec60: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 LETYPE_PEM) <= 0
ec70: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
ec80: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a gFree(&ds);.../*
ec90: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
eca0: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
ecb0: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
ecc0: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
ecd0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
ece0: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
ecf0: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
ed00: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ed10: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
ed20: 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 public key file
ed30: 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c ", keyfile, " ",
ed40: 0a 09 09 09 20 20 20 20 20 20 20 20 20 52 45 41 .... REA
ed50: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
ed60: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
ed70: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
ed80: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
ed90: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
eda0: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d ngFree(&ds);...}
edb0: 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d else if (key !=
edc0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 NULL) {.. if
edd0: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 (SSL_CTX_use_Pr
ede0: 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 ivateKey_ASN1(EV
edf0: 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c P_PKEY_RSA, ctx,
ee00: 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d key,key_len) <=
ee10: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 0) {...Tcl_DStr
ee20: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 ingFree(&ds);...
ee30: 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 /* flush the pas
ee40: 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 sphrase which mi
ee50: 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 ght be left in t
ee60: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 he result */...T
ee70: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
ee80: 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 erp, NULL, TCL_S
ee90: 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 TATIC);...Tcl_Ap
eea0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
eeb0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
eec0: 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c t public key: ",
eed0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
eee0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
eef0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
ef00: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
ef10: 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 }..}../* Now
ef20: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 we know that a
ef30: 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 76 key and cert hav
ef40: 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e e been set again
ef50: 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63 st.. * the SSL c
ef60: 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21 ontext */..if (!
ef70: 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 SSL_CTX_check_pr
ef80: 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20 ivate_key(ctx))
ef90: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
efa0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
efb0: 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f 65 "private key doe
efc0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 s not match the
efd0: 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62 6c certificate publ
efe0: 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 20 20 ic key",....
eff0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
f000: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
f010: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
f020: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 turn NULL;..}.
f030: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 }.. /* Set
f040: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 43 41 73 verification CAs
f050: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 */. Tcl_DStr
f060: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 20 ingInit(&ds);.
f070: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
f080: 74 28 26 64 73 31 29 3b 0a 20 20 20 20 2f 2a 20 t(&ds1);. /*
f090: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 64 65 66 There is one def
f0a0: 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 2c 20 ault directory,
f0b0: 6f 6e 65 20 64 65 66 61 75 6c 74 20 66 69 6c 65 one default file
f0c0: 2c 20 61 6e 64 20 6f 6e 65 20 64 65 66 61 75 6c , and one defaul
f0d0: 74 20 73 74 6f 72 65 2e 0a 09 54 68 65 20 64 65 t store...The de
f0e0: 66 61 75 6c 74 20 43 41 20 63 65 72 74 69 66 69 fault CA certifi
f0f0: 63 61 74 65 73 20 64 69 72 65 63 74 6f 72 79 20 cates directory
f100: 28 61 6e 64 20 64 65 66 61 75 6c 74 20 73 74 6f (and default sto
f110: 72 65 29 20 69 73 20 69 6e 20 74 68 65 20 4f 70 re) is in the Op
f120: 65 6e 53 53 4c 0a 09 63 65 72 74 73 20 64 69 72 enSSL..certs dir
f130: 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 62 ectory. It can b
f140: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 e overridden by
f150: 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 the SSL_CERT_DIR
f160: 20 65 6e 76 20 76 61 72 2e 20 54 68 65 0a 09 64 env var. The..d
f170: 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 69 66 efault CA certif
f180: 69 63 61 74 65 73 20 66 69 6c 65 20 69 73 20 63 icates file is c
f190: 61 6c 6c 65 64 20 63 65 72 74 2e 70 65 6d 20 69 alled cert.pem i
f1a0: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 4f 70 n the default Op
f1b0: 65 6e 53 53 4c 0a 09 64 69 72 65 63 74 6f 72 79 enSSL..directory
f1c0: 2e 20 49 74 20 63 61 6e 20 62 65 20 6f 76 65 72 . It can be over
f1d0: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 ridden by the SS
f1e0: 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e 76 20 L_CERT_FILE env
f1f0: 76 61 72 2e 20 2a 2f 0a 09 2f 2a 20 69 6e 74 20 var. */../* int
f200: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
f210: 75 6c 74 5f 76 65 72 69 66 79 5f 64 69 72 28 53 ult_verify_dir(S
f220: 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 61 6e 64 SL_CTX *ctx) and
f230: 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65 74 int SSL_CTX_set
f240: 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f _default_verify_
f250: 66 69 6c 65 28 53 53 4c 5f 43 54 58 20 2a 63 74 file(SSL_CTX *ct
f260: 78 29 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 x) */. if (!S
f270: 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 SL_CTX_load_veri
f280: 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 fy_locations(ctx
f290: 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 , F2N(CAfile, &d
f2a0: 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 26 s), F2N(CAdir, &
f2b0: 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 ds1)) ||..!SSL_C
f2c0: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 TX_set_default_v
f2d0: 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 erify_paths(ctx)
f2e0: 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 ) {.#if 0..Tcl_D
f2f0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
f300: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
f310: 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e e(&ds1);../* Don
f320: 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 't currently car
f330: 65 20 69 66 20 74 68 69 73 20 66 61 69 6c 73 20 e if this fails
f340: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 */..Tcl_AppendRe
f350: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 sult(interp, "SS
f360: 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69 66 79 L default verify
f370: 20 70 61 74 68 73 3a 20 22 2c 20 52 45 41 53 4f paths: ", REASO
f380: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
f390: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 LL);..SSL_CTX_fr
f3a0: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e ee(ctx);..return
f3b0: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 NULL;.#endif.
f3c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 }.. /* http
f3d0: 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e s://sourceforge.
f3e0: 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 net/p/tls/bugs/5
f3f0: 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 7/ */. /* XXX
f400: 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 :TODO: Let the u
f410: 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 ser supply value
f420: 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f s here instead o
f430: 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 f something that
f440: 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 exists on the f
f450: 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 ilesystem */.
f460: 20 69 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e if (CAfile != N
f470: 55 4c 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 ULL) {..STACK_OF
f480: 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 (X509_NAME) *cer
f490: 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 tNames = SSL_loa
f4a0: 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 d_client_CA_file
f4b0: 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 (F2N(CAfile, &ds
f4c0: 29 29 3b 0a 09 69 66 20 28 63 65 72 74 4e 61 6d ));..if (certNam
f4d0: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 es != NULL) {..
f4e0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 SSL_CTX_set_c
f4f0: 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 lient_CA_list(ct
f500: 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 x, certNames);..
f510: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c }. }.. Tcl
f520: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
f530: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
f540: 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 20 20 ngFree(&ds1);.
f550: 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a return ctx;.}.
f560: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
f570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
f5b0: 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d StatusObjCmd --
f5c0: 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 return certific
f5d0: 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 ate for connecte
f5e0: 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 d peer.. *. * Re
f5f0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
f600: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
f610: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
f620: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
f630: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
f640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f670: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
f680: 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 c int.StatusObjC
f690: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
f6a0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
f6b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
f6c0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
f6d0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
f6e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
f6f0: 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a ePtr;. X509 *
f700: 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 peer;. Tcl_Ob
f710: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 j *objPtr;. T
f720: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
f730: 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e . char *chann
f740: 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 elName, *ciphers
f750: 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a ;. int mode;.
f760: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
f770: 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a ed char *proto;.
f780: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
f790: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 len;. int ni
f7a0: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 d;.. dprintf(
f7b0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
f7c0: 73 77 69 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a switch (objc) {.
f7d0: 09 63 61 73 65 20 32 3a 0a 09 20 20 20 20 63 68 .case 2:.. ch
f7e0: 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f annelName = Tcl_
f7f0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
f800: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b (objv[1], NULL);
f810: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 .. break;...c
f820: 61 73 65 20 33 3a 0a 09 20 20 20 20 69 66 20 28 ase 3:.. if (
f830: 21 73 74 72 63 6d 70 20 28 54 63 6c 5f 47 65 74 !strcmp (Tcl_Get
f840: 53 74 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 String (objv[1])
f850: 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 , "-local")) {..
f860: 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 .channelName = T
f870: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
f880: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c Obj(objv[2], NUL
f890: 4c 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 L);...break;..
f8a0: 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65 }.. /* else
f8b0: 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2e 2e fall-through ..
f8c0: 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 . */.#if defined
f8d0: 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 20 20 20 20 (__GNUC__)..
f8e0: 5f 5f 61 74 74 72 69 62 75 74 65 5f 5f 28 28 66 __attribute__((f
f8f0: 61 6c 6c 74 68 72 6f 75 67 68 29 29 3b 0a 23 65 allthrough));.#e
f900: 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 ndif..default:..
f910: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d Tcl_WrongNum
f920: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
f930: 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 objv, "?-local?
f940: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 20 channel");..
f950: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
f960: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 ;. }.. cha
f970: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
f980: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e el(interp, chann
f990: 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a elName, &mode);.
f9a0: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
f9b0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
f9c0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
f9d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
f9e0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
f9f0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
fa00: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
fa10: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
fa20: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
fa30: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 l(chan);. if
fa40: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
fa50: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
fa60: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
fa70: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
fa80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
fa90: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
faa0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
fab0: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e (chan),..."\": n
fac0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
fad0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 ", NULL);..Tcl_S
fae0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
faf0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 rp, "TLS", "STAT
fb00: 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 US", "CHANNEL",
fb10: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 "INVALID", (char
fb20: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
fb30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
fb40: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 }. statePtr
fb50: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c = (State *) Tcl
fb60: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
fb70: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a nceData(chan);..
fb80: 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 /* Get certi
fb90: 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 ficate for peer
fba0: 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 or self */. i
fbb0: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a f (objc == 2) {.
fbc0: 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f .peer = SSL_get_
fbd0: 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 peer_certificate
fbe0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
fbf0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 . } else {..p
fc00: 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 eer = SSL_get_ce
fc10: 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 rtificate(stateP
fc20: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a tr->ssl);. }.
fc30: 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 /* Get X509
fc40: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f certificate info
fc50: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 */. if (peer
fc60: 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c ) {..objPtr = Tl
fc70: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 s_NewX509Obj(int
fc80: 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 erp, peer);..if
fc90: 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 (objc == 2) {..
fca0: 20 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 X509_free(pee
fcb0: 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20 r);.. peer =
fcc0: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 NULL;..}. } e
fcd0: 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 lse {..objPtr =
fce0: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
fcf0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a , NULL);. }..
fd00: 20 20 20 20 2f 2a 20 50 65 65 72 20 63 65 72 74 /* Peer cert
fd10: 20 63 68 61 69 6e 20 28 63 6c 69 65 6e 74 20 6f chain (client o
fd20: 6e 6c 79 29 20 2a 2f 0a 20 20 20 20 53 54 41 43 nly) */. STAC
fd30: 4b 5f 4f 46 28 58 35 30 39 29 2a 20 73 73 6c 5f K_OF(X509)* ssl_
fd40: 63 65 72 74 73 20 3d 20 53 53 4c 5f 67 65 74 5f certs = SSL_get_
fd50: 70 65 65 72 5f 63 65 72 74 5f 63 68 61 69 6e 28 peer_cert_chain(
fd60: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
fd70: 20 20 20 20 69 66 20 28 73 73 6c 5f 63 65 72 74 if (ssl_cert
fd80: 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f s == NULL || sk_
fd90: 58 35 30 39 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 X509_num(ssl_cer
fda0: 74 73 29 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c ts) == 0) {..Tcl
fdb0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
fdc0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 terp, "TLS", "ST
fdd0: 41 54 55 53 22 2c 20 22 43 45 52 54 49 46 49 43 ATUS", "CERTIFIC
fde0: 41 54 45 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ATE", (char *) N
fdf0: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 49 6e 63 72 52 ULL);..Tcl_IncrR
fe00: 65 66 43 6f 75 6e 74 28 6f 62 6a 50 74 72 29 3b efCount(objPtr);
fe10: 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 ..Tcl_DecrRefCou
fe20: 6e 74 28 6f 62 6a 50 74 72 29 3b 0a 09 72 65 74 nt(objPtr);..ret
fe30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
fe40: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 }.. /* Pee
fe50: 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 63 r name */. Tc
fe60: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
fe70: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
fe80: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
fe90: 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 6e 61 6d ringObj("peernam
fea0: 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 e", -1));. Tc
feb0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
fec0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
fed0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
fee0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 30 ringObj(SSL_get0
fef0: 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50 _peername(stateP
ff00: 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a tr->ssl), -1));.
ff10: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
ff20: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
ff30: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
ff40: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
ff50: 73 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 20 20 sbits", -1));.
ff60: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
ff70: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
ff80: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
ff90: 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 ewIntObj(SSL_get
ffa0: 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 _cipher_bits(sta
ffb0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c tePtr->ssl, NULL
ffc0: 29 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 )));.. cipher
ffd0: 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 s = (char*)SSL_g
ffe0: 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 et_cipher(stateP
fff0: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 tr->ssl);. if
10000 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 ((ciphers != NU
10010 4c 4c 29 20 26 26 20 28 73 74 72 63 6d 70 28 63 LL) && (strcmp(c
10020 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e 45 29 22 iphers, "(NONE)"
10030 29 20 21 3d 20 30 29 29 20 7b 0a 09 54 63 6c 5f ) != 0)) {..Tcl_
10040 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10050 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
10060 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10070 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22 2c 20 ngObj("cipher",
10080 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
10090 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
100a0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
100b0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
100c0 28 63 69 70 68 65 72 73 2c 20 2d 31 29 29 3b 0a (ciphers, -1));.
100d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 }.. /* Ve
100e0 72 69 66 79 20 74 68 65 20 58 35 30 39 20 63 65 rify the X509 ce
100f0 72 74 69 66 69 63 61 74 65 20 70 72 65 73 65 6e rtificate presen
10100 74 65 64 20 62 79 20 74 68 65 20 70 65 65 72 20 ted by the peer
10110 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f */. Tcl_ListO
10120 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10130 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10140 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10150 28 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c ("verifyResult",
10160 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. 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 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 tr,..Tcl_NewStri
101a0 6e 67 4f 62 6a 28 58 35 30 39 5f 76 65 72 69 66 ngObj(X509_verif
101b0 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 y_cert_error_str
101c0 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 ing(SSL_get_veri
101d0 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 fy_result(stateP
101e0 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 29 3b tr->ssl)), -1));
101f0 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 .. /* Verify
10200 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f mode */. Tcl_
10210 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10220 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
10230 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10240 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 4d 6f 64 ngObj("verifyMod
10250 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 2f 2a e", -1));. /*
10260 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 76 65 72 SSL_CTX_get_ver
10270 69 66 79 5f 6d 6f 64 65 28 63 74 78 29 20 2a 2f ify_mode(ctx) */
10280 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f . mode = SSL_
10290 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 get_verify_mode(
102a0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
102b0 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20 if (mode &&
102c0 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 SSL_VERIFY_NONE)
102d0 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
102e0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
102f0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
10300 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e _NewStringObj("n
10310 6f 6e 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 one", -1));.
10320 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 } else {..Tcl_Ob
10330 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 j *listObjPtr =
10340 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
10350 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f , NULL);..if (mo
10360 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 de && SSL_VERIFY
10370 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 _PEER) {.. Tc
10380 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10390 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
103a0 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e istObjPtr, Tcl_N
103b0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 ewStringObj("pee
103c0 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 r", -1));..}..if
103d0 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 (mode && SSL_VE
103e0 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f RIFY_FAIL_IF_NO_
103f0 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 PEER_CERT) {..
10400 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
10410 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10420 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 p, listObjPtr, T
10430 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
10440 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 "fail if no peer
10450 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d cert", -1));..}
10460 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 ..if (mode && SS
10470 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f L_VERIFY_CLIENT_
10480 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c ONCE) {.. Tcl
10490 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
104a0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 ement(interp, li
104b0 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 stObjPtr, Tcl_Ne
104c0 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 wStringObj("clie
104d0 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a nt once", -1));.
104e0 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 .}..if (mode &&
104f0 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f SSL_VERIFY_POST_
10500 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 HANDSHAKE) {..
10510 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
10520 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10530 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 p, listObjPtr, T
10540 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
10550 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 "post handshake"
10560 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f , -1));..}..Tcl_
10570 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10580 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
10590 50 74 72 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 Ptr, listObjPtr)
105a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
105b0 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 Verify mode dept
105c0 68 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 h */. Tcl_Lis
105d0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
105e0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
105f0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10600 62 6a 28 22 76 65 72 69 66 79 44 65 70 74 68 22 bj("verifyDepth"
10610 2c 20 2d 31 29 29 3b 0a 20 20 20 20 2f 2a 20 53 , -1));. /* S
10620 53 4c 5f 43 54 58 5f 67 65 74 5f 76 65 72 69 66 SL_CTX_get_verif
10630 79 5f 64 65 70 74 68 28 63 74 78 29 20 2a 2f 0a y_depth(ctx) */.
10640 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
10650 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
10660 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
10670 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 _NewIntObj(SSL_g
10680 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 et_verify_depth(
10690 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 29 statePtr->ssl)))
106a0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 ;.. /* Report
106b0 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 the selected pr
106c0 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 otocol as a resu
106d0 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 lt of the negoti
106e0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c ation */. SSL
106f0 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 _get0_alpn_selec
10700 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ted(statePtr->ss
10710 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 l, &proto, &len)
10720 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
10730 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10740 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
10750 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
10760 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 "alpn", -1));.
10770 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
10780 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10790 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
107a0 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 ewStringObj((cha
107b0 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 r *)proto, (int)
107c0 20 6c 65 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f len));. Tcl_
107d0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
107e0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
107f0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10800 6e 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 ngObj("protocol"
10810 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
10820 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10830 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
10840 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10850 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 ngObj(SSL_get_ve
10860 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e rsion(statePtr->
10870 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 ssl), -1));..
10880 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f /* Valid for no
10890 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 n-RSA signature
108a0 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 and TLS 1.3 */.
108b0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
108c0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
108d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
108e0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 NewStringObj("si
108f0 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 gnatureHashAlgor
10900 69 74 68 6d 22 2c 20 2d 31 29 29 3b 0a 20 20 20 ithm", -1));.
10910 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 20 3f if (objc == 2 ?
10920 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 SSL_get_peer_si
10930 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 gnature_nid(stat
10940 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 ePtr->ssl, &nid)
10950 20 3a 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 : SSL_get_signa
10960 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 ture_nid(statePt
10970 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 29 20 7b r->ssl, &nid)) {
10980 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
10990 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
109a0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
109b0 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f ewStringObj(OBJ_
109c0 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 nid2ln(nid), -1)
109d0 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
109e0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
109f0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10a00 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
10a10 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d wStringObj("", -
10a20 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 1));. }. T
10a30 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10a40 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10a50 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
10a60 74 72 69 6e 67 4f 62 6a 28 22 73 69 67 6e 61 74 tringObj("signat
10a70 75 72 65 54 79 70 65 22 2c 20 2d 31 29 29 3b 0a ureType", -1));.
10a80 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 if (objc ==
10a90 32 20 3f 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 2 ? SSL_get_peer
10aa0 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f _signature_type_
10ab0 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
10ac0 6c 2c 20 26 6e 69 64 29 20 3a 20 53 53 4c 5f 67 l, &nid) : SSL_g
10ad0 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 et_signature_typ
10ae0 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
10af0 73 73 6c 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54 ssl, &nid)) {..T
10b00 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10b10 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10b20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
10b30 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 tringObj(OBJ_nid
10b40 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 2ln(nid), -1));.
10b50 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
10b60 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10b70 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
10b80 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
10b90 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 ringObj("", -1))
10ba0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c ;. }.. Tcl
10bb0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
10bc0 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 terp, objPtr);.
10bd0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
10be0 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
10bf0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
10c00 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
10c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10c40 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
10c50 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a onnectionInfoObj
10c60 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f Cmd -- return co
10c70 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 nnection info fr
10c80 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 om OpenSSL.. *.
10c90 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
10ca0 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 list of connecti
10cb0 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d on info. *. *--
10cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d00 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e -. */..static in
10d10 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f t ConnectionInfo
10d20 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
10d30 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
10d40 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
10d50 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
10d60 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
10d70 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
10d80 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 nnel chan;../* T
10d90 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 he channel to se
10da0 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a t a mode on. */.
10db0 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
10dc0 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 Ptr;../* client
10dd0 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f state for ssl so
10de0 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f cket */. Tcl_
10df0 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 Obj *objPtr, *li
10e00 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 stPtr;. const
10e10 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 SSL *ssl;. c
10e20 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 onst SSL_CIPHER
10e30 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e *cipher;. con
10e40 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a st SSL_SESSION *
10e50 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 6c 6f 6e session;. lon
10e60 67 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 66 20 g mode;.. if
10e70 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
10e80 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
10e90 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
10ea0 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
10eb0 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
10ec0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e . }.. chan
10ed0 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
10ee0 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
10ef0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
10f00 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e bjv[1], NULL), N
10f10 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 ULL);. if (ch
10f20 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
10f30 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
10f40 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
10f50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
10f60 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
10f70 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
10f80 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
10f90 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
10fa0 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
10fb0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
10fc0 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
10fd0 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
10fe0 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
10ff0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
11000 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
11010 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
11020 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
11030 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 . "\": not a
11040 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
11050 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 LL);..Tcl_SetErr
11060 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
11070 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f TLS", "CONNECTIO
11080 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 N", "CHANNEL", "
11090 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
110a0 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
110b0 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
110c0 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 }.. objPtr
110d0 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
110e0 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 (0, NULL);..
110f0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e /* Connection in
11100 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 fo */. stateP
11110 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 tr = (State *)Tc
11120 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
11130 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
11140 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 ssl = stateP
11150 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 tr->ssl;. if
11160 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl != NULL) {.
11170 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 ./* connection s
11180 74 61 74 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 tate */..Tcl_Lis
11190 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
111a0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
111b0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
111c0 62 6a 28 22 73 74 61 74 65 22 2c 20 2d 31 29 29 bj("state", -1))
111d0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
111e0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
111f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
11200 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c NewStringObj(SSL
11210 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f _state_string_lo
11220 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a ng(ssl), -1));..
11230 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 ./* Get SNI requ
11240 65 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d ested server nam
11250 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 e */..Tcl_ListOb
11260 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
11270 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
11280 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
11290 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 2d 31 "servername", -1
112a0 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
112b0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
112c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
112d0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 l_NewStringObj(S
112e0 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d SL_get_servernam
112f0 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 e(ssl, TLSEXT_NA
11300 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 METYPE_host_name
11310 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 ), -1));.../* Ge
11320 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 54 t protocol */..T
11330 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
11340 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
11350 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
11360 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f 63 tringObj("protoc
11370 6f 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f ol", -1));..Tcl_
11380 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
11390 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
113a0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
113b0 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 ngObj(SSL_get_ve
113c0 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 29 rsion(ssl), -1))
113d0 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 ;.../* Renegotia
113e0 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a tion allowed */.
113f0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11400 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11410 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
11420 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 6e 65 wStringObj("rene
11430 67 6f 74 69 61 74 69 6f 6e 22 2c 20 2d 31 29 29 gotiation", -1))
11440 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
11450 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
11460 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
11470 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 20 NewStringObj(..
11480 20 20 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 SSL_get_secur
11490 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f e_renegotiation_
114a0 73 75 70 70 6f 72 74 28 73 73 6c 29 20 3f 20 22 support(ssl) ? "
114b0 73 75 70 70 6f 72 74 65 64 22 20 3a 20 22 6e 6f supported" : "no
114c0 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 2d 31 t supported", -1
114d0 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 ));.../* Get sec
114e0 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 urity level */..
114f0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
11500 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
11510 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
11520 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 75 72 StringObj("secur
11530 69 74 79 6c 65 76 65 6c 22 2c 20 2d 31 29 29 3b itylevel", -1));
11540 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
11550 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
11560 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
11570 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 ewIntObj(SSL_get
11580 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 _security_level(
11590 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 ssl)));.../* Ses
115a0 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 sion info */..Tc
115b0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
115c0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
115d0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
115e0 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e ringObj("session
115f0 5f 72 65 75 73 65 64 22 2c 20 2d 31 29 29 3b 0a _reused", -1));.
11600 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11610 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11620 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
11630 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f wBooleanObj(SSL_
11640 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 session_reused(s
11650 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 sl)));.../* Is s
11660 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 54 erver info */..T
11670 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
11680 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
11690 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
116a0 74 72 69 6e 67 4f 62 6a 28 22 69 73 5f 73 65 72 tringObj("is_ser
116b0 76 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ver", -1));..Tcl
116c0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
116d0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
116e0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f jPtr, Tcl_NewBoo
116f0 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f 69 73 5f 73 leanObj(SSL_is_s
11700 65 72 76 65 72 28 73 73 6c 29 29 29 3b 0a 20 20 erver(ssl)));.
11710 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 }.. /* Ciph
11720 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 er info */. c
11730 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f ipher = SSL_get_
11740 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 current_cipher(s
11750 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 sl);. if (cip
11760 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 her != NULL) {..
11770 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d char buf[BUFSIZ]
11780 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 = {0};..int bit
11790 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 54 s, alg_bits;...T
117a0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
117b0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
117c0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
117d0 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 tringObj("cipher
117e0 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
117f0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
11800 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
11810 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
11820 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 Obj(SSL_CIPHER_g
11830 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c et_name(cipher),
11840 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
11850 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
11860 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11870 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
11880 6a 28 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 j("standard_name
11890 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
118a0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
118b0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
118c0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
118d0 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 Obj(SSL_CIPHER_s
118e0 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 tandard_name(cip
118f0 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 62 69 her), -1));...bi
11900 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f ts = SSL_CIPHER_
11910 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c get_bits(cipher,
11920 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 54 63 &alg_bits);..Tc
11930 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
11940 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
11950 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
11960 72 69 6e 67 4f 62 6a 28 22 73 65 63 72 65 74 5f ringObj("secret_
11970 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 bits", -1));..Tc
11980 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
11990 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
119a0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e bjPtr, Tcl_NewIn
119b0 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a 09 54 63 tObj(bits));..Tc
119c0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
119d0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
119e0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
119f0 72 69 6e 67 4f 62 6a 28 22 61 6c 67 6f 72 69 74 ringObj("algorit
11a00 68 6d 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a hm_bits", -1));.
11a10 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11a20 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11a30 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
11a40 77 49 6e 74 4f 62 6a 28 61 6c 67 5f 62 69 74 73 wIntObj(alg_bits
11a50 29 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 ));../* alg_bits
11a60 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 is actual key s
11a70 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 ecret bits. If u
11a80 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 se bits and secr
11a90 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 et (algorithm) b
11aa0 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 its differ,..
11ab0 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 the rest of the
11ac0 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 bits are fixed,
11ad0 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 i.e. for limited
11ae0 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 export ciphers
11af0 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 09 (bits < 56) */..
11b00 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
11b10 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
11b20 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
11b30 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 5f 76 StringObj("min_v
11b40 65 72 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 ersion", -1));..
11b50 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
11b60 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
11b70 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
11b80 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 StringObj(SSL_CI
11b90 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e PHER_get_version
11ba0 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a (cipher), -1));.
11bb0 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c ../* Get OpenSSL
11bc0 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f -specific ID, no
11bd0 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 54 63 t IANA ID */..Tc
11be0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
11bf0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
11c00 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
11c10 72 69 6e 67 4f 62 6a 28 22 69 64 22 2c 20 2d 31 ringObj("id", -1
11c20 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
11c30 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
11c40 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
11c50 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 l_NewIntObj((int
11c60 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 ) SSL_CIPHER_get
11c70 5f 69 64 28 63 69 70 68 65 72 29 29 29 3b 0a 0a _id(cipher)));..
11c80 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f .if (SSL_CIPHER_
11c90 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 description(ciph
11ca0 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 er, buf, sizeof(
11cb0 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b buf)) != NULL) {
11cc0 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
11cd0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
11ce0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
11cf0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
11d00 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 2d "description", -
11d10 31 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 1));.. 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 62 75 66 2c 20 2d 31 29 29 3b 0a 09 Obj(buf, -1));..
11d60 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
11d70 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a Session info */.
11d80 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 session = SS
11d90 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 L_get_session(ss
11da0 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 l);. if (sess
11db0 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ion != NULL) {..
11dc0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
11dd0 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 har *ticket;..si
11de0 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 ze_t len2;..unsi
11df0 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 gned int ulen;..
11e00 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
11e10 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c har *session_id,
11e20 20 2a 70 72 6f 74 6f 3b 0a 09 63 68 61 72 20 62 *proto;..char b
11e30 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 uffer[SSL_MAX_MA
11e40 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d STER_KEY_LENGTH]
11e50 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 ;.../* Report th
11e60 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
11e70 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
11e80 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f of the ALPN nego
11e90 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f tiation */..SSL_
11ea0 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 SESSION_get0_alp
11eb0 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 n_selected(sessi
11ec0 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e on, &proto, &len
11ed0 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 2);..Tcl_ListObj
11ee0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
11ef0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
11f00 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
11f10 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 alpn", -1));..Tc
11f20 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
11f30 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
11f40 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
11f50 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 ringObj((char *)
11f60 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e proto, (int) len
11f70 32 29 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 2));.../* Report
11f80 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 the selected pr
11f90 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 otocol as a resu
11fa0 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 lt of the NPN ne
11fb0 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 gotiation */.#if
11fc0 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c def USE_NPN..SSL
11fd0 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f _get0_next_proto
11fe0 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c _negotiated(ssl,
11ff0 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b &proto, &ulen);
12000 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
12010 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
12020 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
12030 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 70 6e ewStringObj("npn
12040 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
12050 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
12060 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
12070 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
12080 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 Obj((char *)prot
12090 6f 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b o, (int) ulen));
120a0 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 .#endif.../* Res
120b0 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a umable session *
120c0 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
120d0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
120e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
120f0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 NewStringObj("re
12100 73 75 6d 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a sumable", -1));.
12110 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
12120 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
12130 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
12140 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 53 45 53 53 wIntObj(SSL_SESS
12150 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 ION_is_resumable
12160 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f (session)));.../
12170 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20 * Session start
12180 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69 time (seconds si
12190 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 54 nce epoch) */..T
121a0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
121b0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
121c0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
121d0 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 72 74 5f tringObj("start_
121e0 74 69 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 time", -1));..Tc
121f0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
12200 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
12210 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f bjPtr, Tcl_NewLo
12220 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f ngObj(SSL_SESSIO
12230 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 N_get_time(sessi
12240 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 on)));.../* Time
12250 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f out value - SSL_
12260 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 CTX_get_timeout
12270 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a (in seconds) */.
12280 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
12290 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
122a0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
122b0 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 6d 65 wStringObj("time
122c0 6f 75 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c out", -1));..Tcl
122d0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
122e0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
122f0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e jPtr, Tcl_NewLon
12300 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e gObj(SSL_SESSION
12310 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 _get_timeout(ses
12320 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 sion)));.../* Se
12330 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 ssion ticket lif
12340 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 etime hint (in s
12350 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f econds) */..Tcl_
12360 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
12370 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
12380 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
12390 6e 67 4f 62 6a 28 22 6c 69 66 65 74 69 6d 65 22 ngObj("lifetime"
123a0 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
123b0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
123c0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
123d0 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a , Tcl_NewLongObj
123e0 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 (SSL_SESSION_get
123f0 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 _ticket_lifetime
12400 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 _hint(session)))
12410 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 ;.../* Session i
12420 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 d - TLSv1.2 and
12430 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 below only */..s
12440 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f ession_id = SSL_
12450 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 SESSION_get_id(s
12460 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a ession, &ulen);.
12470 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
12480 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
12490 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
124a0 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 wStringObj("sess
124b0 69 6f 6e 5f 69 64 22 2c 20 2d 31 29 29 3b 0a 09 ion_id", -1));..
124c0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
124d0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
124e0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
124f0 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 ByteArrayObj(ses
12500 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 sion_id, (int) u
12510 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 len));.../* Sess
12520 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 ion context */..
12530 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c session_id = SSL
12540 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 _SESSION_get0_id
12550 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e _context(session
12560 2c 20 26 75 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c , &ulen);..Tcl_L
12570 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
12580 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
12590 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
125a0 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 63 6f gObj("session_co
125b0 6e 74 65 78 74 22 2c 20 2d 31 29 29 3b 0a 09 54 ntext", -1));..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 42 objPtr, Tcl_NewB
125f0 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 yteArrayObj(sess
12600 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c ion_id, (int) ul
12610 65 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 en));.../* Sessi
12620 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 on ticket - clie
12630 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f nt only */..SSL_
12640 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 SESSION_get0_tic
12650 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 ket(session, &ti
12660 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 cket, &len2);..T
12670 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
12680 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
12690 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
126a0 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f tringObj("sessio
126b0 6e 5f 74 69 63 6b 65 74 22 2c 20 2d 31 29 29 3b n_ticket", -1));
126c0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
126d0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
126e0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
126f0 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 ewByteArrayObj(t
12700 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e icket, (int) len
12710 32 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 2));.../* Ticket
12720 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 09 53 53 app data */..SS
12730 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 L_SESSION_get0_t
12740 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 73 65 icket_appdata(se
12750 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
12760 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 &len2);..Tcl_Lis
12770 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
12780 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
12790 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
127a0 62 6a 28 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 bj("ticket_app_d
127b0 61 74 61 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ata", -1));..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 42 79 74 jPtr, Tcl_NewByt
127f0 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 eArrayObj(ticket
12800 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a , (int) len2));.
12810 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 ../* Get master
12820 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 key */..len2 = S
12830 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d SL_SESSION_get_m
12840 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f aster_key(sessio
12850 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d n, buffer, SSL_M
12860 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 AX_MASTER_KEY_LE
12870 4e 47 54 48 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 NGTH);..Tcl_List
12880 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
12890 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
128a0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
128b0 6a 28 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 j("master_key",
128c0 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
128d0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
128e0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
128f0 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 Tcl_NewByteArray
12900 4f 62 6a 28 62 75 66 66 65 72 2c 20 28 69 6e 74 Obj(buffer, (int
12910 29 20 6c 65 6e 32 29 29 3b 0a 20 20 20 20 7d 0a ) len2));. }.
12920 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 . /* Compress
12930 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ion info */.
12940 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 if (ssl != NULL)
12950 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 {.#ifdef HAVE_S
12960 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 SL_COMPRESSION..
12970 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f const COMP_METHO
12980 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a D *comp, *expn;.
12990 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f .comp = SSL_get_
129a0 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 current_compress
129b0 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 ion(ssl);..expn
129c0 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e = SSL_get_curren
129d0 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 t_expansion(ssl)
129e0 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
129f0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
12a00 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
12a10 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 _NewStringObj("c
12a20 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 ompression", -1)
12a30 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
12a40 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
12a50 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
12a60 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 6f _NewStringObj(co
12a70 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 mp ? SSL_COMP_ge
12a80 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 t_name(comp) : "
12a90 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 54 63 NONE", -1));..Tc
12aa0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
12ab0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
12ac0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
12ad0 72 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 ringObj("expansi
12ae0 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f on", -1));..Tcl_
12af0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
12b00 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
12b10 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
12b20 6e 67 4f 62 6a 28 65 78 70 6e 20 3f 20 53 53 4c ngObj(expn ? SSL
12b30 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 _COMP_get_name(e
12b40 78 70 6e 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d xpn) : "NONE", -
12b50 31 29 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 1));.#else..Tcl_
12b60 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
12b70 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
12b80 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
12b90 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 ngObj("compressi
12ba0 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f on", -1));..Tcl_
12bb0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
12bc0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
12bd0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
12be0 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 ngObj("NONE", -1
12bf0 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
12c00 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
12c10 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
12c20 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
12c30 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 expansion", -1))
12c40 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
12c50 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
12c60 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
12c70 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f NewStringObj("NO
12c80 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 NE", -1));.#endi
12c90 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 f. }.. /*
12ca0 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 Server info */.
12cb0 20 20 20 7b 0a 09 6d 6f 64 65 20 3d 20 53 53 4c {..mode = SSL
12cc0 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e _CTX_get_session
12cd0 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 _cache_mode(stat
12ce0 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 ePtr->ctx);..cha
12cf0 72 20 2a 6d 73 67 3b 0a 09 0a 09 69 66 20 28 6d r *msg;....if (m
12d00 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 ode & SSL_SESS_C
12d10 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 ACHE_OFF) {..
12d20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d msg = "off";..}
12d30 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 else if (mode &
12d40 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
12d50 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d CLIENT) {.. m
12d60 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 sg = "client";..
12d70 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 } else if (mode
12d80 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
12d90 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 _SERVER) {..
12da0 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b 0a msg = "server";.
12db0 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 .} else if (mode
12dc0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
12dd0 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d E_BOTH) {.. m
12de0 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 sg = "both";..}
12df0 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 else {.. msg
12e00 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a = "unknown";..}.
12e10 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
12e20 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
12e30 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
12e40 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 wStringObj("sess
12e50 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c ion_cache_mode",
12e60 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
12e70 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
12e80 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12e90 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
12ea0 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 20 20 20 j(msg, -1));.
12eb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 }.. /* CA Li
12ec0 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 st */. /* IF
12ed0 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73 61 not a server, sa
12ee0 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 me as SSL_get0_p
12ef0 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 eer_CA_list. If
12f00 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 20 53 server same as S
12f10 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e SL_CTX_get_clien
12f20 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 t_CA_list */.
12f30 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e listPtr = Tcl_N
12f40 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
12f50 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 L);. STACK_OF
12f60 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f (X509_NAME) *ca_
12f70 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28 63 list;. if ((c
12f80 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 a_list = SSL_get
12f90 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 _client_CA_list(
12fa0 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b ssl)) != NULL) {
12fb0 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 42 55 ..char buffer[BU
12fc0 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 FSIZ];..for (int
12fd0 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 i = 0; i < sk_X
12fe0 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 509_NAME_num(ca_
12ff0 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 list); i++) {..
13000 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 X509_NAME *na
13010 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d me = sk_X509_NAM
13020 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c E_value(ca_list,
13030 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 i);.. if (na
13040 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d me) {...X509_NAM
13050 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 E_oneline(name,
13060 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b buffer, BUFSIZ);
13070 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ...Tcl_ListObjAp
13080 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
13090 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c rp, listPtr, Tcl
130a0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 _NewStringObj(bu
130b0 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 ffer, -1));..
130c0 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 }..}. }.
130d0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
130e0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
130f0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
13100 53 74 72 69 6e 67 4f 62 6a 28 22 63 61 4c 69 73 StringObj("caLis
13110 74 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 t", -1));. Tc
13120 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
13130 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
13140 62 6a 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b bjPtr, listPtr);
13150 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
13160 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
13170 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
13180 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
13190 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
131a0 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
131b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131f0 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f -. *. * VersionO
13200 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 bjCmd -- return
13210 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 version string f
13220 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a rom OpenSSL.. *.
13230 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
13240 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
13250 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
13260 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
13270 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
13280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
132a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
132b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
132c0 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 static int.Versi
132d0 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 onObjCmd(ClientD
132e0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
132f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
13300 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
13310 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
13320 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f v[]) {. Tcl_O
13330 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 bj *objPtr;..
13340 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
13350 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 ");.. objPtr
13360 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f = Tcl_NewStringO
13370 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 bj(OPENSSL_VERSI
13380 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 ON_TEXT, -1);.
13390 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
133a0 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
133b0 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
133c0 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 TCL_OK;..clientD
133d0 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
133e0 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a ;..objc = objc;.
133f0 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a .objv = objv;.}.
13400 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
13410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
13450 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d MiscObjCmd -- m
13460 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a isc commands. *.
13470 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
13480 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
13490 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
134a0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
134b0 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
134c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
134d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
134e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
134f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
13500 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f static int.MiscO
13510 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
13520 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
13530 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
13540 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
13550 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
13560 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 ) {. static c
13570 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 onst char *comma
13580 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 nds [] = { "req"
13590 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c , "strreq", NULL
135a0 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d };. enum com
135b0 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f mand { C_REQ, C_
135c0 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 STRREQ, C_DUMMY
135d0 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c 20 };. int cmd,
135e0 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 isStr;. char
135f0 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a buffer[16384];..
13600 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
13610 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
13620 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c objc < 2) {..Tcl
13630 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
13640 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
13650 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 subcommand ?args
13660 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c ?");..return TCL
13670 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
13680 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 if (Tcl_GetInd
13690 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 exFromObj(interp
136a0 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 , objv[1], comma
136b0 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 nds, "command",
136c0 30 2c 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 0,&cmd) != TCL_O
136d0 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
136e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
136f0 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 ERR_clear_err
13700 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 or();.. isStr
13710 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 = (cmd == C_STR
13720 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 REQ);. switch
13730 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 ((enum command)
13740 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f cmd) {..case C_
13750 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 REQ:..case C_STR
13760 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f REQ: {.. EVP_
13770 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b PKEY *pkey=NULL;
13780 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 .. X509 *cert
13790 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 =NULL;.. X509
137a0 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c _NAME *name=NULL
137b0 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a ;.. Tcl_Obj *
137c0 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 69 6e 74 *listv;.. int
137d0 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 listc,i;...
137e0 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a BIO *out=NULL;..
137f0 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 . char *k_C="
13800 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d ",*k_ST="",*k_L=
13810 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 "",*k_O="",*k_OU
13820 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f ="",*k_CN="",*k_
13830 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 Email="";.. c
13840 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d har *keyout,*pem
13850 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 out,*str;.. i
13860 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 nt keysize,seria
13870 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 l=0,days=365;..#
13880 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
13890 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
138a0 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 000000L.. BIG
138b0 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b NUM *bne = NULL;
138c0 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d .. RSA *rsa =
138d0 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 NULL;.#else..
138e0 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a EVP_PKEY_CTX *
138f0 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 ctx = NULL;.#end
13900 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 if... if ((ob
13910 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 jc<5) || (objc>6
13920 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 )) {...Tcl_Wrong
13930 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
13940 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 2, objv, "keysiz
13950 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 e keyfile certfi
13960 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 le ?info?");...r
13970 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
13980 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 .. }... if
13990 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
139a0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
139b0 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 [2], &keysize) !
139c0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 = TCL_OK) {...re
139d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
139e0 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f . }.. keyo
139f0 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ut=Tcl_GetString
13a00 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 (objv[3]);..
13a10 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 pemout=Tcl_GetSt
13a20 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 ring(objv[4]);..
13a30 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b if (isStr) {
13a40 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e ...Tcl_SetVar(in
13a50 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 terp,keyout,"",0
13a60 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 );...Tcl_SetVar(
13a70 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 interp,pemout,""
13a80 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ,0);.. }...
13a90 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b if (objc>=6) {
13aa0 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f ...if (Tcl_ListO
13ab0 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e bjGetElements(in
13ac0 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 terp, objv[5],..
13ad0 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 ..&listc, &listv
13ae0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
13af0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
13b00 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 ERROR;...}....if
13b10 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 ((listc%2) != 0
13b20 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 ) {... Tcl_Se
13b30 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
13b40 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 Information list
13b50 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 must have even
13b60 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 number of argume
13b70 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 nts",NULL);...
13b80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
13b90 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 OR;...}...for (i
13ba0 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d =0; i<listc; i+=
13bb0 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 2) {... str=T
13bc0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
13bd0 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 tv[i]);... if
13be0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 (strcmp(str,"da
13bf0 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 ys")==0) {....if
13c00 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
13c10 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
13c20 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 [i+1],&days)!=TC
13c30 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 L_OK).... ret
13c40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
13c50 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
13c60 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 strcmp(str,"seri
13c70 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 al")==0) {....if
13c80 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
13c90 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
13ca0 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d [i+1],&serial)!=
13cb0 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 TCL_OK).... r
13cc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
13cd0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
13ce0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 (strcmp(str,"C"
13cf0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 )==0) {....k_C=T
13d00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
13d10 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
13d20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
13d30 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 p(str,"ST")==0)
13d40 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 {....k_ST=Tcl_Ge
13d50 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
13d60 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
13d70 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
13d80 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"L")==0) {....k
13d90 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _L=Tcl_GetString
13da0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
13db0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
13dc0 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d trcmp(str,"O")==
13dd0 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 0) {....k_O=Tcl_
13de0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
13df0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
13e00 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
13e10 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 tr,"OU")==0) {..
13e20 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 ..k_OU=Tcl_GetSt
13e30 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
13e40 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
13e50 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 f (strcmp(str,"C
13e60 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 N")==0) {....k_C
13e70 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 N=Tcl_GetString(
13e80 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
13e90 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
13ea0 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 rcmp(str,"Email"
13eb0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 )==0) {....k_Ema
13ec0 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 il=Tcl_GetString
13ed0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
13ee0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 } else {....
13ef0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
13f00 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 terp,"Unknown pa
13f10 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a rameter",NULL);.
13f20 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
13f30 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d ROR;... }...}
13f40 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 .. }..#if OPE
13f50 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
13f60 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
13f70 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f L.. bne = BN_
13f80 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 new();.. rsa
13f90 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 = RSA_new();..
13fa0 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 pkey = EVP_PKE
13fb0 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 Y_new();.. if
13fc0 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (bne == NULL ||
13fd0 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 rsa == NULL ||
13fe0 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 pkey == NULL ||
13ff0 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 !BN_set_word(bne
14000 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 ,RSA_F4) ||...!R
14010 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f SA_generate_key_
14020 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c ex(rsa, keysize,
14030 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 bne, NULL) || !
14040 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f EVP_PKEY_assign_
14050 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 RSA(pkey, rsa))
14060 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 {...EVP_PKEY_fre
14070 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 e(pkey);.../* RS
14080 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 A_free(rsa); fre
14090 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 ed by EVP_PKEY_f
140a0 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 ree */...BN_free
140b0 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 (bne);.#else..
140c0 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 pkey = EVP_RSA
140d0 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 _gen((unsigned i
140e0 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 nt) keysize);..
140f0 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 ctx = EVP_PKE
14100 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e Y_CTX_new(pkey,N
14110 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 ULL);.. if (p
14120 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 key == NULL || c
14130 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 tx == NULL || !E
14140 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 VP_PKEY_keygen_i
14150 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 nit(ctx) ||...!E
14160 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f VP_PKEY_CTX_set_
14170 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 rsa_keygen_bits(
14180 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c ctx, keysize) ||
14190 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 !EVP_PKEY_keyge
141a0 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b n(ctx, &pkey)) {
141b0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
141c0 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b (pkey);...EVP_PK
141d0 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 EY_CTX_free(ctx)
141e0 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 ;.#endif...Tcl_S
141f0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
14200 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e "Error generatin
14210 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e g private key",N
14220 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 ULL);...return T
14230 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
14240 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 else {...if (is
14250 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 Str) {... out
14260 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d =BIO_new(BIO_s_m
14270 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d em());... PEM
14280 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 _write_bio_Priva
14290 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e teKey(out,pkey,N
142a0 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c ULL,NULL,0,NULL,
142b0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 NULL);... i=B
142c0 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 IO_read(out,buff
142d0 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 er,sizeof(buffer
142e0 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 )-1);... i=(i
142f0 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 <0) ? 0 : i;...
14300 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 buffer[i]='\0
14310 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 ';... Tcl_Set
14320 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
14330 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 t,buffer,0);...
14340 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 BIO_flush(out
14350 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
14360 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 e(out);...} else
14370 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
14380 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 _new(BIO_s_file(
14390 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 ));... BIO_wr
143a0 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 ite_filename(out
143b0 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 ,keyout);...
143c0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 PEM_write_bio_Pr
143d0 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 ivateKey(out,pke
143e0 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 y,NULL,NULL,0,NU
143f0 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 LL,NULL);...
14400 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f /* PEM_write_bio
14410 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f _RSAPrivateKey(o
14420 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e ut, rsa, NULL, N
14430 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 ULL, 0, NULL, NU
14440 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 LL); */... BI
14450 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
14460 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 .. .}....if ((ce
14470 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d rt=X509_new())==
14480 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 NULL) {... Tc
14490 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
144a0 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 rp,"Error genera
144b0 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ting certificate
144c0 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b request",NULL);
144d0 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f ... EVP_PKEY_
144e0 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
144f0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
14500 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
14510 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 000L... BN_fr
14520 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
14530 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c .. return(TCL
14540 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 _ERROR);...}....
14550 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e X509_set_version
14560 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 (cert,2);...ASN1
14570 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 _INTEGER_set(X50
14580 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 9_get_serialNumb
14590 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 er(cert),serial)
145a0 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f ;...X509_gmtime_
145b0 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f adj(X509_getm_no
145c0 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 tBefore(cert),0)
145d0 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f ;...X509_gmtime_
145e0 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f adj(X509_getm_no
145f0 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f tAfter(cert),(lo
14600 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 ng)60*60*24*days
14610 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 );...X509_set_pu
14620 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b bkey(cert,pkey);
14630 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 ....name=X509_ge
14640 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 t_subject_name(c
14650 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 ert);....X509_NA
14660 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
14670 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 txt(name,"C", MB
14680 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
14690 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
146a0 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c *) k_C, -1, -1,
146b0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
146c0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
146d0 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 t(name,"ST", MBS
146e0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
146f0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
14700 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c *) k_ST, -1, -1,
14710 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
14720 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
14730 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 t(name,"L", MBST
14740 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
14750 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
14760 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 ) k_L, -1, -1, 0
14770 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
14780 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
14790 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 name,"O", MBSTRI
147a0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
147b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
147c0 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b k_O, -1, -1, 0);
147d0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
147e0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
147f0 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e me,"OU", MBSTRIN
14800 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
14810 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
14820 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _OU, -1, -1, 0);
14830 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
14840 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
14850 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e me,"CN", MBSTRIN
14860 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
14870 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
14880 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _CN, -1, -1, 0);
14890 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
148a0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
148b0 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 me,"Email", MBST
148c0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
148d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
148e0 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d ) k_Email, -1, -
148f0 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 1, 0);....X509_s
14900 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 et_subject_name(
14910 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 cert,name);....i
14920 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 f (!X509_sign(ce
14930 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 rt,pkey,EVP_sha2
14940 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 56())) {... X
14950 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 509_free(cert);.
14960 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 .. EVP_PKEY_f
14970 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
14980 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
14990 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
149a0 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 00L... BN_fre
149b0 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 e(bne);.#endif..
149c0 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
149d0 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 lt(interp,"Error
149e0 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 signing certifi
149f0 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 cate",NULL);...
14a00 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
14a10 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 ROR;...}....if (
14a20 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f isStr) {... o
14a30 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
14a40 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 _mem());... P
14a50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 EM_write_bio_X50
14a60 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 9(out,cert);...
14a70 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 i=BIO_read(ou
14a80 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 t,buffer,sizeof(
14a90 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 buffer)-1);...
14aa0 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 i=(i<0) ? 0 :
14ab0 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b i;... buffer[
14ac0 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 i]='\0';... T
14ad0 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
14ae0 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 ,pemout,buffer,0
14af0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 );... BIO_flu
14b00 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 sh(out);... B
14b10 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 IO_free(out);...
14b20 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f } else {... o
14b30 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
14b40 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 _file());...
14b50 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
14b60 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a me(out,pemout);.
14b70 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
14b80 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 bio_X509(out,cer
14b90 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 t);... BIO_fr
14ba0 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d ee_all(out);...}
14bb0 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 ....X509_free(ce
14bc0 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f rt);...EVP_PKEY_
14bd0 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
14be0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
14bf0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
14c00 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 000L...BN_free(b
14c10 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 ne);.#endif..
14c20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 }..}..break;.
14c30 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 default:..brea
14c40 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 k;. }. ret
14c50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
14c60 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
14c70 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a Data;.}.../*****
14c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
14c90 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 ./* Init
14ca0 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
14cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
14cc0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
14cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d00 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
14d10 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a ls_Free --. *. *
14d20 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
14d30 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 cleans up when a
14d40 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
14d50 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 d channel. *.is
14d60 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 closed and its r
14d70 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 eference count f
14d80 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a alls below 1. *.
14d90 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e * Results:. *.n
14da0 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
14db0 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 ffects:. *.Frees
14dc0 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 all the state.
14dd0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
14de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e10 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
14e20 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a .Tls_Free(char *
14e30 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 blockPtr) {.
14e40 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
14e50 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b = (State *)block
14e60 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 Ptr;.. dprint
14e70 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
14e80 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 Tls_Clean(stat
14e90 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 ePtr);. ckfre
14ea0 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c e(blockPtr);.}..
14eb0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
14ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
14f00 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a Tls_Clean --. *.
14f10 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
14f20 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e e cleans up when
14f30 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
14f40 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 sed channel. *.i
14f50 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 s closed and its
14f60 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
14f70 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 falls below 1.
14f80 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 This should. *.
14f90 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 be called synchr
14fa0 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 onously by the C
14fb0 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e loseProc, not in
14fc0 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c the. *.Eventual
14fd0 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e lyFree callback.
14fe0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
14ff0 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.none. *. * Si
15000 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 de effects:. *.F
15010 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 rees all the sta
15020 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d te. *. *--------
15030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
15070 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 void Tls_Clean(S
15080 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 tate *statePtr)
15090 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 {. dprintf("C
150a0 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
150b0 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 . * we're as
150c0 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 suming here that
150d0 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 we're single-th
150e0 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 readed. */.
150f0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
15100 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 >timer != (Tcl_T
15110 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 imerToken) NULL)
15120 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 {..Tcl_DeleteTi
15130 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 merHandler(state
15140 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 Ptr->timer);..st
15150 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 atePtr->timer =
15160 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
15170 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
15180 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 rotos) {..ckfree
15190 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
151a0 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 s);..statePtr->p
151b0 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 rotos = NULL;.
151c0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
151d0 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a ePtr->bio) {../*
151e0 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 This will call
151f0 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 SSL_shutdown. Bu
15200 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 g 1414045 */..dp
15210 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f rintf("BIO_free_
15220 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 all(%p)", stateP
15230 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 tr->bio);..BIO_f
15240 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 ree_all(statePtr
15250 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 ->bio);..statePt
15260 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 r->bio = NULL;.
15270 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
15280 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 tePtr->ssl) {..d
15290 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 printf("SSL_free
152a0 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d (%p)", statePtr-
152b0 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 >ssl);..SSL_free
152c0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
152d0 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 ..statePtr->ssl
152e0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
152f0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
15300 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f ctx) {..SSL_CTX_
15310 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 free(statePtr->c
15320 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e tx);..statePtr->
15330 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = 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 61 6c 6c 62 61 63 6b 29 20 7b 0a tr->callback) {.
15360 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
15370 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c t(statePtr->call
15380 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 back);..statePtr
15390 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c ->callback = NUL
153a0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
153b0 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
153c0 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 ord) {..Tcl_Decr
153d0 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
153e0 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 r->password);..s
153f0 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
15400 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a d = NULL;. }.
15410 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
15420 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 ->vcmd) {..Tcl_D
15430 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ecrRefCount(stat
15440 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 ePtr->vcmd);..st
15450 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e atePtr->vcmd = N
15460 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
15470 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
15480 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d ng");.}.../*. *-
15490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
154a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
154b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
154c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
154d0 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 --. *. * Tls_Ini
154e0 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 t --. *. *.This
154f0 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 is a package ini
15500 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 tialization proc
15510 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 edure, which is
15520 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c called. *.by Tcl
15530 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 when this packa
15540 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 ge is to be adde
15550 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 d to an interpre
15560 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ter.. *. * Resul
15570 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 ts: Ssl configu
15580 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 red and loaded.
15590 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
155a0 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 s:. *. create th
155b0 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 e ssl command, i
155c0 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f nitialize ssl co
155d0 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ntext. *. *-----
155e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
155f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
15620 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 */.DLLEXPORT int
15630 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e Tls_Init(Tcl_In
15640 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a terp *interp) {.
15650 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74 const char t
15660 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b lsTclInitScript[
15670 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 ] = {.#include "
15680 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 tls.tcl.h"..0x00
15690 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 . };.. dpr
156a0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
156b0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 . /*. * W
156c0 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 54 e only support T
156d0 63 6c 20 38 2e 34 20 6f 72 20 6e 65 77 65 72 0a cl 8.4 or newer.
156e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 */. if (
156f0 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f .#ifdef USE_TCL_
15700 53 54 55 42 53 0a 09 54 63 6c 5f 49 6e 69 74 53 STUBS..Tcl_InitS
15710 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e tubs(interp, "8.
15720 34 22 2c 20 30 29 0a 23 65 6c 73 65 0a 09 54 63 4", 0).#else..Tc
15730 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 l_PkgRequire(int
15740 65 72 70 2c 20 22 54 63 6c 22 2c 20 22 38 2e 34 erp, "Tcl", "8.4
15750 2d 22 2c 20 30 29 0a 23 65 6e 64 69 66 0a 09 20 -", 0).#endif..
15760 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
15770 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
15780 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 }.. if (Tls
15790 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 LibInit(0) != TC
157a0 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 L_OK) {..Tcl_App
157b0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
157c0 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 , "could not ini
157d0 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 tialize SSL libr
157e0 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ary", NULL);..re
157f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
15800 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 }.. Tcl_C
15810 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
15820 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 interp, "tls::ci
15830 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f phers", CiphersO
15840 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
15850 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
15860 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
15870 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
15880 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
15890 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 erp, "tls::conne
158a0 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 ction", Connecti
158b0 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 onInfoObjCmd, (C
158c0 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
158d0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
158e0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
158f0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
15900 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
15910 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 ::handshake", Ha
15920 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 ndshakeObjCmd, (
15930 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
15940 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
15950 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
15960 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
15970 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
15980 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f s::import", Impo
15990 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e rtObjCmd, (Clien
159a0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
159b0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
159c0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
159d0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
159e0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e interp, "tls::un
159f0 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 import", Unimpor
15a00 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 tObjCmd, (Client
15a10 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
15a20 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
15a30 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
15a40 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
15a50 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 nterp, "tls::sta
15a60 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 tus", StatusObjC
15a70 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
15a80 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
15a90 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
15aa0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
15ab0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
15ac0 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 , "tls::version"
15ad0 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c , VersionObjCmd,
15ae0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
15af0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
15b00 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
15b10 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
15b20 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
15b30 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 tls::misc", Misc
15b40 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
15b50 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
15b60 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
15b70 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
15b80 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
15b90 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 terp, "tls::prot
15ba0 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c ocols", Protocol
15bb0 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 sObjCmd, (Client
15bc0 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
15bd0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
15be0 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 ULL);.. if (i
15bf0 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 nterp) {..Tcl_Ev
15c00 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 al(interp, tlsTc
15c10 6c 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 lInitScript);.
15c20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 }.. return(
15c30 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 Tcl_PkgProvide(i
15c40 6e 74 65 72 70 2c 20 22 74 6c 73 22 2c 20 50 41 nterp, "tls", PA
15c50 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 29 3b CKAGE_VERSION));
15c60 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
15c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
15ca0 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 . *. *.Tls_SafeI
15cb0 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d nit --. *. *.---
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 2a 0a 20 -------------*.
15cf0 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 *.Standard proce
15d00 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79 dure required by
15d10 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 'load'.. *.Init
15d20 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 ializes this ext
15d30 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 ension for a saf
15d40 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 e interpreter..
15d50 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
15d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d80 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 --*. *. *.Side e
15d90 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f ffects:. *..As o
15da0 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a f 'Tls_Init'. *.
15db0 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 *.Result:. *..A
15dc0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 standard Tcl er
15dd0 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d ror code.. *. *-
15de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e10 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 -----*. */.DLLEX
15e20 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 PORT int Tls_Saf
15e30 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 eInit(Tcl_Interp
15e40 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
15e50 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
15e60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 6c );. return(Tl
15e70 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b s_Init(interp));
15e80 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
15e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
15ec0 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 . *. *.TlsLibIni
15ed0 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d t --. *. *.-----
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 2a 0a 20 2a 09 -----------*. *.
15f10 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 Initializes SSL
15f20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 library once per
15f30 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 application. *.
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 2d ----------------
15f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f70 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 *. *. *.Side eff
15f80 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 ects:. *..initia
15f90 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 lizes SSL librar
15fa0 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a y. *. *.Result:.
15fb0 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d *..none. *. *--
15fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ff0 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 ----*. */.static
16000 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 int TlsLibInit(
16010 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 int uninitialize
16020 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 ) {. static i
16030 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d nt initialized =
16040 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 0;. int stat
16050 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 us = TCL_OK;.#if
16060 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
16070 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
16080 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
16090 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d ). size_t num
160a0 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a _locks;.#endif..
160b0 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 if (uninitia
160c0 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e lize) {..if (!in
160d0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 itialized) {..
160e0 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 dprintf("Asked
160f0 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 to uninitialize
16100 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 , but we are not
16110 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a initialized");.
16120 0a 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c .. return(TCL
16130 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e _OK);..}...dprin
16140 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 tf("Asked to uni
16150 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 nitialize");..#i
16160 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
16170 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
16180 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
16190 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 S)..Tcl_MutexLoc
161a0 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 k(&init_mx);...i
161b0 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 f (locks) {..
161c0 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 free(locks);..
161d0 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b locks = NULL;
161e0 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 .. locksCount
161f0 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a = 0;..}.#endif.
16200 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 .initialized = 0
16210 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
16220 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
16230 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
16240 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 HREADS)..Tcl_Mut
16250 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d exUnlock(&init_m
16260 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 x);.#endif...ret
16270 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 urn(TCL_OK);.
16280 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 }.. if (init
16290 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 ialized) {..dpri
162a0 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 ntf("Called, but
162b0 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 using cached va
162c0 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 28 73 lue");..return(s
162d0 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 tatus);. }..
162e0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
162f0 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e ed");..#if defin
16300 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
16310 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
16320 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 CL_THREADS).
16330 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 Tcl_MutexLock(&i
16340 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a nit_mx);.#endif.
16350 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 initialized
16360 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 = 1;..#if define
16370 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
16380 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
16390 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e L_THREADS). n
163a0 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 um_locks = 1;.
163b0 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 locksCount = (
163c0 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a int) num_locks;.
163d0 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c locks = mall
163e0 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 oc(sizeof(*locks
163f0 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a ) * num_locks);.
16400 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 memset(locks
16410 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 , 0, sizeof(*loc
16420 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 ks) * num_locks)
16430 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a ;.#endif.. /*
16440 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 Initialize BOTH
16450 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c libcrypto and l
16460 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 ibssl. */. OP
16470 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f ENSSL_init_ssl(O
16480 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 PENSSL_INIT_LOAD
16490 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f _SSL_STRINGS | O
164a0 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 PENSSL_INIT_LOAD
164b0 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a _CRYPTO_STRINGS.
164c0 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f .| OPENSSL_INIT_
164d0 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 ADD_ALL_CIPHERS
164e0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 | OPENSSL_INIT_A
164f0 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 DD_ALL_DIGESTS,
16500 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f NULL);.. BIO_
16510 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 new_tcl(NULL, 0)
16520 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a ;..#if 0. /*.
16530 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a * XXX:TODO:
16540 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 Remove this cod
16550 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 e and replace it
16560 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 with a check.
16570 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 * for enough
16580 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e entropy and do n
16590 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 ot try to create
165a0 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 our own. *
165b0 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 terrible entropy
165c0 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a . */. /*.
165d0 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 * Seed the
165e0 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 random number ge
165f0 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 nerator in the S
16600 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 SL library,.
16610 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f * using the do/
16620 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 while construct
16630 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 because of the b
16640 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 ug note in the.
16650 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 * OpenSSL FA
16660 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e Q at http://www.
16670 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 openssl.org/supp
16680 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 ort/faq.html#USE
16690 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a R1. *. *
166a0 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 The crux of the
166b0 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 problem is that
166c0 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 Solaris 7 does
166d0 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 not have a.
166e0 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 * /dev/random or
166f0 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 /dev/urandom de
16700 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f vice so it canno
16710 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a t gather enough.
16720 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 * entropy f
16730 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 rom the RAND_see
16740 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 d() when TLS ini
16750 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 tializes and ref
16760 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 uses. * to g
16770 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 o further. Earli
16780 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f er versions of O
16790 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f penSSL carried o
167a0 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 n regardless..
167b0 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 */. srand(
167c0 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 (unsigned int) t
167d0 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e ime((time_t *) N
167e0 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a ULL));. do {.
167f0 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c .for (i = 0; i <
16800 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 16; i++) {..
16810 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 rnd_seed[i] = 1
16820 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 + (char) (255.0
16830 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f * rand()/(RAND_
16840 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 MAX+1.0));..}..R
16850 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 AND_seed(rnd_see
16860 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 d, sizeof(rnd_se
16870 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c ed));. } whil
16880 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 e (RAND_status()
16890 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a != 1);.#endif..
168a0 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
168b0 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
168c0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
168d0 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 ADS)..Tcl_MutexU
168e0 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b nlock(&init_mx);
168f0 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e .#endif...return
16900 28 73 74 61 74 75 73 29 3b 0a 7d 0a (status);.}.