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: 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 .ver = "none";..
1be0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 break;. defau
1bf0: 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e lt:..ver = "unkn
1c00: 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 own";..break;.
1c10: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 }.. switch
1c20: 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b (content_type) {
1c30: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1c40: 54 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 T_HEADER:..type
1c50: 3d 20 22 48 65 61 64 65 72 22 3b 0a 09 62 72 65 = "Header";..bre
1c60: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c ak;. case SSL
1c70: 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 3_RT_INNER_CONTE
1c80: 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d NT_TYPE:..type =
1c90: 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 "Inner Content
1ca0: 54 79 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 Type";..break;.
1cb0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f case SSL3_RT_
1cc0: 43 48 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 CHANGE_CIPHER_SP
1cd0: 45 43 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 61 EC:..type = "Cha
1ce0: 6e 67 65 20 43 69 70 68 65 72 22 3b 0a 09 62 72 nge Cipher";..br
1cf0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 eak;. case SS
1d00: 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 L3_RT_ALERT:..ty
1d10: 70 65 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 pe = "Alert";..b
1d20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 reak;. case S
1d30: 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 SL3_RT_HANDSHAKE
1d40: 3a 0a 09 74 79 70 65 20 3d 20 22 48 61 6e 64 73 :..type = "Hands
1d50: 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 hake";..break;.
1d60: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f case SSL3_RT_
1d70: 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 APPLICATION_DATA
1d80: 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70 20 44 :..type = "App D
1d90: 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 ata";..break;.
1da0: 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54 5f case DTLS1_RT_
1db0: 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70 65 HEARTBEAT:..type
1dc0: 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b 0a = "Heartbeat";.
1dd0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 .break;. defa
1de0: 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e ult:..type = "un
1df0: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 known";. }..
1e00: 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 /* Needs comp
1e10: 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 ile time option
1e20: 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 "enable-ssl-trac
1e30: 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 e". */. if ((
1e40: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 bio = BIO_new(BI
1e50: 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e O_s_mem())) != N
1e60: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 ULL) {..int n;..
1e70: 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f SSL_trace(write_
1e80: 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 p, version, cont
1e90: 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c ent_type, buf, l
1ea0: 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a en, ssl, (void *
1eb0: 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f )bio);..n = BIO_
1ec0: 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 read(bio, buffer
1ed0: 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e , min(BIO_pendin
1ee0: 67 28 62 69 6f 29 2c 20 31 34 39 39 39 29 29 3b g(bio), 14999));
1ef0: 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20 ..n = (n<0) ? 0
1f00: 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20 : n;..buffer[n]
1f10: 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f = 0;..(void)BIO_
1f20: 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 42 49 4f flush(bio);..BIO
1f30: 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 7d _free(bio);. }
1f40: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
1f50: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
1f60: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
1f70: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
1f80: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
1f90: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
1fa0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1fb0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1fc0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
1fd0: 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 2d Obj("message", -
1fe0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
1ff0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2000: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2010: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
2020: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
2030: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
2040: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
2050: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
2060: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2070: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2080: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2090: 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 22 write_p ? "Sent"
20a0: 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 2d : "Received", -
20b0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
20c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
20d0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
20e0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
20f0: 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 20 bj(ver, -1));.
2100: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2110: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2120: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2130: 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 65 ewStringObj(type
2140: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
2150: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2160: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
2170: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
2180: 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 ngObj(buffer, -1
2190: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c ));.. /* Eval
21a0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
21b0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
21c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
21d0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 );. EvalCallb
21e0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
21f0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 ePtr, cmdPtr);.
2200: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
2210: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 unt(cmdPtr);.}.#
2220: 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d endif.../*. *---
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2270: 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c . *. * VerifyCal
2280: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d lback --. *. *.M
2290: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 74 onitors SSL cert
22a0: 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 ificate validati
22b0: 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 64 on process. Used
22c0: 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 0a to control the.
22d0: 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 6e *.behavior when
22e0: 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 5f the SSL_VERIFY_
22f0: 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 74 PEER flag is set
2300: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 . This is called
2310: 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 63 . *.whenever a c
2320: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 6e ertificate is in
2330: 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 64 spected or decid
2340: 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c 6c ed invalid. Call
2350: 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 63 ed for. *.each c
2360: 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 68 ertificate in th
2370: 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 2a e cert chain.. *
2380: 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 63 . * Checks:. *.c
2390: 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69 6e ertificate chain
23a0: 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61 72 is checked star
23b0: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64 65 ting with the de
23c0: 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c 65 epest nesting le
23d0: 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72 6f vel. *. (the ro
23e0: 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74 ot CA certificat
23f0: 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75 70 e) and worked up
2400: 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65 72 ward to the peer
2410: 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e 0a 's certificate..
2420: 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72 65 *.All signature
2430: 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75 72 s are valid, cur
2440: 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69 74 rent time is wit
2450: 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c 61 hin first and la
2460: 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d 65 st validity time
2470: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74 20 .. *.Check that
2480: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
2490: 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68 65 is issued by the
24a0: 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69 63 issuer certific
24b0: 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09 43 ate issuer.. *.C
24c0: 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61 74 heck the revocat
24d0: 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20 65 ion status for e
24e0: 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65 2e ach certificate.
24f0: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76 61 . *.Check the va
2500: 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67 69 lidity of the gi
2510: 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65 20 ven CRL and the
2520: 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e 20 cert revocation
2530: 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63 6b status.. *.Check
2540: 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f 66 the policies of
2550: 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66 69 all the certifi
2560: 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67 73 cates. *. * Args
2570: 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f 6b . *.preverify_ok
2580: 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 68 indicates wheth
2590: 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63 61 er the certifica
25a0: 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 te verification
25b0: 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e 6f passed (1) or no
25c0: 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73 75 t (0). *. * Resu
25d0: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 lts:. *.A callba
25e0: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 ck bound to the
25f0: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72 socket may retur
2600: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 n one of:. *.
2610: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 0...- the certi
2620: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 ficate is deemed
2630: 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20 76 invalid, send v
2640: 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09 09 erification. *..
2650: 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65 72 .. failure aler
2660: 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20 74 t to peer, and t
2670: 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68 61 erminate handsha
2680: 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09 2d ke.. *. 1...-
2690: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
26a0: 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69 64 is deemed valid
26b0: 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 , continue with
26c0: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 handshake.. *.
26d0: 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09 2d empty string.-
26e0: 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 65 no change to ce
26f0: 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 rtificate valida
2700: 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 tion. *. * Side
2710: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 effects:. *.The
2720: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 err field of the
2730: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 currently opera
2740: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 tive State is se
2750: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 t. *. to a stri
2760: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 ng describing th
2770: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f e SSL negotiatio
2780: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e n failure reason
2790: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
27e0: 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79 43 atic int.VerifyC
27f0: 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 allback(int ok,
2800: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a X509_STORE_CTX *
2810: 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f ctx) {. Tcl_O
2820: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
2830: 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 53 SSL *ssl..= (S
2840: 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43 SL*)X509_STORE_C
2850: 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63 TX_get_ex_data(c
2860: 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64 tx, SSL_get_ex_d
2870: 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43 ata_X509_STORE_C
2880: 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58 TX_idx());. X
2890: 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35 509 *cert..= X5
28a0: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
28b0: 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74 _current_cert(ct
28c0: 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 x);. State *s
28d0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 tatePtr.= (State
28e0: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
28f0: 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c ta(ssl);. Tcl
2900: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
2910: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
2920: 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70 74 rp;. int dept
2930: 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f h..= X509_STORE_
2940: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65 CTX_get_error_de
2950: 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69 6e pth(ctx);. in
2960: 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53 54 t err..= X509_ST
2970: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f ORE_CTX_get_erro
2980: 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70 72 r(ctx);.. dpr
2990: 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25 64 intf("Verify: %d
29a0: 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20 ", ok);.. if
29b0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 (statePtr->vcmd
29c0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
29d0: 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65 50 L) {..if (stateP
29e0: 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c tr->vflags & SSL
29f0: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f _VERIFY_FAIL_IF_
2a00: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a NO_PEER_CERT) {.
2a10: 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a . return ok;.
2a20: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 .} else {.. r
2a30: 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 eturn 1;..}.
2a40: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 } else if (cert
2a50: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d == NULL || ssl =
2a60: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
2a70: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 n 0;. }..
2a80: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
2a90: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 d to eval */.
2aa0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
2ab0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
2ac0: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 Ptr->vcmd);.
2ad0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2ae0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2af0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2b00: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 StringObj("verif
2b10: 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 y", -1));. Tc
2b20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2b30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
2b40: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 mdPtr,..Tcl_NewS
2b50: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
2b60: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
2b70: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
2b80: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2b90: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2ba0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2bb0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 Tcl_NewIntObj(de
2bc0: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c pth));. Tcl_L
2bd0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2be0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2bf0: 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f tr, Tls_NewX509O
2c00: 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 bj(interp, cert)
2c10: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2c20: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2c30: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2c40: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b Tcl_NewIntObj(ok
2c50: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2c60: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2c70: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2c80: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f ..Tcl_NewStringO
2c90: 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76 bj((char*)X509_v
2ca0: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 erify_cert_error
2cb0: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 _string(err), -1
2cc0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 ));.. /* Prev
2cd0: 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 ent I/O while ca
2ce0: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72 6f llback is in pro
2cf0: 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 gress */. /*
2d00: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
2d10: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 |= TLS_TCL_CALLB
2d20: 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 ACK; */.. /*
2d30: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
2d40: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
2d50: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
2d60: 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 dPtr);. ok =
2d70: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
2d80: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
2d90: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
2da0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
2db0: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 Ptr);.. /* st
2dc0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d atePtr->flags &=
2dd0: 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 ~(TLS_TCL_CALLB
2de0: 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 ACK); */. ret
2df0: 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 urn(ok);./* By d
2e00: 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 efault, leave ve
2e10: 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 rification uncha
2e20: 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a nged. */.}.../*.
2e30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e70: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
2e80: 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 Error --. *. *.C
2e90: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 alls callback wi
2ea0: 74 68 20 6c 69 73 74 20 6f 66 20 65 72 72 6f 72 th list of error
2eb0: 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 s.. *. * Side ef
2ec0: 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 fects:. *.The er
2ed0: 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 r field of the c
2ee0: 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 urrently operati
2ef0: 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a ve State is set.
2f00: 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 *. to a string
2f10: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 describing the
2f20: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 SSL negotiation
2f30: 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 failure reason.
2f40: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f80: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
2f90: 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 .Tls_Error(State
2fa0: 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 *statePtr, char
2fb0: 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c *msg) {. Tcl
2fc0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
2fd0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
2fe0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
2ff0: 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 *cmdPtr, *listPt
3000: 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 r;. unsigned
3010: 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74 long err;. st
3020: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 atePtr->err = ms
3030: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 g;.. dprintf(
3040: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
3050: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 if (statePtr->ca
3060: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f llback == (Tcl_O
3070: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 bj*)NULL)..retur
3080: 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 n;.. /* Creat
3090: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
30a0: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 l */. cmdPtr
30b0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
30c0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
30d0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f lback);. Tcl_
30e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
30f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3100: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
3110: 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d ngObj("error", -
3120: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
3130: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3140: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3150: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
3160: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
3170: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
3180: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
3190: 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21 3d ;. if (msg !=
31a0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 NULL) {..Tcl_Li
31b0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
31c0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
31d0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
31e0: 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a Obj(msg, -1));..
31f0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 } else if ((
3200: 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 msg = Tcl_GetStr
3210: 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 ingFromObj(Tcl_G
3220: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
3230: 72 70 29 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e rp), NULL)) != N
3240: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 ULL) {..Tcl_List
3250: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3260: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3270: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3280: 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 j(msg, -1));..
3290: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 } else {..list
32a0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
32b0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 tObj(0, NULL);..
32c0: 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 45 52 while ((err = ER
32d0: 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 20 21 R_get_error()) !
32e0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f = 0) {.. Tcl_
32f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3300: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
3310: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tPtr, Tcl_NewStr
3320: 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f ingObj(ERR_reaso
3330: 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 n_error_string(e
3340: 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 rr), -1));..}..T
3350: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3360: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3370: 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 72 29 cmdPtr, listPtr)
3380: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
3390: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
33a0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
33b0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
33c0: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 dPtr);. EvalC
33d0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
33e0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
33f0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
3400: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
3410: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
3460: 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 . * KeyLogCallba
3470: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 ck --. *. *.Writ
3480: 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 20 64 e received key d
3490: 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e ata to log file.
34a0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
34b0: 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a cts:. *.none. *.
34c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3500: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b -----. */.void K
3510: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f eyLogCallback(co
3520: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f nst SSL *ssl, co
3530: 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 nst char *line)
3540: 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 {. char *str
3550: 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c = getenv(SSLKEYL
3560: 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c OGFILE);. FIL
3570: 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72 69 E *fd;.. dpri
3580: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
3590: 20 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a 09 if (str) {..
35a0: 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 fd = fopen(str,
35b0: 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 "a");..fprintf(f
35c0: 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b d, "%s\n",line);
35d0: 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 ..fclose(fd);.
35e0: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d }.}.../*. *---
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3630: 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 20 . *. * Password
3640: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 Callback --. *.
3650: 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 *.Called when a
3660: 70 61 73 73 77 6f 72 64 20 66 6f 72 20 61 20 70 password for a p
3670: 72 69 76 61 74 65 20 6b 65 79 20 6c 6f 61 64 69 rivate key loadi
3680: 6e 67 2f 73 74 6f 72 69 6e 67 20 61 20 50 45 4d ng/storing a PEM
3690: 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74 65 20 . *.certificate
36a0: 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e with encryption.
36b0: 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 20 Evals callback
36c0: 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75 72 script and retur
36d0: 6e 73 0a 20 2a 09 74 68 65 20 72 65 73 75 6c 74 ns. *.the result
36e0: 20 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64 as the password
36f0: 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a string in buf..
3700: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
3710: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
3720: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
3730: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
3740: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
3750: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73 Returns:. *.Pass
3760: 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74 word size in byt
3770: 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 es or -1 for an
3780: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d error.. *. *----
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
37d0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 */.static int.P
37e0: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 asswordCallback(
37f0: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 char *buf, int s
3800: 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c ize, int rwflag,
3810: 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a void *udata) {.
3820: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
3830: 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr.= (State *)
3840: 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 udata;. Tcl_I
3850: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
3860: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
3870: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
3880: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
3890: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ode;.. dprint
38a0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
38b0: 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c 62 /* If no callb
38c0: 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c 74 ack, use default
38d0: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 callback */.
38e0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
38f0: 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 assword == NULL)
3900: 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c {..if (Tcl_Eval
3910: 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a Ex(interp, "tls:
3920: 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c 20 :password", -1,
3930: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
3940: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 == TCL_OK) {..
3950: 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 28 char *ret = (
3960: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 char *) Tcl_GetS
3970: 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 tringResult(inte
3980: 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 70 rp);.. strncp
3990: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a y(buf, ret, (siz
39a0: 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 e_t) size);..
39b0: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72 return (int)str
39c0: 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c 73 len(ret);..} els
39d0: 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 e {.. return
39e0: 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 -1;..}. }..
39f0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
3a00: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 and to eval */.
3a10: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
3a20: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
3a30: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
3a40: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3a50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3a60: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3a70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3a80: 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 "password", -1))
3a90: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3aa0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3ab0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3ac0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 cl_NewIntObj(rwf
3ad0: 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c lag));. Tcl_L
3ae0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3af0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3b00: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
3b10: 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 j(size));.. T
3b20: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
3b30: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
3b40: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 ;. Tcl_Preser
3b50: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
3b60: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
3b70: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
3b80: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
3b90: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
3ba0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
3bb0: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
3bc0: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
3bd0: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
3be0: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
3bf0: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
3c00: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
3c10: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
3c20: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
3c30: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
3c40: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
3c50: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
3c60: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
3c70: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
3c80: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
3c90: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
3ca0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
3cb0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
3cc0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
3cd0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 ePtr);.. /* I
3ce0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 61 f successful, pa
3cf0: 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f 72 64 ss back password
3d00: 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72 75 6e string and trun
3d10: 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 cate if too long
3d20: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 65 */. if (code
3d30: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 69 == TCL_OK) {..i
3d40: 6e 74 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 72 nt len;..char *r
3d50: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 et = (char *) Tc
3d60: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
3d70: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 bj(Tcl_GetObjRes
3d80: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c 65 ult(interp), &le
3d90: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 73 n);..if (len > s
3da0: 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 ize-1) {.. le
3db0: 6e 20 3d 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 n = size-1;..}..
3dc0: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 strncpy(buf, ret
3dd0: 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b , (size_t) len);
3de0: 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 ..buf[len] = '\0
3df0: 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 ';..Tcl_Release(
3e00: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
3e10: 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 6c 65 erp);..return(le
3e20: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 n);. }. Tc
3e30: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
3e40: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
3e50: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d return -1;.}
3e60: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
3eb0: 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 * Session Callba
3ec0: 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d ck for Clients -
3ed0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 -. *. *.Called w
3ee0: 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f hen a new sessio
3ef0: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 n is added to th
3f00: 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 e cache. In TLS
3f10: 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 1.3. *.this may
3f20: 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 be received mult
3f30: 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 iple times after
3f40: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 the handshake.
3f50: 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 For. *.earlier v
3f60: 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 ersions, this wi
3f70: 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 64 ll be received d
3f80: 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 uring the handsh
3f90: 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 ake.. *.This is
3fa0: 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77 61 the preferred wa
3fb0: 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 y to obtain a re
3fc0: 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e sumable session.
3fd0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
3fe0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
3ff0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
4000: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
4010: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
4020: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
4030: 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 *.0 = error wher
4040: 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 e session will b
4050: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 e immediately re
4060: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 moved from the i
4070: 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 nternal cache..
4080: 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 *.1 = success wh
4090: 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 ere app retains
40a0: 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 session in sessi
40b0: 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 on cache, and mu
40c0: 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 st call SSL_SESS
40d0: 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 ION_free() when
40e0: 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d done.. *. *-----
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
4130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 */.static int.Se
4140: 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 6f ssionCallback(co
4150: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53 53 nst SSL *ssl, SS
4160: 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 L_SESSION *sessi
4170: 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 on) {. State
4180: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
4190: 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f te*)SSL_get_app_
41a0: 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 data((SSL *)ssl)
41b0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
41c0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
41d0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
41e0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
41f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 ;. const unsi
4200: 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 gned char *ticke
4210: 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 t;. const uns
4220: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 igned char *sess
4230: 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 ion_id;. size
4240: 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 _t len2;. uns
4250: 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a igned int ulen;.
4260: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
4270: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
4280: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
4290: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a ack == (Tcl_Obj*
42a0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
42b0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
42c0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 OK;. } else i
42d0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 f (ssl == 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 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4300: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
4310: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
4320: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
4330: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
4340: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
4350: 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 callback);. T
4360: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
4370: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
4380: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
4390: 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f tringObj("sessio
43a0: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 n", -1));. Tc
43b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
43c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
43d0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
43e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
43f0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
4400: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
4410: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 -1));.. /* S
4420: 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 ession id */.
4430: 20 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 session_id = SS
4440: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 L_SESSION_get_id
4450: 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 (session, &ulen)
4460: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
4470: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
4480: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
4490: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f cl_NewByteArrayO
44a0: 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 bj(session_id, (
44b0: 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 int) ulen));..
44c0: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 /* Session tic
44d0: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 ket */. SSL_S
44e0: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b ESSION_get0_tick
44f0: 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 et(session, &tic
4500: 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 ket, &len2);.
4510: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4520: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4530: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4540: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 wByteArrayObj(ti
4550: 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 cket, (int) len2
4560: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 ));.. /* Life
4570: 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 time - number of
4580: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 seconds */.
4590: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
45a0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
45b0: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 cmdPtr,..Tcl_Ne
45c0: 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 wLongObj((long)
45d0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
45e0: 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f ticket_lifetime_
45f0: 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b hint(session)));
4600: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
4610: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
4620: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
4630: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
4640: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b EvalCallback
4650: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
4660: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 r, cmdPtr);.
4670: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
4680: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 (cmdPtr);. re
4690: 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 turn 0;.}.../*.
46a0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46e0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 ----. *. * ALPN
46f0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 Callback for Ser
4700: 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c vers and NPN Cal
4710: 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 lback for Client
4720: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f s --. *. *.Perfo
4730: 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 rm protocol (htt
4740: 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 p/1.1, h2, h3, e
4750: 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 tc.) selection f
4760: 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 or the. *.incomi
4770: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 ng connection. C
4780: 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c alled after Hell
4790: 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c o and server cal
47a0: 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 lbacks.. *.Where
47b0: 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 'out' is select
47c0: 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 ed protocol and
47d0: 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 'in' is the peer
47e0: 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 advertised list
47f0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
4800: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
4810: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
4820: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
4830: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
4840: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
4850: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
4860: 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f R_OK: ALPN proto
4870: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 col selected. Th
4880: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
4890: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 tinues.. *.SSL_T
48a0: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
48b0: 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 FATAL: There was
48c0: 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 no overlap betw
48d0: 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 een the client's
48e0: 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 . *. supplied
48f0: 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 list and the se
4900: 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 rver configurati
4910: 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 on. The connecti
4920: 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 on will be abort
4930: 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 ed.. *.SSL_TLSEX
4940: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 T_ERR_NOACK: ALP
4950: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 N protocol not s
4960: 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 elected, e.g., b
4970: 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 ecause no ALPN.
4980: 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 *. protocols
4990: 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 are configured f
49a0: 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 or this connecti
49b0: 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 on. The connecti
49c0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
49d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a10: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
4a20: 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 c int.ALPNCallba
4a30: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 ck(const SSL *ss
4a40: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 l, const unsigne
4a50: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e d char **out, un
4a60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 signed char *out
4a70: 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 len,..const unsi
4a80: 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 gned char *in, u
4a90: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 nsigned int inle
4aa0: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a n, void *arg) {.
4ab0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
4ac0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
4ad0: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 g;. Tcl_Inter
4ae0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
4af0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
4b00: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
4b10: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c r;. int code,
4b20: 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e res;.. dprin
4b30: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
4b40: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 if (ssl == NU
4b50: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c LL || arg == NUL
4b60: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
4b70: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
4b80: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a K;. }.. /*
4b90: 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c Select protocol
4ba0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f */. if (SSL_
4bb0: 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 select_next_prot
4bc0: 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 o(out, outlen, s
4bd0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c tatePtr->protos,
4be0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
4bf0: 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 s_len,..in, inle
4c00: 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 n) == OPENSSL_NP
4c10: 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a N_NEGOTIATED) {.
4c20: 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 20 ./* Match found
4c30: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c */..res = SSL_TL
4c40: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
4c50: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50 } else {../* OP
4c60: 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 ENSSL_NPN_NO_OVE
4c70: 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61 RLAP = No overla
4c80: 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 20 p, so use first
4c90: 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74 item from client
4ca0: 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a protocol list *
4cb0: 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 /..res = SSL_TLS
4cc0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
4cd0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
4ce0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 atePtr->vcmd ==
4cf0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 (Tcl_Obj*)NULL)
4d00: 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 {..return res;.
4d10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
4d20: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
4d30: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 val */. cmdPt
4d40: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
4d50: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
4d60: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
4d70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4d80: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4d90: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4da0: 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 Obj("alpn", -1))
4db0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
4dc0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
4dd0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
4de0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
4df0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
4e00: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
4e10: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
4e20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4e30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4e40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
4e50: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f 75 NewStringObj(*ou
4e60: 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c t, -1));. Tcl
4e70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4e80: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4e90: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f dPtr, Tcl_NewBoo
4ea0: 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 leanObj(res == S
4eb0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
4ec0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c ));.. /* Eval
4ed0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
4ee0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
4ef0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
4f00: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 );. if ((code
4f10: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 = EvalCallback(
4f20: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
4f30: 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 , cmdPtr)) > 1)
4f40: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
4f50: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
4f60: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f } else if (co
4f70: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 de == 1) {..res
4f80: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 = SSL_TLSEXT_ERR
4f90: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 _OK;. } else
4fa0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
4fb0: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 EXT_ERR_ALERT_FA
4fc0: 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 TAL;. }. T
4fd0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
4fe0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
4ff0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a urn res;.}.../*.
5000: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5040: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 -----. *. * Adve
5050: 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 rtise Protocols
5060: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 Callback for Nex
5070: 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 t Protocol Negot
5080: 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 iation (NPN) in
5090: 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 ServerHello --.
50a0: 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e *. *.called when
50b0: 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e 65 a TLS server ne
50c0: 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73 75 eds a list of su
50d0: 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c pported protocol
50e0: 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 s for Next. *.Pr
50f0: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 otocol Negotiati
5100: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 on.. *. * Result
5110: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
5120: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
5130: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
5140: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s:. *.SSL_TLSEXT
5150: 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f _ERR_OK: NPN pro
5160: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 tocol selected.
5170: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
5180: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c ontinues.. *.SSL
5190: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
51a0: 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 K: NPN protocol
51b0: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54 68 not selected. Th
51c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
51d0: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d tinues.. *. *---
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5220: 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f . */.#ifdef USE_
5230: 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e NPN.static int.N
5240: 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 PNCallback(const
5250: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 SSL *ssl, const
5260: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
5270: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 *out, unsigned i
5280: 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 nt *outlen, void
5290: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
52a0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
52b0: 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 State*)arg;..
52c0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
52d0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c ");.. if (ssl
52e0: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 == NULL || arg
52f0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
5300: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
5310: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a R_NOACK;. }..
5320: 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f /* Set proto
5330: 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 cols list */.
5340: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
5350: 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b rotos != NULL) {
5360: 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 74 ..*out = statePt
5370: 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 r->protos;..*out
5380: 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d 3e len = statePtr->
5390: 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 protos_len;.
53a0: 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d } else {..*out =
53b0: 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 NULL;..*outlen
53c0: 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c = 0;..return SSL
53d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
53e0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 K;. }. ret
53f0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
5400: 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a RR_OK;.}.#endif.
5410: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
5420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
5460: 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f SNI Callback fo
5470: 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a r Servers --. *.
5480: 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65 *.Perform serve
5490: 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e r-side SNI hostn
54a0: 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 ame selection af
54b0: 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e ter receiving SN
54c0: 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 I extension. *.i
54d0: 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 n Client Hello.
54e0: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c Called after hel
54f0: 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 lo callback but
5500: 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c before ALPN call
5510: 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 back.. *. * Resu
5520: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
5530: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
5540: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
5550: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
5560: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
5570: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
5580: 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f T_ERR_OK: SNI ho
5590: 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74 stname is accept
55a0: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
55b0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
55c0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
55d0: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 ALERT_FATAL: SNI
55e0: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 hostname is not
55f0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 accepted. The c
5600: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 onnection. *.
5610: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66 is aborted. Def
5620: 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69 ault for alert i
5630: 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 s SSL_AD_UNRECOG
5640: 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 NIZED_NAME.. *.S
5650: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
5660: 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 ERT_WARNING: SNI
5670: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 hostname is not
5680: 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69 accepted, warni
5690: 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 ng alert. *.
56a0: 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 sent (not suppor
56b0: 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e ted in TLSv1.3).
56c0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
56d0: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
56e0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
56f0: 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 CK: SNI hostname
5700: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 is not accepted
5710: 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c and not acknowl
5720: 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e edged,. *. e.
5730: 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e 6f g. if SNI has no
5740: 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 t been configure
5750: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f d. The connectio
5760: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a n continues.. *.
5770: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
57c0: 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b int.SNICallback
57d0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c (const SSL *ssl,
57e0: 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 int *alert, voi
57f0: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 d *arg) {. St
5800: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
5810: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 (State*)arg;.
5820: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
5830: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
5840: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
5850: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
5860: 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a int code, res;.
5870: 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 char *server
5880: 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 name = NULL;..
5890: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
58a0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 d");.. if (ss
58b0: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 l == NULL || arg
58c0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
58d0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
58e0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
58f0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 . /* Only wor
5900: 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 ks for TLS 1.2 a
5910: 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 nd earlier */.
5920: 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 servername = S
5930: 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d SL_get_servernam
5940: 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 e(ssl, TLSEXT_NA
5950: 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 METYPE_host_name
5960: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72 76 );. if (!serv
5970: 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 ername || server
5980: 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 name[0] == '\0')
5990: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
59a0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
59b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
59c0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
59d0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
59e0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
59f0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
5a00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
5a10: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
5a20: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 val */. cmdPt
5a30: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
5a40: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
5a50: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
5a60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
5a70: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
5a80: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
5a90: 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b Obj("sni", -1));
5aa0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
5ab0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
5ac0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
5ad0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
5ae0: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
5af0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
5b00: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 >self), -1));.
5b10: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
5b20: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
5b30: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
5b40: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 ewStringObj(serv
5b50: 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a ername , -1));..
5b60: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
5b70: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
5b80: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
5b90: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
5ba0: 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 if ((code = Ev
5bb0: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 alCallback(inter
5bc0: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 p, statePtr, cmd
5bd0: 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 Ptr)) > 1) {..re
5be0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
5bf0: 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 RR_ALERT_WARNING
5c00: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f ;..*alert = SSL_
5c10: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f AD_UNRECOGNIZED_
5c20: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 NAME; /* Not sup
5c30: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e ported by TLS 1.
5c40: 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 3 */. } else
5c50: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b if (code == 1) {
5c60: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
5c70: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
5c80: 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 else {..res = S
5c90: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
5ca0: 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 ERT_FATAL;..*ale
5cb0: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 rt = SSL_AD_UNRE
5cc0: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f COGNIZED_NAME; /
5cd0: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 * Not supported
5ce0: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 by TLS 1.3 */.
5cf0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 }. Tcl_Decr
5d00: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
5d10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 ;. return res
5d20: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5d70: 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f *. * ClientHello
5d80: 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 Handshake Callb
5d90: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 ack for Servers
5da0: 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 --. *. *.Used by
5db0: 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 server to exami
5dc0: 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 ne the server na
5dd0: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 me indication (S
5de0: 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a NI) extension. *
5df0: 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 .provided by the
5e00: 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 client in order
5e10: 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 to select an ap
5e20: 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 propriate certif
5e30: 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 icate to. *.pres
5e40: 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 ent, and make ot
5e50: 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f her configuratio
5e60: 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 n adjustments re
5e70: 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 levant to that s
5e80: 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e erver. *.name an
5e90: 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 d its configurat
5ea0: 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 ion. This includ
5eb0: 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 es swapping out
5ec0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 the associated.
5ed0: 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 *.SSL_CTX pointe
5ee0: 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 r, modifying the
5ef0: 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f server's list o
5f00: 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 f permitted TLS
5f10: 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 versions,. *.cha
5f20: 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 nging the server
5f30: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 's cipher list i
5f40: 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 n response to th
5f50: 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 e client's ciphe
5f60: 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09 r list, etc.. *.
5f70: 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e Called before SN
5f80: 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62 I and ALPN callb
5f90: 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 acks.. *. * Resu
5fa0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
5fb0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
5fc0: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
5fd0: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
5fe0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
5ff0: 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e es:. *.SSL_CLIEN
6000: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 T_HELLO_RETRY: s
6010: 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73 uspend the hands
6020: 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61 hake, and the ha
6030: 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e ndshake function
6040: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d will return imm
6050: 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f ediately. *.SSL_
6060: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6070: 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72 OR: failure, ter
6080: 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f minate connectio
6090: 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20 n. Set alert to
60a0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53 error code.. *.S
60b0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
60c0: 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 73 SUCCESS: success
60d0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
6120: 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 atic int.HelloCa
6130: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
6140: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 *ssl, int *aler
6150: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a t, void *arg) {.
6160: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
6170: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
6180: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 g;. Tcl_Inter
6190: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
61a0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
61b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
61c0: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c r;. int code,
61d0: 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 res;. const
61e0: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 char *servername
61f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 ;. const unsi
6200: 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 gned char *p;.
6210: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 size_t len, re
6220: 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70 maining;.. dp
6230: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
6240: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
6250: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c tr->vcmd == (Tcl
6260: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 _Obj*)NULL) {..r
6270: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6280: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a _HELLO_SUCCESS;.
6290: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
62a0: 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 4c sl == (const SSL
62b0: 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d *)NULL || arg =
62c0: 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 20 = (void *)NULL)
62d0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c {..return SSL_CL
62e0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
62f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
6300: 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 Get names */.
6310: 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74 if (!SSL_client
6320: 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28 _hello_get0_ext(
6330: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45 ssl, TLSEXT_TYPE
6340: 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70 _server_name, &p
6350: 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c , &remaining) ||
6360: 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 remaining <= 2)
6370: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
6380: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 _R_SSLV3_ALERT_I
6390: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 LLEGAL_PARAMETER
63a0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
63b0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
63c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
63d0: 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67 Extract the leng
63e0: 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 th of the suppli
63f0: 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 ed list of names
6400: 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28 . */. len = (
6410: 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 *(p++) << 8);.
6420: 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b len += *(p++);
6430: 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 . if (len + 2
6440: 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b != remaining) {
6450: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 ..*alert = SSL_R
6460: 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c _SSLV3_ALERT_ILL
6470: 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a EGAL_PARAMETER;.
6480: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
6490: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
64a0: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e }. remain
64b0: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 ing = len;..
64c0: 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70 /* The list in p
64d0: 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73 ractice only has
64e0: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e a single elemen
64f0: 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f t, so we only co
6500: 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 74 nsider the first
6510: 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 one. */. if
6520: 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20 (remaining == 0
6530: 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58 || *p++ != TLSEX
6540: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f T_NAMETYPE_host_
6550: 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20 name) {..*alert
6560: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c = SSL_R_TLSV1_AL
6570: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 ERT_INTERNAL_ERR
6580: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f OR;..return SSL_
6590: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
65a0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 OR;. }. re
65b0: 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 maining--;..
65c0: 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 /* Now we can fi
65d0: 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 nally pull out t
65e0: 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 69 he byte array wi
65f0: 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f th the actual ho
6600: 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 stname. */. i
6610: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 f (remaining <=
6620: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 2) {..*alert = S
6630: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 SL_R_TLSV1_ALERT
6640: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b _INTERNAL_ERROR;
6650: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
6660: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
6670: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d . }. len =
6680: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a (*(p++) << 8);.
6690: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b len += *(p++
66a0: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b );. if (len +
66b0: 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20 2 > remaining)
66c0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
66d0: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e R_TLSV1_ALERT_IN
66e0: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 TERNAL_ERROR;..r
66f0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6700: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
6710: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e }. remainin
6720: 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72 g = len;. ser
6730: 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 vername = (const
6740: 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20 char *)p;..
6750: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
6760: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 d to eval */.
6770: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
6780: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
6790: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 Ptr->vcmd);.
67a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
67b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
67c0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
67d0: 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f StringObj("hello
67e0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
67f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
6800: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
6810: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
6820: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
6830: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
6840: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
6850: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
6860: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
6870: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
6880: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
6890: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 Obj(servername,
68a0: 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 (int) len));..
68b0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
68c0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
68d0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
68e0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
68f0: 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c if ((code = Eval
6900: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c Callback(interp,
6910: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 statePtr, cmdPt
6920: 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 r)) > 1) {..res
6930: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c = SSL_CLIENT_HEL
6940: 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 6c 65 72 LO_RETRY;..*aler
6950: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f t = SSL_R_TLSV1_
6960: 41 4c 45 52 54 5f 55 53 45 52 5f 43 41 4e 43 45 ALERT_USER_CANCE
6970: 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65 6c 73 65 LLED;. } else
6980: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
6990: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 {..res = SSL_CLI
69a0: 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 ENT_HELLO_SUCCES
69b0: 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a S;. } else {.
69c0: 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e .res = SSL_CLIEN
69d0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 T_HELLO_ERROR;..
69e0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 *alert = SSL_R_T
69f0: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 LSV1_ALERT_INTER
6a00: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d NAL_ERROR;. }
6a10: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
6a20: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
6a30: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d return res;.}
6a40: 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
6a50: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d ********/./* Com
6a60: 6d 61 6e 64 73 20 20 20 20 20 20 20 20 20 2a 2f mands */
6a70: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
6a80: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d ******/../*. *--
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ad0: 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f -. *. * CiphersO
6ae0: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 bjCmd -- list av
6af0: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a ailable ciphers.
6b00: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
6b10: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
6b20: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
6b30: 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f tls::ciphers" co
6b40: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 mmand. *.to list
6b50: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 available ciphe
6b60: 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 rs, based upon p
6b70: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
6b80: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
6b90: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
6ba0: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a cl result list..
6bb0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
6bc0: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 ts:. *.construct
6bd0: 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 s and destroys S
6be0: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 SL context (CTX)
6bf0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
6c40: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
6c50: 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b *protocols[] = {
6c60: 0a 09 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 .."ssl2", "ssl3"
6c70: 2c 20 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e , "tls1", "tls1.
6c80: 31 22 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 1", "tls1.2", "t
6c90: 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a ls1.3", NULL.};.
6ca0: 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a enum protocol {.
6cb0: 20 20 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c TLS_SSL2, TL
6cc0: 53 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 S_SSL3, TLS_TLS1
6cd0: 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c , TLS_TLS1_1, TL
6ce0: 53 5f 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c S_TLS1_2, TLS_TL
6cf0: 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d S1_3, TLS_NONE.}
6d00: 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 69 ;..static int.Ci
6d10: 70 68 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 phersObjCmd(Clie
6d20: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
6d30: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
6d40: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
6d50: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
6d60: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
6d70: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 l_Obj *objPtr =
6d80: 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 NULL;. SSL_CT
6d90: 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 X *ctx = NULL;.
6da0: 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 SSL *ssl = NU
6db0: 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 LL;. STACK_OF
6dc0: 28 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b (SSL_CIPHER) *sk
6dd0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 ;. char *cp,
6de0: 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 buf[BUFSIZ];.
6df0: 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 int index, verb
6e00: 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 ose = 0, use_sup
6e10: 70 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 ported = 0;.
6e20: 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 const SSL_METHOD
6e30: 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 *method;.. d
6e40: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
6e50: 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 ;.. if ((objc
6e60: 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e < 2) || (objc >
6e70: 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 4)) {..Tcl_Wron
6e80: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
6e90: 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 1, objv, "proto
6ea0: 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 col ?verbose? ?s
6eb0: 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 upported?");..re
6ec0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6ed0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 }. if (Tc
6ee0: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 l_GetIndexFromOb
6ef0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 j(interp, objv[1
6f00: 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 ], protocols, "p
6f10: 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e rotocol", 0, &in
6f20: 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 dex) != TCL_OK)
6f30: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
6f40: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
6f50: 66 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 f ((objc > 2) &&
6f60: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 Tcl_GetBooleanF
6f70: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
6f80: 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 bjv[2], &verbose
6f90: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
6fa0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
6fb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
6fc0: 28 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 (objc > 3) && Tc
6fd0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d l_GetBooleanFrom
6fe0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
6ff0: 5b 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 [3], &use_suppor
7000: 74 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ted) != TCL_OK)
7010: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
7020: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
7030: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
7040: 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 );.. switch (
7050: 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 (enum protocol)i
7060: 6e 64 65 78 29 20 7b 0a 09 63 61 73 65 20 54 4c ndex) {..case TL
7070: 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e S_SSL2:.#if OPEN
7080: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
7090: 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 ER >= 0x10100000
70a0: 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f L || defined(NO_
70b0: 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL2) || defined
70c0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
70d0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
70e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
70f0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
7100: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
7110: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
7120: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
7130: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
7140: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 e.. method =
7150: 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 SSLv2_method();
7160: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
7170: 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 ase TLS_SSL3:.#i
7180: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c f defined(NO_SSL
7190: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
71a0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c ENSSL_NO_SSL3) |
71b0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
71c0: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 L_NO_SSL3_METHOD
71d0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
71e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
71f0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
7200: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
7210: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
7220: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
7230: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
7240: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 e.. method =
7250: 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 SSLv3_method();
7260: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
7270: 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 ase TLS_TLS1:.#i
7280: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
7290: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
72a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c ENSSL_NO_TLS1) |
72b0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
72c0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 L_NO_TLS1_METHOD
72d0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
72e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
72f0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
7300: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
7310: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
7320: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
7330: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
7340: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 e.. method =
7350: 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 20 TLSv1_method();
7360: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
7370: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a ase TLS_TLS1_1:.
7380: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
7390: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_1) || define
73a0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
73b0: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_1) || defined(
73c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
73d0: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 1_METHOD).. T
73e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
73f0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
7400: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
7410: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
7420: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
7430: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7440: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
7450: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f ethod = TLSv1_1_
7460: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b method(); break;
7470: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
7480: 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 S_TLS1_2:.#if de
7490: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
74a0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
74b0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c SSL_NO_TLS1_2) |
74c0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
74d0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 L_NO_TLS1_2_METH
74e0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 OD).. Tcl_App
74f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
7500: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
7510: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
7520: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
7530: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
7540: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
7550: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 lse.. method
7560: 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 = TLSv1_2_method
7570: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 (); break;.#endi
7580: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
7590: 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _3:.#if defined(
75a0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
75b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
75c0: 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 63 _TLS1_3).. Tc
75d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
75e0: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
75f0: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
7600: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
7610: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
7620: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
7630: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 R;.#else.. me
7640: 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f thod = TLS_metho
7650: 64 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 d();.. SSL_CT
7660: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f X_set_min_proto_
7670: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 version(ctx, TLS
7680: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 1_3_VERSION);..
7690: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d SSL_CTX_set_m
76a0: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e ax_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 62 72 65 61 SION);.. brea
76d0: 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75 k;.#endif..defau
76e0: 6c 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 lt:.. method
76f0: 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a = TLS_method();.
7700: 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 . break;.
7710: 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c }.. ctx = SSL
7720: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 _CTX_new(method)
7730: 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d ;. if (ctx ==
7740: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
7750: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
7760: 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c p, REASON(), NUL
7770: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
7780: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
7790: 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 ssl = SSL_new(
77a0: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 ctx);. if (ss
77b0: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 l == NULL) {..Tc
77c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
77d0: 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c nterp, REASON(),
77e0: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
77f0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
7800: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
7810: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 }.. /* Use
7820: 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 list and order
7830: 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 as would be sent
7840: 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c in a ClientHell
7850: 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 o or all availab
7860: 6c 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 le ciphers */.
7870: 20 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 if (use_suppor
7880: 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c ted) {..sk = SSL
7890: 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f _get1_supported_
78a0: 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 ciphers(ssl);.
78b0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d } else {..sk =
78c0: 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 SSL_get_ciphers
78d0: 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 (ssl);. }..
78e0: 20 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c if (sk != NULL
78f0: 29 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 ) {..if (!verbos
7900: 65 29 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 e) {.. objPtr
7910: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
7920: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 j(0, NULL);..
7930: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b for (int i = 0;
7940: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 i < sk_SSL_CIPH
7950: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 ER_num(sk); i++)
7960: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 {...const SSL_C
7970: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 IPHER *c = sk_SS
7980: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 L_CIPHER_value(s
7990: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d k, i);...if (c =
79a0: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 = NULL) continue
79b0: 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e ;..../* cipher n
79c0: 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f ame or (NONE) */
79d0: 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 ...cp = SSL_CIPH
79e0: 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a ER_get_name(c);.
79f0: 09 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c ..if (cp == NULL
7a00: 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c ) break;...Tcl_L
7a10: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
7a20: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
7a30: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
7a40: 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 gObj(cp, -1));..
7a50: 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b }...} else {
7a60: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
7a70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
7a80: 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 "",0);.. for
7a90: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 (int i = 0; i <
7aa0: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 sk_SSL_CIPHER_nu
7ab0: 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 m(sk); i++) {...
7ac0: 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 const SSL_CIPHER
7ad0: 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 *c = sk_SSL_CIP
7ae0: 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 HER_value(sk, i)
7af0: 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c ;...if (c == NUL
7b00: 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 L) continue;....
7b10: 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 /* textual descr
7b20: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 iption of the ci
7b30: 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 pher */...if (SS
7b40: 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 L_CIPHER_descrip
7b50: 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a tion(c, buf, siz
7b60: 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c eof(buf)) != NUL
7b70: 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 L) {... Tcl_A
7b80: 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 ppendToObj(objPt
7b90: 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a r, buf, (Tcl_Siz
7ba0: 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b e) strlen(buf));
7bb0: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 ...} else {...
7bc0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 Tcl_AppendToOb
7bd0: 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f j(objPtr, "UNKNO
7be0: 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 WN\n", 8);...}..
7bf0: 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 }..}..if (us
7c00: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 e_supported) {..
7c10: 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 sk_SSL_CIPHE
7c20: 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 R_free(sk);..}.
7c30: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 }. SSL_fre
7c40: 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f e(ssl);. SSL_
7c50: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a CTX_free(ctx);..
7c60: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
7c70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
7c80: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
7c90: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
7ca0: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
7cb0: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7d00: 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f *. * ProtocolsO
7d10: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 bjCmd -- list av
7d20: 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c ailable protocol
7d30: 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f s. *. *.This pro
7d40: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
7d50: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 d to process the
7d60: 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 "tls::protocols
7d70: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 " command. *.to
7d80: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 list available p
7d90: 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 rotocols.. *. *
7da0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
7db0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
7dc0: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 t list.. *. * Si
7dd0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
7de0: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
7df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
7e30: 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 .static int.Prot
7e40: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65 ocolsObjCmd(Clie
7e50: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
7e60: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
7e70: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
7e80: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
7e90: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
7ea0: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a l_Obj *objPtr;..
7eb0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
7ec0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
7ed0: 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 objc != 1) {..Tc
7ee0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
7ef0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
7f00: 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c "");..return TCL
7f10: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
7f20: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 ERR_clear_err
7f30: 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 or();.. objPt
7f40: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
7f50: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 bj(0, NULL);..#i
7f60: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
7f70: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
7f80: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 00000L && !defin
7f90: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 ed(NO_SSL2) && !
7fa0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7fb0: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c NO_SSL2). Tcl
7fc0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
7fd0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
7fe0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
7ff0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
8000: 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 [TLS_SSL2], -1))
8010: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
8020: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
8030: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
8040: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 SL_NO_SSL3) && !
8050: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8060: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a NO_SSL3_METHOD).
8070: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
8080: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
8090: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
80a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
80b0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 otocols[TLS_SSL3
80c0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
80d0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
80e0: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 TLS1) && !define
80f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
8100: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
8110: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d PENSSL_NO_TLS1_M
8120: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c ETHOD). Tcl_L
8130: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
8140: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
8150: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
8160: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
8170: 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a LS_TLS1], -1));.
8180: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
8190: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 ned(NO_TLS1_1) &
81a0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
81b0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 SL_NO_TLS1_1) &&
81c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
81d0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 L_NO_TLS1_1_METH
81e0: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 OD). Tcl_List
81f0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
8200: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
8210: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
8220: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
8230: 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 TLS1_1], -1));.#
8240: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
8250: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 ed(NO_TLS1_2) &&
8260: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
8270: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 L_NO_TLS1_2) &&
8280: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
8290: 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f _NO_TLS1_2_METHO
82a0: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f D). Tcl_ListO
82b0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
82c0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
82d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
82e0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 (protocols[TLS_T
82f0: 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 LS1_2], -1));.#e
8300: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
8310: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 d(NO_TLS1_3) &&
8320: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
8330: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
8340: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
8350: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
8360: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
8370: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 StringObj(protoc
8380: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c ols[TLS_TLS1_3],
8390: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 -1));.#endif..
83a0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
83b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
83c0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
83d0: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 TCL_OK;..clientD
83e0: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
83f0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
8400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
8440: 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 *. * HandshakeOb
8450: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
8460: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 is command is us
8470: 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 ed to verify whe
8480: 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 ther the handsha
8490: 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 ke is complete.
84a0: 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 *.or not.. *. *
84b0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
84c0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
84d0: 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 t. 1 means hands
84e0: 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 hake complete, 0
84f0: 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a means pending..
8500: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
8510: 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 ts:. *.May force
8520: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e SSL negotiation
8530: 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a to take place..
8540: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
8550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8580: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
8590: 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b tic int Handshak
85a0: 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 eObjCmd(ClientDa
85b0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
85c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
85d0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
85e0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
85f0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
8600: 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 annel chan;
8610: 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 /* The channe
8620: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
8630: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 on. */. State
8640: 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 *statePtr;
8650: 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 /* client sta
8660: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 te for ssl socke
8670: 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 t */. const c
8680: 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 har *errStr = NU
8690: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 LL;. int ret
86a0: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 = 1;. int err
86b0: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e = 0;.. dprin
86c0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
86d0: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 if (objc != 2
86e0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
86f0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
8700: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 objv, "channel"
8710: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 );..return(TCL_E
8720: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 RROR);. }..
8730: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
8740: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d r();.. chan =
8750: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
8760: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
8770: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
8780: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c v[1], NULL), NUL
8790: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
87a0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
87b0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
87c0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
87d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
87e0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
87f0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
8800: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
8810: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
8820: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
8830: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
8840: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
8850: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
8860: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
8870: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
8880: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
8890: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
88a0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 elName(chan),..
88b0: 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c "\": not a TL
88c0: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c S channel", NULL
88d0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
88e0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
88f0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c S", "HANDSHAKE",
8900: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
8910: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
8920: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 NULL);..return(T
8930: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
8940: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 . statePtr =
8950: 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 (State *)Tcl_Get
8960: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
8970: 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 ata(chan);..
8980: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 dprintf("Calling
8990: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e Tls_WaitForConn
89a0: 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d ect");. ret =
89b0: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e Tls_WaitForConn
89c0: 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 ect(statePtr, &e
89d0: 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 rr, 1);. dpri
89e0: 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 ntf("Tls_WaitFor
89f0: 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 Connect returned
8a00: 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 : %i", ret);..
8a10: 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 if (ret < 0 &&
8a20: 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 ((statePtr->fla
8a30: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 gs & TLS_TCL_ASY
8a40: 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 NC) && (err == E
8a50: 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 AGAIN))) {..dpri
8a60: 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 ntf("Async set a
8a70: 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 nd err = EAGAIN"
8a80: 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 );..ret = 0;.
8a90: 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 } else if (ret
8aa0: 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 < 0) {..long res
8ab0: 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 ult;..errStr = s
8ac0: 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 tatePtr->err;..T
8ad0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 cl_ResetResult(i
8ae0: 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 nterp);..Tcl_Set
8af0: 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 Errno(err);...if
8b00: 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 (!errStr || (*e
8b10: 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 rrStr == 0)) {..
8b20: 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c errStr = Tcl
8b30: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 _PosixError(inte
8b40: 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 rp);..}...Tcl_Ap
8b50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
8b60: 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 p, "handshake fa
8b70: 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c iled: ", errStr,
8b80: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
8b90: 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20 ..if ((result =
8ba0: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 SSL_get_verify_r
8bb0: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e esult(statePtr->
8bc0: 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f ssl)) != X509_V_
8bd0: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 OK) {.. Tcl_A
8be0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
8bf0: 72 70 2c 20 22 20 64 75 65 20 74 6f 3a 20 22 2c rp, " due to: ",
8c00: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 X509_verify_cer
8c10: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72 t_error_string(r
8c20: 65 73 75 6c 74 29 2c 20 28 63 68 61 72 20 2a 29 esult), (char *)
8c30: 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f NULL);..}..Tcl_
8c40: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
8c50: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e erp, "TLS", "HAN
8c60: 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45 44 DSHAKE", "FAILED
8c70: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
8c80: 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74 );..dprintf("Ret
8c90: 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 urning TCL_ERROR
8ca0: 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 20 with handshake
8cb0: 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 failed: %s", err
8cc0: 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 Str);..return(TC
8cd0: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 20 L_ERROR);. }
8ce0: 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20 else {..if (err
8cf0: 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 != 0) {.. dpr
8d00: 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 intf("Got an err
8d10: 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 or with a comple
8d20: 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 ted handshake: e
8d30: 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a rr = %i", err);.
8d40: 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 .}..ret = 1;.
8d50: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 }.. dprintf(
8d60: 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f "Returning TCL_O
8d70: 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 25 69 K with data \"%i
8d80: 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 \"", ret);. T
8d90: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
8da0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 interp, Tcl_NewI
8db0: 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 ntObj(ret));.
8dc0: 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b return(TCL_OK);
8dd0: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
8de0: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a lientData;.}../*
8df0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e30: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 ------. *. * Imp
8e40: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a ortObjCmd --. *.
8e50: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
8e60: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
8e70: 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c process the "ssl
8e80: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 " command. *. *.
8e90: 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 The ssl command
8ea0: 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20 pushes SSL over
8eb0: 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 a (newly connect
8ec0: 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 ed) tcp socket.
8ed0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
8ee0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
8ef0: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
8f00: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d de effects:. *.M
8f10: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 ay modify the be
8f20: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 havior of an IO
8f30: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d channel.. *. *--
8f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f80: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
8f90: 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c .ImportObjCmd(Cl
8fa0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
8fb0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
8fc0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
8fd0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
8fe0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
8ff0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
9000: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
9010: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
9020: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 on. */. State
9030: 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 *statePtr;../*
9040: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 client state for
9050: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 ssl socket */.
9060: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 SSL_CTX *ctx.
9070: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
9080: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 Tcl_Obj *scr
9090: 69 70 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ipt. = NU
90a0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 LL;. Tcl_Obj
90b0: 2a 70 61 73 73 77 6f 72 64 09 20 20 20 20 20 20 *password.
90c0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 = NULL;. Tc
90d0: 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 20 20 20 20 l_Obj *vcmd.
90e0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
90f0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 Tcl_DString uppe
9100: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
9110: 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ion, upperChanne
9120: 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 lBlocking, upper
9130: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c ChannelEncoding,
9140: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 upperChannelEOF
9150: 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 Char;. int id
9160: 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 x, len;. int
9170: 66 6c 61 67 73 09 09 20 20 20 20 20 20 20 20 3d flags.. =
9180: 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 TLS_TCL_INIT;.
9190: 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 20 int server..
91a0: 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69 = 0;./* i
91b0: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 s connection inc
91c0: 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e oming or outgoin
91d0: 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a g? */. char *
91e0: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 keyfile.
91f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
9200: 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20 20 20 *certfile.
9210: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 = NULL;. u
9220: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 nsigned char *ke
9230: 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 y .= NULL;.
9240: 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20 20 20 int key_len
9250: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b = 0;
9260: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
9270: 61 72 20 2a 63 65 72 74 20 20 20 20 20 20 20 20 ar *cert
9280: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 = NULL;. int
9290: 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 20 cert_len
92a0: 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 = 0;.
92b0: 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 09 char *ciphers.
92c0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
92d0: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 char *cipher
92e0: 73 75 69 74 65 73 09 20 20 20 20 20 20 20 20 3d suites. =
92f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
9300: 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 *CAfile.
9310: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
9320: 20 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 20 *CAdir..
9330: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
9340: 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 20 r *DHparams.
9350: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
9360: 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 char *model..
9370: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
9380: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
9390: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
93a0: 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f ;./* hostname fo
93b0: 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e r Server Name In
93c0: 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 dication */.
93d0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
93e0: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20 har *session_id
93f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
9400: 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c Obj *alpn..= NUL
9410: 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 L;. int ssl2
9420: 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 = 0, ssl3 = 0;.
9430: 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c int tls1 = 1,
9440: 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 tls1_1 = 1, tls
9450: 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 1_2 = 1, tls1_3
9460: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f = 1;. int pro
9470: 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 to = 0, level =
9480: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 -1;. int veri
9490: 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 fy = 0, require
94a0: 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 = 0, request = 1
94b0: 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 , post_handshake
94c0: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e = 0;.. dprin
94d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 tf("Called");..#
94e0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
94f0: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f S1) || defined(O
9500: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a PENSSL_NO_TLS1).
9510: 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 tls1 = 0;.#e
9520: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
9530: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 (NO_TLS1_1) || d
9540: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
9550: 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c O_TLS1_1). tl
9560: 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 s1_1 = 0;.#endif
9570: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
9580: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e TLS1_2) || defin
9590: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
95a0: 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 S1_2). tls1_2
95b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
95c0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
95d0: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _3) || defined(O
95e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
95f0: 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 ). tls1_3 = 0
9600: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 ;.#endif.. if
9610: 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 (objc < 2) {..T
9620: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
9630: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
9640: 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f "channel ?optio
9650: 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 ns?");..return T
9660: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
9670: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
9680: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 rror();.. cha
9690: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
96a0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
96b0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
96c0: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 objv[1], NULL),
96d0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
96e0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
96f0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
9700: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9710: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
9720: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
9730: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
9740: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
9750: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
9760: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
9770: 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d .. for (idx =
9780: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 2; idx < objc;
9790: 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a idx++) {..char *
97a0: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 opt = Tcl_GetStr
97b0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
97c0: 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 idx], NULL);...i
97d0: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 f (opt[0] != '-'
97e0: 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ).. break;...
97f0: 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 OPTOBJ("-alpn",
9800: 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 alpn);..OPTSTR("
9810: 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 29 3b -cadir", CAdir);
9820: 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c ..OPTSTR("-cafil
9830: 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 e", CAfile);..OP
9840: 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 TBYTE("-cert", c
9850: 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a ert, cert_len);.
9860: 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 69 .OPTSTR("-certfi
9870: 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a le", certfile);.
9880: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 .OPTSTR("-cipher
9890: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 ", ciphers);..OP
98a0: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c TSTR("-ciphers",
98b0: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 ciphers);..OPTS
98c0: 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 65 TR("-ciphersuite
98d0: 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 s", ciphersuites
98e0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d );..OPTOBJ("-com
98f0: 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a mand", script);.
9900: 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 61 .OPTSTR("-dhpara
9910: 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a ms", DHparams);.
9920: 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c .OPTBYTE("-key",
9930: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a key, key_len);.
9940: 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c .OPTSTR("-keyfil
9950: 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f e", keyfile);..O
9960: 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 PTSTR("-model",
9970: 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 model);..OPTOBJ(
9980: 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73 "-password", pas
9990: 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c sword);..OPTBOOL
99a0: 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b ("-post_handshak
99b0: 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 e", post_handsha
99c0: 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d ke);..OPTBOOL("-
99d0: 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 73 request", reques
99e0: 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 t);..OPTBOOL("-r
99f0: 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 equire", require
9a00: 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 );..OPTINT("-sec
9a10: 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 6c 65 76 uritylevel", lev
9a20: 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d el);..OPTBOOL("-
9a30: 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 72 29 server", server)
9a40: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76 ;..OPTSTR("-serv
9a50: 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e ername", servern
9a60: 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ame);..OPTSTR("-
9a70: 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 session_id", ses
9a80: 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f sion_id);..OPTBO
9a90: 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 OL("-ssl2", ssl2
9aa0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 );..OPTBOOL("-ss
9ab0: 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 l3", ssl3);..OPT
9ac0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c BOOL("-tls1", tl
9ad0: 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d s1);..OPTBOOL("-
9ae0: 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 tls1.1", tls1_1)
9af0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
9b00: 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 1.2", tls1_2);..
9b10: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 OPTBOOL("-tls1.3
9b20: 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 ", tls1_3);..OPT
9b30: 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 6f OBJ("-validateco
9b40: 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 mmand", vcmd);..
9b50: 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 OPTOBJ("-vcmd",
9b60: 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 vcmd);...OPTBAD(
9b70: 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e "option", "-alpn
9b80: 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c , -cadir, -cafil
9b90: 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 e, -cert, -certf
9ba0: 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 ile, -cipher, -c
9bb0: 69 70 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f iphersuites, -co
9bc0: 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 mmand, -dhparams
9bd0: 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 , -key, -keyfile
9be0: 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 , -model, -passw
9bf0: 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 ord, -post_hands
9c00: 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 hake, -request,
9c10: 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72 -require, -secur
9c20: 69 74 79 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 itylevel, -serve
9c30: 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 r, -servername,
9c40: 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 -session_id, -ss
9c50: 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 l2, -ssl3, -tls1
9c60: 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 , -tls1.1, -tls1
9c70: 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 .2, -tls1.3, or
9c80: 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 -validatecommand
9c90: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c ");...return TCL
9ca0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
9cb0: 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09 09 if (request)..
9cc0: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 verify |= SSL_VE
9cd0: 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 RIFY_CLIENT_ONCE
9ce0: 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 | SSL_VERIFY_PE
9cf0: 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 ER;. if (requ
9d00: 65 73 74 20 26 26 20 72 65 71 75 69 72 65 29 09 est && require).
9d10: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 verify |= SSL_VE
9d20: 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f RIFY_FAIL_IF_NO_
9d30: 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 PEER_CERT;. i
9d40: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f f (request && po
9d50: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 st_handshake).ve
9d60: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 rify |= SSL_VERI
9d70: 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b FY_POST_HANDSHAK
9d80: 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 E;. if (verif
9d90: 79 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20 y == 0)..verify
9da0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e = SSL_VERIFY_NON
9db0: 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d E;.. proto |=
9dc0: 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f (ssl2 ? TLS_PRO
9dd0: 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 TO_SSL2 : 0);.
9de0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 proto |= (ssl3
9df0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c ? TLS_PROTO_SSL
9e00: 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 3 : 0);. prot
9e10: 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 o |= (tls1 ? TLS
9e20: 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 _PROTO_TLS1 : 0)
9e30: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
9e40: 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f tls1_1 ? TLS_PRO
9e50: 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a TO_TLS1_1 : 0);.
9e60: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
9e70: 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f s1_2 ? TLS_PROTO
9e80: 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 _TLS1_2 : 0);.
9e90: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
9ea0: 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _3 ? TLS_PROTO_T
9eb0: 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 LS1_3 : 0);..
9ec0: 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c /* reset to NUL
9ed0: 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e L if blank strin
9ee0: 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 g provided */.
9ef0: 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a if (cert && !*
9f00: 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63 cert).. c
9f10: 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ert. = NU
9f20: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 LL;. if (key
9f30: 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 && !*key)..
9f40: 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d key. =
9f50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
9f60: 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 ertfile && !*cer
9f70: 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 tfile) c
9f80: 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a ertfile.= NULL;.
9f90: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 if (keyfile
9fa0: 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b && !*keyfile)..k
9fb0: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d eyfile. =
9fc0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
9fd0: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 iphers && !*ciph
9fe0: 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70 ers). cip
9ff0: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e hers. = N
a000: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 ULL;. if (cip
a010: 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 hersuites && !*c
a020: 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70 iphersuites) cip
a030: 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e hersuites = N
a040: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 ULL;. if (CAf
a050: 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 ile && !*CAfile)
a060: 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 . CAfile.
a070: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a080: 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26 if (CAdir &&
a090: 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 20 !*CAdir).
a0a0: 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20 20 CAdir.
a0b0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
a0c0: 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 DHparams && !*DH
a0d0: 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 params).
a0e0: 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 DHparams
a0f0: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 = NULL;.. /*
a100: 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f new SSL state */
a110: 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d . statePtr..=
a120: 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c (State *) ckall
a130: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 oc((unsigned) si
a140: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 zeof(State));.
a150: 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 memset(statePt
a160: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 r, 0, sizeof(Sta
a170: 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 te));.. state
a180: 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 Ptr->flags.= fla
a190: 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 gs;. statePtr
a1a0: 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 ->interp.= inter
a1b0: 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d p;. statePtr-
a1c0: 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 >vflags.= verify
a1d0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
a1e0: 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f err.= "";.. /
a1f0: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 * allocate scrip
a200: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 t */. if (scr
a210: 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 ipt) {..(void) T
a220: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
a230: 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e Obj(script, &len
a240: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
a250: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 statePtr->ca
a260: 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b llback = script;
a270: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
a280: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
a290: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 >callback);..}.
a2a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
a2b0: 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a ocate password *
a2c0: 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f /. if (passwo
a2d0: 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 rd) {..(void) Tc
a2e0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
a2f0: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 bj(password, &le
a300: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
a310: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 . statePtr->p
a320: 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f assword = passwo
a330: 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 rd;.. Tcl_Inc
a340: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
a350: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 tr->password);..
a360: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
a370: 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 allocate validat
a380: 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 e command */.
a390: 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 if (vcmd) {..(v
a3a0: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 oid) Tcl_GetStri
a3b0: 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 ngFromObj(vcmd,
a3c0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 &len);..if (len)
a3d0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 {.. statePtr
a3e0: 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 ->vcmd = vcmd;..
a3f0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
a400: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 ount(statePtr->v
a410: 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a cmd);..}. }..
a420: 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d if (model !=
a430: 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f NULL) {..int mo
a440: 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 de;../* Get the
a450: 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 "model" context
a460: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 */..chan = Tcl_G
a470: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
a480: 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b , model, &mode);
a490: 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 ..if (chan == (T
a4a0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
a4b0: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 ) {.. Tls_Fre
a4c0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
a4d0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
a4e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
a4f0: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 ../*.. * Make su
a500: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
a510: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
a520: 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 nnel.. */..chan
a530: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
a540: 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 nel(chan);..if (
a550: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
a560: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
a570: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
a580: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
a590: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
a5a0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
a5b0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
a5c0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
a5d0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
a5e0: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 nel", NULL);..
a5f0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
a600: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
a610: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 , "IMPORT", "CHA
a620: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
a630: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
a640: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
a650: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
a660: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
a670: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 TCL_ERROR;..}..c
a680: 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 tx = ((State *)T
a690: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
a6a0: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 tanceData(chan))
a6b0: 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 ->ctx;. } els
a6c0: 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 e {..if ((ctx =
a6d0: 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 CTX_Init(statePt
a6e0: 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f r, server, proto
a6f0: 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66 , keyfile, certf
a700: 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 ile, key, cert,
a710: 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 63 65 key_len,.. ce
a720: 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43 rt_len, CAdir, C
a730: 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 Afile, ciphers,
a740: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 ciphersuites, le
a750: 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 vel, DHparams))
a760: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 == NULL) {..
a770: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
a780: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
a790: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
a7a0: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
a7b0: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 statePtr->ctx
a7c0: 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 = ctx;.. /*.
a7d0: 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f * We need to
a7e0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 make sure that
a7f0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b the channel work
a800: 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 s in binary (for
a810: 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 the. * encr
a820: 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 yption not to ge
a830: 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 t goofed up)..
a840: 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e * We only wan
a850: 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 t to adjust the
a860: 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 buffering in pre
a870: 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 -v2 channels, wh
a880: 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 ere. * each
a890: 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 channel in the s
a8a0: 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 tack maintained
a8b0: 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e its own buffers.
a8c0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c . */. Tcl
a8d0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
a8e0: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
a8f0: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f ation);. Tcl_
a900: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
a910: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
a920: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 g);. Tcl_DStr
a930: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
a940: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 annelEOFChar);.
a950: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
a960: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
a970: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 Encoding);. T
a980: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
a990: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
a9a0: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 , "-eofchar", &u
a9b0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
a9c0: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ar);. Tcl_Get
a9d0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
a9e0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e terp, chan, "-en
a9f0: 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 coding", &upperC
aa00: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b hannelEncoding);
aa10: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
aa20: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
aa30: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c , chan, "-transl
aa40: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 ation", &upperCh
aa50: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
aa60: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
aa70: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
aa80: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 rp, chan, "-bloc
aa90: 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 king", &upperCha
aaa0: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 nnelBlocking);.
aab0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
aac0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
aad0: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 chan, "-translat
aae0: 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b ion", "binary");
aaf0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
ab00: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
ab10: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 , chan, "-blocki
ab20: 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 ng", "true");.
ab30: 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 dprintf("Consu
ab40: 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c ming Tcl channel
ab50: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 %s", Tcl_GetCha
ab60: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b nnelName(chan));
ab70: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 . statePtr->s
ab80: 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 elf = Tcl_StackC
ab90: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
aba0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
abb0: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 , (ClientData) s
abc0: 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52 45 tatePtr, (TCL_RE
abd0: 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 ADABLE | TCL_WRI
abe0: 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 TABLE), chan);.
abf0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 61 dprintf("Crea
ac00: 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 ted channel name
ac10: 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 d %s", Tcl_GetCh
ac20: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
ac30: 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 tr->self));.
ac40: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 if (statePtr->se
ac50: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e lf == (Tcl_Chann
ac60: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a el) NULL) {../*.
ac70: 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 . * No use of Tc
ac80: 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 l_EventuallyFree
ac90: 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 because no poss
aca0: 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76 ible Tcl_Preserv
acb0: 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 e... */..Tls_Fre
acc0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
acd0: 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 Ptr);..return TC
ace0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
acf0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
ad00: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
ad10: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
ad20: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c "-translation",
ad30: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 Tcl_DStringValu
ad40: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 e(&upperChannelT
ad50: 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 ranslation));.
ad60: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
ad70: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 Option(interp, s
ad80: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 tatePtr->self, "
ad90: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f -encoding", Tcl_
ada0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
adb0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
adc0: 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ng));. Tcl_Se
add0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
ade0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
adf0: 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 >self, "-eofchar
ae00: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 ", Tcl_DStringVa
ae10: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 lue(&upperChanne
ae20: 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20 lEOFChar));.
ae30: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
ae40: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
ae50: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 tePtr->self, "-b
ae60: 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 locking", Tcl_DS
ae70: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 tringValue(&uppe
ae80: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
ae90: 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 ));.. /*.
aea0: 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a * SSL Initializ
aeb0: 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 ation. */.
aec0: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 statePtr->ssl
aed0: 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 = SSL_new(stateP
aee0: 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 tr->ctx);. if
aef0: 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c (!statePtr->ssl
af00: 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 ) {../* SSL libr
af10: 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 ary error */..Tc
af20: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
af30: 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 nterp, "couldn't
af40: 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 construct ssl s
af50: 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f ession: ", REASO
af60: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
af70: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
af80: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
af90: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
afa0: 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 T", "INIT", "FAI
afb0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
afc0: 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 ULL);..Tls_Free(
afd0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
afe0: 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f r);..return TCL_
aff0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
b000: 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65 /* Set host se
b010: 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 rver name */.
b020: 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29 if (servername)
b030: 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 20 {../* Sets the
b040: 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 server name indi
b050: 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 cation (SNI) in
b060: 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 ClientHello exte
b070: 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 nsion */../* Per
b080: 20 52 46 43 20 36 30 36 36 2c 20 68 6f 73 74 6e RFC 6066, hostn
b090: 61 6d 65 20 69 73 20 61 20 41 53 43 49 49 20 65 ame is a ASCII e
b0a0: 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 74 ncoded string, t
b0b0: 68 6f 75 67 68 20 52 46 43 20 34 33 36 36 20 73 hough RFC 4366 s
b0c0: 61 79 73 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 ays UTF-8. */..i
b0d0: 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 f (!SSL_set_tlse
b0e0: 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 xt_host_name(sta
b0f0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 tePtr->ssl, serv
b100: 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 ername) && requi
b110: 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 re) {.. Tcl_A
b120: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
b130: 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c 53 rp, "setting TLS
b140: 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 6e host name exten
b150: 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 63 sion failed", (c
b160: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
b170: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
b180: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
b190: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e ", "IMPORT", "SN
b1a0: 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 I", "FAILED", (c
b1b0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
b1c0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
b1d0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
b1e0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
b1f0: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 ERROR;..}.../* S
b200: 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 et hostname for
b210: 70 65 65 72 20 63 65 72 74 69 66 69 63 61 74 65 peer certificate
b220: 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 69 hostname verifi
b230: 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 cation in client
b240: 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 65 s... Don't use
b250: 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 SSL_set1_host s
b260: 69 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d 69 ince it has limi
b270: 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 tations. */..if
b280: 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 (!SSL_add1_host(
b290: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 statePtr->ssl, s
b2a0: 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 ervername)) {..
b2b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
b2c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74 ult(interp, "set
b2d0: 74 69 6e 67 20 44 4e 53 20 68 6f 73 74 20 6e 61 ting DNS host na
b2e0: 6d 65 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 me failed", (cha
b2f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
b300: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 Tcl_SetErrorCod
b310: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
b320: 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 "IMPORT", "HOST
b330: 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c NAME", "FAILED",
b340: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b350: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
b360: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
b370: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
b380: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 CL_ERROR;..}.
b390: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d }.. /* Resum
b3a0: 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a e session id */.
b3b0: 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f if (session_
b3c0: 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 id && strlen(ses
b3d0: 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f sion_id) <= SSL_
b3e0: 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 MAX_SID_CTX_LENG
b3f0: 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 TH) {../* SSL_se
b400: 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 t_session() */..
b410: 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e if (!SSL_SESSION
b420: 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 _set1_id_context
b430: 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e (SSL_get_session
b440: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c (statePtr->ssl),
b450: 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e session_id, (un
b460: 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c signed int) strl
b470: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 en(session_id)))
b480: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
b490: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
b4a0: 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e "Resume session
b4b0: 20 69 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69 id ", session_i
b4c0: 64 2c 20 22 20 66 61 69 6c 65 64 22 2c 20 28 63 d, " failed", (c
b4d0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
b4e0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
b4f0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
b500: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 ", "IMPORT", "SE
b510: 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 SSION", "FAILED"
b520: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b530: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
b540: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
b550: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
b560: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
b570: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 }.. /* Enab
b580: 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c le Application-L
b590: 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 ayer Protocol Ne
b5a0: 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 gotiation. Examp
b5b0: 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31 2e les are: http/1.
b5c0: 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 0,..http/1.1, h2
b5d0: 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c , h3, ftp, imap,
b5e0: 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 pop3, xmpp-clie
b5f0: 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 2c nt, xmpp-server,
b600: 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63 2e mqtt, irc, etc.
b610: 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 6e */. if (alpn
b620: 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 ) {../* Convert
b630: 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 a TCL list into
b640: 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 a protocol-list
b650: 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a in wire-format *
b660: 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 /..unsigned char
b670: 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 *protos, *p;..u
b680: 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 nsigned int prot
b690: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e 74 os_len = 0;..int
b6a0: 20 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54 i, len, cnt;..T
b6b0: 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a cl_Obj **list;..
b6c0: 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a .if (Tcl_ListObj
b6d0: 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 GetElements(inte
b6e0: 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 rp, alpn, &cnt,
b6f0: 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b &list) != TCL_OK
b700: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 ) {.. Tls_Fre
b710: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
b720: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
b730: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
b740: 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 ../* Determine t
b750: 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 he memory requir
b760: 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f ed for the proto
b770: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 col-list */..for
b780: 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 (i = 0; i < cnt
b790: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 ; i++) {.. Tc
b7a0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
b7b0: 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e bj(list[i], &len
b7c0: 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 );.. if (len
b7d0: 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 > 255) {...Tcl_A
b7e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
b7f0: 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 rp, "ALPN protoc
b800: 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 ol name too long
b810: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
b820: 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6f );...Tcl_SetErro
b830: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
b840: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 LS", "IMPORT", "
b850: 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c ALPN", "FAILED",
b860: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b870: 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 ...Tls_Free((cha
b880: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
b890: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
b8a0: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 OR;.. }..
b8b0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 protos_len += 1
b8c0: 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 + len;..}.../* B
b8d0: 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 uild the complet
b8e0: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 e protocol-list
b8f0: 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 */..protos = cka
b900: 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 lloc(protos_len)
b910: 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c ;../* protocol-l
b920: 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 ists consist of
b930: 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 8-bit length-pre
b940: 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 fixed, byte stri
b950: 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d ngs */..for (i =
b960: 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 0, p = protos;
b970: 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a i < cnt; i++) {.
b980: 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d . char *str =
b990: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
b9a0: 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 omObj(list[i], &
b9b0: 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 len);.. *p++
b9c0: 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 = len;.. memc
b9d0: 70 79 28 70 2c 20 73 74 72 2c 20 6c 65 6e 29 3b py(p, str, len);
b9e0: 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a .. p += len;.
b9f0: 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f .}.../* SSL_set_
ba00: 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 alpn_protos make
ba10: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 s a copy of the
ba20: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f protocol-list */
ba30: 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 ../* Note: This
ba40: 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 73 functions revers
ba50: 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 es the return va
ba60: 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a lue convention *
ba70: 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 /..if (SSL_set_a
ba80: 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 lpn_protos(state
ba90: 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 Ptr->ssl, protos
baa0: 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b , protos_len)) {
bab0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
bac0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
bad0: 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 41 4c failed to set AL
bae0: 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 PN protocols", (
baf0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
bb00: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
bb10: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
bb20: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 S", "IMPORT", "A
bb30: 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 LPN", "FAILED",
bb40: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
bb50: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
bb60: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
bb70: 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72 ;.. ckfree(pr
bb80: 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75 otos);.. retu
bb90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
bba0: 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 .../* Store prot
bbb0: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 ocols list */..s
bbc0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
bbd0: 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 = protos;..state
bbe0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 Ptr->protos_len
bbf0: 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 = protos_len;.
bc00: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 } else {..stat
bc10: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e ePtr->protos = N
bc20: 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e ULL;..statePtr->
bc30: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a protos_len = 0;.
bc40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
bc50: 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 * SSL Callbac
bc60: 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 ks. */. S
bc70: 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_set_app_data(
bc80: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 statePtr->ssl, (
bc90: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
bca0: 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 ;./* point back
bcb0: 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c to us */. SSL
bcc0: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 _set_verify(stat
bcd0: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 ePtr->ssl, verif
bce0: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 y, VerifyCallbac
bcf0: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f k);. SSL_set_
bd00: 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 info_callback(st
bd10: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 atePtr->ssl, Inf
bd20: 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 oCallback);..
bd30: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 /* Callback for
bd40: 20 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74 6f observing proto
bd50: 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a col messages */.
bd60: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f #ifndef OPENSSL_
bd70: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20 20 NO_SSL_TRACE.
bd80: 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 /* void SSL_CTX
bd90: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
bda0: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e k_arg(statePtr->
bdb0: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ctx, (void *)sta
bdc0: 74 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69 64 tePtr);. void
bdd0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 SSL_CTX_set_msg
bde0: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 _callback(stateP
bdf0: 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67 65 tr->ctx, Message
be00: 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 Callback); */.
be10: 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 SSL_set_msg_ca
be20: 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 llback_arg(state
be30: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 Ptr->ssl, (void
be40: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 *)statePtr);.
be50: 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c SSL_set_msg_cal
be60: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e lback(statePtr->
be70: 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c ssl, MessageCall
be80: 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 back);.#endif..
be90: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c /* Create Tcl
bea0: 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e _Channel BIO Han
beb0: 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 dler */. stat
bec0: 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 ePtr->p_bio.= BI
bed0: 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50 O_new_tcl(stateP
bee0: 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 tr, BIO_NOCLOSE)
bef0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
bf00: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 bio.= BIO_new(BI
bf10: 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 O_f_ssl());..
bf20: 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 if (server) {..
bf30: 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61 /* Server callba
bf40: 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f cks */..SSL_CTX_
bf50: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 set_tlsext_serve
bf60: 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50 rname_arg(stateP
bf70: 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a tr->ctx, (void *
bf80: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c )statePtr);..SSL
bf90: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f _CTX_set_tlsext_
bfa0: 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 servername_callb
bfb0: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ack(statePtr->ct
bfc0: 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b x, SNICallback);
bfd0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c ..SSL_CTX_set_cl
bfe0: 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 ient_hello_cb(st
bff0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c atePtr->ctx, Hel
c000: 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 loCallback, (voi
c010: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 d *)statePtr);..
c020: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 if (statePtr->pr
c030: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a otos != NULL) {.
c040: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
c050: 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 _alpn_select_cb(
c060: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 statePtr->ctx, A
c070: 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f LPNCallback, (vo
c080: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
c090: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 #ifdef USE_NPN..
c0a0: 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20 3d if (tls1_2 =
c0b0: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d = 0 && tls1_3 ==
c0c0: 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 0) {...SSL_CTX_
c0d0: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f set_next_protos_
c0e0: 61 64 76 65 72 74 69 73 65 64 5f 63 62 28 73 74 advertised_cb(st
c0f0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e atePtr->ctx, NPN
c100: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 Callback, (void
c110: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 *)statePtr);..
c120: 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 }.#endif..}...
c130: 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72 /* Enable server
c140: 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65 to send cert re
c150: 71 75 65 73 74 20 61 66 74 65 72 20 68 61 6e 64 quest after hand
c160: 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f shake (TLS 1.3 o
c170: 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 nly) */../* A wr
c180: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75 ite operation mu
c190: 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66 6f st take place fo
c1a0: 72 20 74 68 65 20 43 65 72 74 69 66 69 63 61 74 r the Certificat
c1b0: 65 20 52 65 71 75 65 73 74 20 74 6f 20 62 65 0a e Request to be.
c1c0: 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65 20 . sent to the
c1d0: 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61 6e client, this can
c1e0: 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53 53 be done with SS
c1f0: 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 L_do_handshake()
c200: 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 . */..if (reques
c210: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 t && post_handsh
c220: 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 20 7b ake && tls1_3) {
c230: 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66 79 .. SSL_verify
c240: 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e _client_post_han
c250: 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 72 2d dshake(statePtr-
c260: 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 >ssl);..}.../* s
c270: 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63 75 72 et automatic cur
c280: 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a ve selection */.
c290: 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f 61 75 .SSL_set_ecdh_au
c2a0: 74 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c to(statePtr->ssl
c2b0: 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 73 , 1);.../* Set s
c2c0: 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 erver mode */..s
c2d0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c tatePtr->flags |
c2e0: 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 = TLS_TCL_SERVER
c2f0: 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 ;..SSL_set_accep
c300: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 t_state(statePtr
c310: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c ->ssl);. } el
c320: 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 se {../* Client
c330: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66 callbacks */.#if
c340: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20 def USE_NPN..if
c350: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
c360: 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73 s != NULL && tls
c370: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 1_2 == 0 && tls1
c380: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 _3 == 0) {..
c390: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 SSL_CTX_set_next
c3a0: 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62 _proto_select_cb
c3b0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c3c0: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 ALPNCallback, (v
c3d0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
c3e0: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 ..}.#endif.../*
c3f0: 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20 Session caching
c400: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f */..SSL_CTX_set_
c410: 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f session_cache_mo
c420: 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 de(statePtr->ctx
c430: 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 , SSL_SESS_CACHE
c440: 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45 _CLIENT | SSL_SE
c450: 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 SS_CACHE_NO_INTE
c460: 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53 RNAL_STORE);..SS
c470: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e L_CTX_sess_set_n
c480: 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ew_cb(statePtr->
c490: 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c ctx, SessionCall
c4a0: 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 back);.../* Enab
c4b0: 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b le post handshak
c4c0: 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e e Authentication
c4d0: 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 extension. TLS
c4e0: 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 1.3 only, not ht
c4f0: 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65 tp/2. */..if (re
c500: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 quest && post_ha
c510: 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 ndshake) {..
c520: 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e SSL_set_post_han
c530: 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74 dshake_auth(stat
c540: 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 ePtr->ssl, 1);..
c550: 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e }.../* Set clien
c560: 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 t mode */..SSL_s
c570: 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 et_connect_state
c580: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
c590: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 . }. SSL_s
c5a0: 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d et_bio(statePtr-
c5b0: 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e >ssl, statePtr->
c5c0: 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d p_bio, statePtr-
c5d0: 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f >p_bio);. BIO
c5e0: 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 _set_ssl(statePt
c5f0: 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 r->bio, statePtr
c600: 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f ->ssl, BIO_NOCLO
c610: 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 SE);.. /*.
c620: 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 * End of SSL I
c630: 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 nit. */.
c640: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
c650: 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 ng %s", Tcl_GetC
c660: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
c670: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 Ptr->self));.
c680: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
c690: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 nterp, (char *)
c6a0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
c6b0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
c6c0: 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 f), TCL_VOLATILE
c6d0: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
c6e0: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
c6f0: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
c700: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
c710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c720: 2d 2d 2d 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 0a 20 2a -------------. *
c750: 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 . * UnimportObjC
c760: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 md --. *. *.This
c770: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
c780: 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 voked to remove
c790: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
c7a0: 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 nel filter.. *.
c7b0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
c7c0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
c7d0: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
c7e0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
c7f0: 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 modify the behav
c800: 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 ior of an IO cha
c810: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nnel.. *. *-----
c820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c830: 2d 2d 2d 2d 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 0a 20 --------------.
c860: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e */.static int.Un
c870: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 importObjCmd(Cli
c880: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
c890: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
c8a0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
c8b0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
c8c0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
c8d0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
c8e0: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c ../* The channel
c8f0: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
c900: 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e n. */.. dprin
c910: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
c920: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 if (objc != 2
c930: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
c940: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
c950: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 objv, "channel"
c960: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
c970: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
c980: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
c990: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
c9a0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
c9b0: 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 v[1]), NULL);.
c9c0: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 if (chan == (T
c9d0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
c9e0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
c9f0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
ca00: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 /* Make sure t
ca10: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
ca20: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
ca30: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 */. chan = T
ca40: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
ca50: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 (chan);.. if
ca60: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
ca70: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
ca80: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
ca90: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
caa0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
cab0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
cac0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
cad0: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e (chan),..."\": n
cae0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
caf0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 ", NULL);.. T
cb00: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
cb10: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
cb20: 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e UNIMPORT", "CHAN
cb30: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
cb40: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
cb50: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
cb60: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
cb70: 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 f (Tcl_UnstackCh
cb80: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 annel(interp, ch
cb90: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 an) == TCL_ERROR
cba0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
cbb0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
cbc0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
cbd0: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
cbe0: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
cbf0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 43 54 -------. *. * CT
cc40: 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 X_Init -- constr
cc50: 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e uct a SSL_CTX in
cc60: 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 stance. *. * Res
cc70: 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 ults:. *.A valid
cc80: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 SSL_CTX instanc
cc90: 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a e or NULL.. *. *
cca0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
ccb0: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c *.constructs SSL
ccc0: 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 context (CTX).
ccd0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
cd20: 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 ic SSL_CTX *.CTX
cd30: 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 _Init(State *sta
cd40: 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 tePtr, int isSer
cd50: 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 ver, int proto,
cd60: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 char *keyfile, c
cd70: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 har *certfile,.
cd80: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
cd90: 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 *key, unsigned
cda0: 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 char *cert, int
cdb0: 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 key_len, int cer
cdc0: 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 t_len, char *CAd
cdd0: 69 72 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 ir,. char *CA
cde0: 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68 file, char *ciph
cdf0: 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68 65 ers, char *ciphe
ce00: 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 rsuites, int lev
ce10: 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 el, char *DHpara
ce20: 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e ms) {. Tcl_In
ce30: 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 terp *interp = s
ce40: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
ce50: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 . SSL_CTX *ct
ce60: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 x = NULL;. Tc
ce70: 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 l_DString ds;.
ce80: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 Tcl_DString ds
ce90: 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 1;. int off =
cea0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 0;. int load
ceb0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 _private_key;.
cec0: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 const SSL_METH
ced0: 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 OD *method;..
cee0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
cef0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 ");.. if (!pr
cf00: 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 oto) {..Tcl_Appe
cf10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
cf20: 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f "no valid proto
cf30: 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 4e col selected", N
cf40: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
cf50: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f LL;. }.. /
cf60: 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e * create SSL con
cf70: 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e text */.#if OPEN
cf80: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
cf90: 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 ER >= 0x10100000
cfa0: 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f L || defined(NO_
cfb0: 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL2) || defined
cfc0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
cfd0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
cfe0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
cff0: 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c TO_SSL2)) {..Tcl
d000: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d010: 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 terp, "SSL2 prot
d020: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
d030: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
d040: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
d050: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
d060: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 ed(NO_SSL3) || d
d070: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d080: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 O_SSL3). if (
d090: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
d0a0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 LS_PROTO_SSL3))
d0b0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
d0c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c ult(interp, "SSL
d0d0: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 3 protocol not s
d0e0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
d0f0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
d100: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
d110: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
d120: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
d130: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 NSSL_NO_TLS1).
d140: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
d150: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
d160: 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 LS1)) {..Tcl_App
d170: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
d180: 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f , "TLS 1.0 proto
d190: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
d1a0: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 d", NULL);..retu
d1b0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
d1c0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
d1d0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 d(NO_TLS1_1) ||
d1e0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d1f0: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 NO_TLS1_1). i
d200: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
d210: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
d220: 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 _1)) {..Tcl_Appe
d230: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
d240: 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 "TLS 1.1 protoc
d250: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
d260: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
d270: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
d280: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
d290: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 (NO_TLS1_2) || d
d2a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d2b0: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 O_TLS1_2). if
d2c0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
d2d0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
d2e0: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 2)) {..Tcl_Appen
d2f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
d300: 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f "TLS 1.2 protoco
d310: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
d320: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
d330: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
d340: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
d350: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
d360: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d370: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 _TLS1_3). if
d380: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
d390: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
d3a0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
d3b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d3c0: 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c TLS 1.3 protocol
d3d0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
d3e0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
d3f0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
d400: 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f if. if (proto
d410: 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 == 0) {../* Use
d420: 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 full range */..
d430: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f SSL_CTX_set_min_
d440: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
d450: 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f x, 0);..SSL_CTX_
d460: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 set_max_proto_ve
d470: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 rsion(ctx, 0);.
d480: 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 }.. switch
d490: 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f (proto) {.#if O
d4a0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
d4b0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
d4c0: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 00L && !defined(
d4d0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 NO_SSL2) && !def
d4e0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d4f0: 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54 SSL2). case T
d500: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 LS_PROTO_SSL2:..
d510: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
d520: 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 72 r ? SSLv2_server
d530: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 _method() : SSLv
d540: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 2_client_method(
d550: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
d560: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
d570: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
d580: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
d590: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
d5a0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
d5b0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 _METHOD). cas
d5c0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 e TLS_PROTO_SSL3
d5d0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 :..method = isSe
d5e0: 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 rver ? SSLv3_ser
d5f0: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 ver_method() : S
d600: 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 SLv3_client_meth
d610: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
d620: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
d630: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 d(NO_TLS1) && !d
d640: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d650: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
d660: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d670: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 LS1_METHOD).
d680: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
d690: 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 LS1:..method = i
d6a0: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f sServer ? TLSv1_
d6b0: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 server_method()
d6c0: 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d : TLSv1_client_m
d6d0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
d6e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
d6f0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
d700: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
d710: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 SSL_NO_TLS1_1) &
d720: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d730: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 SL_NO_TLS1_1_MET
d740: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
d750: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a S_PROTO_TLS1_1:.
d760: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
d770: 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 er ? TLSv1_1_ser
d780: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 ver_method() : T
d790: 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 LSv1_1_client_me
d7a0: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
d7b0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
d7c0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 ned(NO_TLS1_2) &
d7d0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d7e0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 SL_NO_TLS1_2) &&
d7f0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
d800: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 L_NO_TLS1_2_METH
d810: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 OD). case TLS
d820: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 _PROTO_TLS1_2:..
d830: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
d840: 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 r ? TLSv1_2_serv
d850: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c er_method() : TL
d860: 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 Sv1_2_client_met
d870: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 hod();..break;.#
d880: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
d890: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 ed(NO_TLS1_3) &&
d8a0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
d8b0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
d8c0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
d8d0: 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 TLS1_3:../* Use
d8e0: 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74 68 the generic meth
d8f0: 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e od and constrain
d900: 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 63 6f t range after co
d910: 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 65 64 ntext is created
d920: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 */..method = is
d930: 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 Server ? TLS_ser
d940: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 ver_method() : T
d950: 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 LS_client_method
d960: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
d970: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a if. default:.
d980: 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69 ./* Negotiate hi
d990: 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20 ghest available
d9a0: 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 SSL/TLS version
d9b0: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 */..method = isS
d9c0: 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 erver ? TLS_serv
d9d0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c er_method() : TL
d9e0: 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 S_client_method(
d9f0: 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 );.#if OPENSSL_V
da00: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
da10: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 0x10100000L && !
da20: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
da30: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
da40: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f NSSL_NO_SSL2)..o
da50: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
da60: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
da70: 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53 SSL2) ? 0 : SS
da80: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a L_OP_NO_SSLv2);.
da90: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
daa0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 ned(NO_SSL3) &&
dab0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
dac0: 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c _NO_SSL3)..off |
dad0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
dae0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 , TLS_PROTO_SSL3
daf0: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 ) ? 0 : SSL_OP
db00: 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 _NO_SSLv3);.#end
db10: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
db20: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 NO_TLS1) && !def
db30: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
db40: 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 TLS1)..off |= (E
db50: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
db60: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 S_PROTO_TLS1)
db70: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
db80: 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 TLSv1);.#endif.#
db90: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
dba0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
dbb0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
dbc0: 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 S1_1)..off |= (E
dbd0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
dbe0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 S_PROTO_TLS1_1)
dbf0: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
dc00: 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 TLSv1_1);.#endif
dc10: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
dc20: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
dc30: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
dc40: 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 TLS1_2)..off |=
dc50: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
dc60: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 TLS_PROTO_TLS1_2
dc70: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ) ? 0 : SSL_OP_N
dc80: 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 O_TLSv1_2);.#end
dc90: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
dca0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
dcb0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
dcc0: 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c O_TLS1_3)..off |
dcd0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
dce0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
dcf0: 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 _3) ? 0 : SSL_OP
dd00: 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 _NO_TLSv1_3);.#e
dd10: 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 ndif..break;.
dd20: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 }.. ERR_clea
dd30: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 r_error();..
dd40: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
dd50: 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 w(method);. i
dd60: 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75 f (!ctx) {..retu
dd70: 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a rn(NULL);. }.
dd80: 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28 . if (getenv(
dd90: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 SSLKEYLOGFILE))
dda0: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b {..SSL_CTX_set_k
ddb0: 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 eylog_callback(c
ddc0: 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 tx, KeyLogCallba
ddd0: 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 ck);. }..#if
dde0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
ddf0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
de00: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
de10: 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 3). if (proto
de20: 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c == TLS_PROTO_TL
de30: 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 S1_3) {..SSL_CTX
de40: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 _set_min_proto_v
de50: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
de60: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 _3_VERSION);..SS
de70: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 L_CTX_set_max_pr
de80: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
de90: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 TLS1_3_VERSION)
dea0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a ;. }.#endif..
deb0: 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 /* Force cip
dec0: 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 her selection or
ded0: 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f der by server */
dee0: 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72 76 . if (!isServ
def0: 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 er) {..SSL_CTX_s
df00: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
df10: 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 SSL_OP_CIPHER_SE
df20: 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29 RVER_PREFERENCE)
df30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53 53 4c ;. }.. SSL
df40: 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 _CTX_set_app_dat
df50: 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e a(ctx, (void*)in
df60: 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 terp);./* rememb
df70: 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 er the interpret
df80: 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 er */. SSL_CT
df90: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
dfa0: 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 x, SSL_OP_ALL);.
dfb0: 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 /* all SSL bug w
dfc0: 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 orkarounds */.
dfd0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 SSL_CTX_set_op
dfe0: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
dff0: 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e P_NO_COMPRESSION
e000: 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f );./* disable co
e010: 6d 70 72 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 mpression even i
e020: 66 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 f supported */.
e030: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f SSL_CTX_set_o
e040: 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 ptions(ctx, off)
e050: 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 ;../* disable pr
e060: 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 otocol versions
e070: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 */.#if OPENSSL_V
e080: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
e090: 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20 0x10101000L.
e0a0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 SSL_CTX_set_mode
e0b0: 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 (ctx, SSL_MODE_A
e0c0: 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 UTO_RETRY);./* h
e0d0: 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 andle new handsh
e0e0: 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 akes in backgrou
e0f0: 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66 61 75 6c nd. On by defaul
e100: 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 t in OpenSSL 1.1
e110: 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 .1. */.#endif.
e120: 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 SSL_CTX_sess_s
e130: 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 et_cache_size(ct
e140: 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a x, 128);.. /*
e150: 20 53 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 Set user define
e160: 64 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 d ciphers, ciphe
e170: 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 r suites, and se
e180: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a curity level */.
e190: 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 if ((ciphers
e1a0: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 != NULL) && !SS
e1b0: 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 L_CTX_set_cipher
e1c0: 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 _list(ctx, ciphe
e1d0: 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 rs)) {..Tcl_Appe
e1e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
e1f0: 20 22 53 65 74 20 63 69 70 68 65 72 73 20 66 61 "Set ciphers fa
e200: 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 iled: No valid c
e210: 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a iphers", (char *
e220: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
e230: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
e240: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
e250: 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 . if ((cipher
e260: 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 suites != NULL)
e270: 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f && !SSL_CTX_set_
e280: 63 69 70 68 65 72 73 75 69 74 65 73 28 63 74 78 ciphersuites(ctx
e290: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29 29 , ciphersuites))
e2a0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
e2b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 sult(interp, "Se
e2c0: 74 20 63 69 70 68 65 72 20 73 75 69 74 65 73 20 t cipher suites
e2d0: 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 failed: No valid
e2e0: 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 ciphers", (char
e2f0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f *) NULL);..SSL_
e300: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
e310: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
e320: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 }.. /* Set s
e330: 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f ecurity level */
e340: 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e . if (level >
e350: 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 -1 && level < 6
e360: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f ) {../* SSL_set_
e370: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a security_level *
e380: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 /..SSL_CTX_set_s
e390: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 ecurity_level(ct
e3a0: 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d x, level);. }
e3b0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d .. /* set som
e3c0: 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 e callbacks */.
e3d0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 SSL_CTX_set_d
e3e0: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 efault_passwd_cb
e3f0: 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 (ctx, PasswordCa
e400: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c llback);. SSL
e410: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 _CTX_set_default
e420: 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 _passwd_cb_userd
e430: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a ata(ctx, (void *
e440: 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 )statePtr);..
e450: 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 /* read a Diffi
e460: 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 e-Hellman parame
e470: 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 ters file, or us
e480: 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f e the built-in o
e490: 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 ne */.#ifdef OPE
e4a0: 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 NSSL_NO_DH. i
e4b0: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e f (DHparams != N
e4c0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
e4d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
e4e0: 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 "DH parameter s
e4f0: 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c upport not avail
e500: 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 able", (char *)
e510: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f NULL);..SSL_CTX_
e520: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 free(ctx);..retu
e530: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
e540: 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 else. {..DH*
e550: 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d dh;..if (DHparam
e560: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 s != NULL) {..
e570: 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 BIO *bio;..
e580: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
e590: 28 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 (&ds);.. bio
e5a0: 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 = BIO_new_file(F
e5b0: 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 2N(DHparams, &ds
e5c0: 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 ), "r");.. if
e5d0: 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f (!bio) {...Tcl_
e5e0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
e5f0: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 ;...Tcl_AppendRe
e600: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f sult(interp, "Co
e610: 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 uld not find DH
e620: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 parameters file"
e630: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
e640: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
e650: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
e660: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 NULL;.. }...
e670: 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 dh = PEM_read
e680: 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 _bio_DHparams(bi
e690: 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e o, NULL, NULL, N
e6a0: 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 ULL);.. BIO_f
e6b0: 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 ree(bio);.. T
e6c0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
e6d0: 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 ds);.. if (!d
e6e0: 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e h) {...Tcl_Appen
e6f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
e700: 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 "Could not read
e710: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 DH parameters fr
e720: 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 om file", (char
e730: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f *) NULL);...SSL_
e740: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
e750: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 .return NULL;..
e760: 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 }..} else {..
e770: 20 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50 dh = get_dhP
e780: 61 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c arams();..}..SSL
e790: 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 _CTX_set_tmp_dh(
e7a0: 63 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 ctx, dh);..DH_fr
e7b0: 65 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 ee(dh);. }.#e
e7c0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 ndif.. /* set
e7d0: 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65 our certificate
e7e0: 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 */. load_pri
e7f0: 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 vate_key = 0;.
e800: 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 if (certfile !
e810: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f = NULL) {..load_
e820: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b private_key = 1;
e830: 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e ...Tcl_DStringIn
e840: 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 it(&ds);...if (S
e850: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 SL_CTX_use_certi
e860: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c ficate_file(ctx,
e870: 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 F2N(certfile, &
e880: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ds), SSL_FILETYP
e890: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 E_PEM) <= 0) {..
e8a0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
e8b0: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 ree(&ds);.. T
e8c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e8d0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
e8e0: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 to set certifica
e8f0: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 te file ", certf
e900: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 ile, ": ",....
e910: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 REASON(), (ch
e920: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
e930: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
e940: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
e950: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 NULL;..}. }
e960: 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d else if (cert !=
e970: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 NULL) {..load_p
e980: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a rivate_key = 1;.
e990: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 .if (SSL_CTX_use
e9a0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e _certificate_ASN
e9b0: 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 1(ctx, cert_len,
e9c0: 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 cert) <= 0) {..
e9d0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
e9e0: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 ree(&ds);.. T
e9f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
ea00: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
ea10: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 to set certifica
ea20: 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 te: ",.... R
ea30: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
ea40: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 ) NULL);.. SS
ea50: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
ea60: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
ea70: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 L;..}. } else
ea80: 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 {..certfile = (
ea90: 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 char*)X509_get_d
eaa0: 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 efault_cert_file
eab0: 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 ();...if (SSL_CT
eac0: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 X_use_certificat
ead0: 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 e_file(ctx, cert
eae0: 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 file, SSL_FILETY
eaf0: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a PE_PEM) <= 0) {.
eb00: 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 #if 0.. Tcl_D
eb10: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
eb20: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
eb30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
eb40: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 unable to use de
eb50: 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 fault certificat
eb60: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 e file ", certfi
eb70: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 le, ": ",....
eb80: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 REASON(), (cha
eb90: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
eba0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
ebb0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
ebc0: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a NULL;.#endif..}.
ebd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 }.. /* se
ebe0: 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 t our private ke
ebf0: 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 y */. if (loa
ec00: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b d_private_key) {
ec10: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d ..if (keyfile ==
ec20: 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 NULL && key ==
ec30: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 NULL) {.. key
ec40: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b file = certfile;
ec50: 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c ..}...if (keyfil
ec60: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 e != NULL) {..
ec70: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 /* get the pri
ec80: 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 vate key associa
ec90: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 ted with this ce
eca0: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 rtificate */..
ecb0: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d if (keyfile ==
ecc0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 NULL) {...keyfi
ecd0: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 le = certfile;..
ece0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 }... if (
ecf0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 SSL_CTX_use_Priv
ed00: 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c ateKey_file(ctx,
ed10: 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 F2N(keyfile, &d
ed20: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 s), SSL_FILETYPE
ed30: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 _PEM) <= 0) {...
ed40: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
ed50: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 &ds);.../* flush
ed60: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 the passphrase
ed70: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c which might be l
ed80: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c eft in the resul
ed90: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 t */...Tcl_SetRe
eda0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c sult(interp, NUL
edb0: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a L, TCL_STATIC);.
edc0: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
edd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 lt(interp, "unab
ede0: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 le to set public
edf0: 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 key file ", key
ee00: 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 file, " ",....
ee10: 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c REASON(),
ee20: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
ee30: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
ee40: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e ctx);...return N
ee50: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 ULL;.. }..
ee60: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
ee70: 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 (&ds);...} else
ee80: 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 if (key != NULL)
ee90: 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f {.. if (SSL_
eea0: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b CTX_use_PrivateK
eeb0: 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 ey_ASN1(EVP_PKEY
eec0: 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b _RSA, ctx, key,k
eed0: 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a ey_len) <= 0) {.
eee0: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
eef0: 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 e(&ds);.../* flu
ef00: 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 sh the passphras
ef10: 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 e which might be
ef20: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 left in the res
ef30: 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 ult */...Tcl_Set
ef40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e Result(interp, N
ef50: 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 ULL, TCL_STATIC)
ef60: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 ;...Tcl_AppendRe
ef70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e sult(interp, "un
ef80: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c able to set publ
ef90: 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f ic key: ", REASO
efa0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
efb0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
efc0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
efd0: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a rn NULL;.. }.
efe0: 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e .}../* Now we kn
eff0: 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e ow that a key an
f000: 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e d cert have been
f010: 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a set against.. *
f020: 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 the SSL context
f030: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 */..if (!SSL_CT
f040: 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f X_check_private_
f050: 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 key(ctx)) {..
f060: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
f070: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 t(interp, "priva
f080: 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 te key does not
f090: 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 match the certif
f0a0: 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 icate public key
f0b0: 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 ",.... (char
f0c0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
f0d0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
f0e0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
f0f0: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ULL;..}. }..
f100: 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69 /* Set verifi
f110: 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 cation CAs */.
f120: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
f130: 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f t(&ds);. Tcl_
f140: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 DStringInit(&ds1
f150: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 );. /* There
f160: 69 73 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 64 is one default d
f170: 69 72 65 63 74 6f 72 79 2c 20 6f 6e 65 20 64 65 irectory, one de
f180: 66 61 75 6c 74 20 66 69 6c 65 2c 20 61 6e 64 20 fault file, and
f190: 6f 6e 65 20 64 65 66 61 75 6c 74 20 73 74 6f 72 one default stor
f1a0: 65 2e 0a 09 54 68 65 20 64 65 66 61 75 6c 74 20 e...The default
f1b0: 43 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20 CA certificates
f1c0: 64 69 72 65 63 74 6f 72 79 20 28 61 6e 64 20 64 directory (and d
f1d0: 65 66 61 75 6c 74 20 73 74 6f 72 65 29 20 69 73 efault store) is
f1e0: 20 69 6e 20 74 68 65 20 4f 70 65 6e 53 53 4c 0a in the OpenSSL.
f1f0: 09 63 65 72 74 73 20 64 69 72 65 63 74 6f 72 79 .certs directory
f200: 2e 20 49 74 20 63 61 6e 20 62 65 20 6f 76 65 72 . It can be over
f210: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 ridden by the SS
f220: 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20 76 L_CERT_DIR env v
f230: 61 72 2e 20 54 68 65 0a 09 64 65 66 61 75 6c 74 ar. The..default
f240: 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65 73 CA certificates
f250: 20 66 69 6c 65 20 69 73 20 63 61 6c 6c 65 64 20 file is called
f260: 63 65 72 74 2e 70 65 6d 20 69 6e 20 74 68 65 20 cert.pem in the
f270: 64 65 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c 0a default OpenSSL.
f280: 09 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63 .directory. It c
f290: 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e an be overridden
f2a0: 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 by the SSL_CERT
f2b0: 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a _FILE env var. *
f2c0: 2f 0a 09 2f 2a 20 69 6e 74 20 53 53 4c 5f 43 54 /../* int SSL_CT
f2d0: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 X_set_default_ve
f2e0: 72 69 66 79 5f 64 69 72 28 53 53 4c 5f 43 54 58 rify_dir(SSL_CTX
f2f0: 20 2a 63 74 78 29 20 61 6e 64 20 69 6e 74 20 53 *ctx) and int S
f300: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 SL_CTX_set_defau
f310: 6c 74 5f 76 65 72 69 66 79 5f 66 69 6c 65 28 53 lt_verify_file(S
f320: 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 2a 2f 0a SL_CTX *ctx) */.
f330: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 if (!SSL_CTX
f340: 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 _load_verify_loc
f350: 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 ations(ctx, F2N(
f360: 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 CAfile, &ds), F2
f370: 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29 29 20 N(CAdir, &ds1))
f380: 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 65 74 ||..!SSL_CTX_set
f390: 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f _default_verify_
f3a0: 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a 23 69 paths(ctx)) {.#i
f3b0: 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 f 0..Tcl_DString
f3c0: 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f Free(&ds);..Tcl_
f3d0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 DStringFree(&ds1
f3e0: 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72 );../* Don't cur
f3f0: 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66 20 74 rently care if t
f400: 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63 his fails */..Tc
f410: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
f420: 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65 66 61 nterp, "SSL defa
f430: 75 6c 74 20 76 65 72 69 66 79 20 70 61 74 68 73 ult verify paths
f440: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 : ", REASON(), (
f450: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
f460: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
f470: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
f480: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 .#endif. }..
f490: 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f /* https://so
f4a0: 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f urceforge.net/p/
f4b0: 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a tls/bugs/57/ */.
f4c0: 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a /* XXX:TODO:
f4d0: 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 Let the user su
f4e0: 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 pply values here
f4f0: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 instead of some
f500: 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 thing that exist
f510: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 s on the filesys
f520: 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 tem */. if (C
f530: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b Afile != NULL) {
f540: 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f ..STACK_OF(X509_
f550: 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 NAME) *certNames
f560: 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 = SSL_load_clie
f570: 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 nt_CA_file(F2N(C
f580: 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 Afile, &ds));..i
f590: 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 f (certNames !=
f5a0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c NULL) {.. SSL
f5b0: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
f5c0: 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 CA_list(ctx, cer
f5d0: 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 tNames);..}.
f5e0: 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
f5f0: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 ngFree(&ds);.
f600: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
f610: 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75 (&ds1);. retu
f620: 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 rn ctx;.}.../*.
f630: 2a 2d 2d 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 0a 20 2a 0a 20 2a 20 53 74 61 74 75 ----. *. * Statu
f680: 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 sObjCmd -- retur
f690: 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f n certificate fo
f6a0: 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 r connected peer
f6b0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
f6c0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
f6d0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
f6e0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
f6f0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
f700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f740: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
f750: 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 StatusObjCmd(Cli
f760: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
f770: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
f780: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
f790: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
f7a0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 objv[]) {. S
f7b0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a tate *statePtr;.
f7c0: 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a X509 *peer;.
f7d0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
f7e0: 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 Ptr;. Tcl_Cha
f7f0: 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 nnel chan;. c
f800: 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 har *channelName
f810: 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 , *ciphers;.
f820: 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f int mode;. co
f830: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
f840: 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e r *proto;. un
f850: 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a signed int len;.
f860: 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 int nid, res
f870: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
f880: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
f890: 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f f (objc < 2 || o
f8a0: 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 bjc > 3 || (objc
f8b0: 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70 == 3 && !strcmp
f8c0: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f (Tcl_GetString(o
f8d0: 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c bjv[1]), "-local
f8e0: 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e "))) {..Tcl_Wron
f8f0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
f900: 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 1, objv, "?-loc
f910: 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 al? channel");..
f920: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
f930: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
f940: 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a Get channel Id *
f950: 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d /. channelNam
f960: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e e = Tcl_GetStrin
f970: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 28 6f gFromObj(objv[(o
f980: 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 bjc == 2 ? 1 : 2
f990: 29 5d 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 63 )], NULL);. c
f9a0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
f9b0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 nnel(interp, cha
f9c0: 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 nnelName, &mode)
f9d0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
f9e0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
f9f0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
fa00: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
fa10: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
fa20: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
fa30: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
fa40: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
fa50: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
fa60: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
fa70: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
fa80: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
fa90: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
faa0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
fab0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
fac0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
fad0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
fae0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
faf0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
fb00: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 nel", NULL);..Tc
fb10: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
fb20: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 nterp, "TLS", "S
fb30: 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c TATUS", "CHANNEL
fb40: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 ", "INVALID", (c
fb50: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
fb60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
fb70: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 . }. state
fb80: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr = (State *)
fb90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e Tcl_GetChannelIn
fba0: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 stanceData(chan)
fbb0: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 ;.. /* Get ce
fbc0: 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 rtificate for pe
fbd0: 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 er or self */.
fbe0: 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 if (objc == 2)
fbf0: 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 {..peer = SSL_g
fc00: 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 et_peer_certific
fc10: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ate(statePtr->ss
fc20: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b l);. } else {
fc30: 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 ..peer = SSL_get
fc40: 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 _certificate(sta
fc50: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
fc60: 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 }. /* Get X5
fc70: 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69 09 certificate i
fc80: 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 nfo */. if (p
fc90: 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d eer) {..objPtr =
fca0: 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 Tls_NewX509Obj(
fcb0: 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 interp, peer);..
fcc0: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b if (objc == 2) {
fcd0: 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 .. X509_free(
fce0: 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 peer);.. peer
fcf0: 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 = NULL;..}.
fd00: 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 } else {..objPtr
fd10: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
fd20: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 j(0, NULL);.
fd30: 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e }.. /* Peer n
fd40: 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 ame */. LAPPE
fd50: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
fd60: 62 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 bjPtr, "peername
fd70: 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 ", SSL_get0_peer
fd80: 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 name(statePtr->s
fd90: 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 sl), -1);. LA
fda0: 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
fdb0: 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 , objPtr, "sbits
fdc0: 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 ", SSL_get_ciphe
fdd0: 72 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d r_bits(statePtr-
fde0: 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 >ssl, NULL));..
fdf0: 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 ciphers = (ch
fe00: 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 ar*)SSL_get_ciph
fe10: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c er(statePtr->ssl
fe20: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 );. LAPPEND_S
fe30: 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
fe40: 72 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 r, "cipher", cip
fe50: 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 hers, -1);..
fe60: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 /* Verify the X5
fe70: 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 09 certificate p
fe80: 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 resented by the
fe90: 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 peer */. LAPP
fea0: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
feb0: 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 objPtr, "verifyR
fec0: 65 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 esult",..X509_ve
fed0: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f rify_cert_error_
fee0: 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 string(SSL_get_v
fef0: 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 erify_result(sta
ff00: 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 tePtr->ssl)), -1
ff10: 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 );.. /* Verif
ff20: 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f y mode */. mo
ff30: 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 de = SSL_get_ver
ff40: 69 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 ify_mode(statePt
ff50: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 r->ssl);. if
ff60: 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 (mode && SSL_VER
ff70: 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 IFY_NONE) {..LAP
ff80: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
ff90: 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 objPtr, "verify
ffa0: 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d Mode", "none", -
ffb0: 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 1);. } else {
ffc0: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f ..Tcl_Obj *listO
ffd0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
ffe0: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
fff0: 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 ..if (mode && SS
10000 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b L_VERIFY_PEER) {
10010 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
10020 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10030 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 nterp, listObjPt
10040 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
10050 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 Obj("peer", -1))
10060 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 ;..}..if (mode &
10070 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 & SSL_VERIFY_FAI
10080 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 L_IF_NO_PEER_CER
10090 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 T) {.. Tcl_Li
100a0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
100b0 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f nt(interp, listO
100c0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
100d0 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 ringObj("fail if
100e0 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 no peer cert",
100f0 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f -1));..}..if (mo
10100 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 de && SSL_VERIFY
10110 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a _CLIENT_ONCE) {.
10120 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
10130 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
10140 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 terp, listObjPtr
10150 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10160 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 bj("client once"
10170 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
10180 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
10190 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b FY_POST_HANDSHAK
101a0 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 E) {.. Tcl_Li
101b0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
101c0 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f nt(interp, listO
101d0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
101e0 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 ringObj("post ha
101f0 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a ndshake", -1));.
10200 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 .}..LAPPEND_OBJ(
10210 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10220 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 "verifyMode", li
10230 73 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a stObjPtr). }.
10240 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d . /* Verify m
10250 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 ode depth */.
10260 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 LAPPEND_INT(int
10270 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 erp, objPtr, "ve
10280 72 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f rifyDepth", SSL_
10290 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 get_verify_depth
102a0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 (statePtr->ssl))
102b0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 ;.. /* Report
102c0 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 the selected pr
102d0 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 otocol as a resu
102e0 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 lt of the negoti
102f0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c ation */. SSL
10300 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 _get0_alpn_selec
10310 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ted(statePtr->ss
10320 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 l, &proto, &len)
10330 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 ;. LAPPEND_ST
10340 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
10350 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 , "alpn", (char
10360 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c *)proto, (int) l
10370 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 en);. LAPPEND
10380 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
10390 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c Ptr, "protocol",
103a0 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e SSL_get_version
103b0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c (statePtr->ssl),
103c0 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 -1);.. /* Va
103d0 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 lid for non-RSA
103e0 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c signature and TL
103f0 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 S 1.3 */. if
10400 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 (objc == 2) {..r
10410 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 es = SSL_get_pee
10420 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 r_signature_nid(
10430 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
10440 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 nid);. } else
10450 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 {..res = SSL_ge
10460 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 t_signature_nid(
10470 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
10480 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 nid);. }.
10490 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d if (!res) {nid =
104a0 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 0;}. LAPPEND
104b0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
104c0 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 Ptr, "signatureH
104d0 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f ashAlgorithm", O
104e0 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 BJ_nid2ln(nid),
104f0 2d 31 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 -1);.. if (ob
10500 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 jc == 2) {..res
10510 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 = SSL_get_peer_s
10520 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 ignature_type_ni
10530 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c d(statePtr->ssl,
10540 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c &nid);. } el
10550 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f se {..res = SSL_
10560 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 get_signature_ty
10570 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d pe_nid(statePtr-
10580 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 >ssl, &nid);.
10590 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 }. if (!res)
105a0 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 {nid = 0;}.
105b0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
105c0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 rp, objPtr, "sig
105d0 6e 61 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a natureType", OBJ
105e0 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 _nid2ln(nid), -1
105f0 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f );.. Tcl_SetO
10600 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
10610 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
10620 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
10630 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
10640 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a tData;.}.../*. *
10650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10690 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 ---. *. * Connec
106a0 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d tionInfoObjCmd -
106b0 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 - return connect
106c0 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 ion info from Op
106d0 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 enSSL.. *. * Res
106e0 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 ults:. *.A list
106f0 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e of connection in
10700 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d fo. *. *-------
10710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
10750 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e ..static int Con
10760 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d nectionInfoObjCm
10770 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
10780 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
10790 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
107a0 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
107b0 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
107c0 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
107d0 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 chan;../* The ch
107e0 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
107f0 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 ode on */. St
10800 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 ate *statePtr;..
10810 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 /* client state
10820 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a for ssl socket *
10830 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f /. Tcl_Obj *o
10840 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b bjPtr, *listPtr;
10850 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a . const SSL *
10860 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 ssl;. const S
10870 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 SL_CIPHER *ciphe
10880 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c r;. const SSL
10890 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f _SESSION *sessio
108a0 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 n;. const EVP
108b0 5f 4d 44 20 2a 6d 64 3b 0a 0a 20 20 20 20 69 66 _MD *md;.. if
108c0 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
108d0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
108e0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
108f0 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
10900 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
10910 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 ;. }.. cha
10920 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
10930 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
10940 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
10950 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 objv[1], NULL),
10960 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
10970 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
10980 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
10990 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
109a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
109b0 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
109c0 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
109d0 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
109e0 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
109f0 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
10a00 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 ;. if (Tcl_Ge
10a10 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
10a20 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
10a30 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f lType()) {..Tcl_
10a40 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
10a50 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
10a60 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
10a70 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
10a80 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 .. "\": not a
10a90 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
10aa0 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 ULL);..Tcl_SetEr
10ab0 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
10ac0 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 "TLS", "CONNECTI
10ad0 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 ON", "CHANNEL",
10ae0 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 "INVALID", (char
10af0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
10b00 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
10b10 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 }.. objPtr
10b20 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
10b30 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 j(0, NULL);..
10b40 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 /* Connection i
10b50 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 nfo */. state
10b60 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 Ptr = (State *)T
10b70 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
10b80 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b tanceData(chan);
10b90 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 . ssl = state
10ba0 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 Ptr->ssl;. if
10bb0 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b (ssl != NULL) {
10bc0 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 ../* connection
10bd0 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e state */..LAPPEN
10be0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
10bf0 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20 53 jPtr, "state", S
10c00 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f SL_state_string_
10c10 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a long(ssl), -1);.
10c20 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 ../* Get SNI req
10c30 75 65 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 uested server na
10c40 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 me */..LAPPEND_S
10c50 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10c60 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22 2c r, "servername",
10c70 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e SSL_get_servern
10c80 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f ame(ssl, TLSEXT_
10c90 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 NAMETYPE_host_na
10ca0 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 me), -1);.../* G
10cb0 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 et protocol */..
10cc0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
10cd0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f rp, objPtr, "pro
10ce0 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f tocol", SSL_get_
10cf0 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 version(ssl), -1
10d00 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 );.../* Renegoti
10d10 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f ation allowed */
10d20 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
10d30 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10d40 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c renegotiation_al
10d50 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f lowed", SSL_get_
10d60 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 secure_renegotia
10d70 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c tion_support(ssl
10d80 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 ));.../* Get sec
10d90 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 urity level */..
10da0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
10db0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 rp, objPtr, "sec
10dc0 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 53 53 4c uritylevel", SSL
10dd0 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _get_security_le
10de0 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 vel(ssl));.../*
10df0 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a Session info */.
10e00 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
10e10 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
10e20 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 ession_reused",
10e30 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 SSL_session_reus
10e40 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 ed(ssl));.../* I
10e50 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f s server info */
10e60 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
10e70 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10e80 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f is_server", SSL_
10e90 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b is_server(ssl));
10ea0 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f .../* Is DTLS */
10eb0 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
10ec0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10ed0 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 is_dtls", SSL_is
10ee0 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 _dtls(ssl));.
10ef0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 }.. /* Ciphe
10f00 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 r info */. ci
10f10 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 pher = SSL_get_c
10f20 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 urrent_cipher(ss
10f30 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 l);. if (ciph
10f40 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 er != NULL) {..c
10f50 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 har buf[BUFSIZ]
10f60 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 = {0};..int bits
10f70 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a , alg_bits;.../*
10f80 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a Cipher name */.
10f90 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
10fa0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 erp, objPtr, "ci
10fb0 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 pher", SSL_CIPHE
10fc0 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 R_get_name(ciphe
10fd0 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 r), -1);.../* RF
10fe0 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 C name of cipher
10ff0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
11000 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11010 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 "standard_name"
11020 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 , SSL_CIPHER_sta
11030 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 ndard_name(ciphe
11040 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 r), -1);.../* Op
11050 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 enSSL name of ci
11060 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 pher */..LAPPEND
11070 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11080 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 Ptr, "openssl_na
11090 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 me", OPENSSL_cip
110a0 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 her_name(SSL_CIP
110b0 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d HER_standard_nam
110c0 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b e(cipher)), -1);
110d0 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 .../* number of
110e0 73 65 63 72 65 74 20 62 69 74 73 20 75 73 65 64 secret bits used
110f0 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 for cipher */..
11100 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 bits = SSL_CIPHE
11110 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 R_get_bits(ciphe
11120 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 r, &alg_bits);..
11130 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
11140 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 rp, objPtr, "sec
11150 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29 ret_bits", bits)
11160 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 ;..LAPPEND_INT(i
11170 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11180 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c algorithm_bits",
11190 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 alg_bits);../*
111a0 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 alg_bits is actu
111b0 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 al key secret bi
111c0 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 ts. If use bits
111d0 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f and secret (algo
111e0 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 rithm) bits diff
111f0 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 er,.. the rest
11200 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 of the bits are
11210 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 fixed, i.e. for
11220 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 limited export
11230 63 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 ciphers (bits <
11240 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 56) */.../* Indi
11250 63 61 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f cates which SSL/
11260 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 TLS protocol ver
11270 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e sion first defin
11280 65 64 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f ed the cipher */
11290 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
112a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d terp, objPtr, "m
112b0 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c in_version", SSL
112c0 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 _CIPHER_get_vers
112d0 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 ion(cipher), -1)
112e0 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 ;.../* Cipher NI
112f0 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 D */..LAPPEND_ST
11300 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11310 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20 28 , "cipherNID", (
11320 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c char *)OBJ_nid2l
11330 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 n(SSL_CIPHER_get
11340 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70 68 _cipher_nid(ciph
11350 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 er)), -1);..LAPP
11360 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11370 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74 4e objPtr, "digestN
11380 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a ID", (char *)OBJ
11390 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 _nid2ln(SSL_CIPH
113a0 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 ER_get_digest_ni
113b0 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b d(cipher)), -1);
113c0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
113d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b terp, objPtr, "k
113e0 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 eyExchangeNID",
113f0 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 (char *)OBJ_nid2
11400 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ln(SSL_CIPHER_ge
11410 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 29 t_kx_nid(cipher)
11420 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ), -1);..LAPPEND
11430 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11440 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63 61 Ptr, "authentica
11450 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 tionNID", (char
11460 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c *)OBJ_nid2ln(SSL
11470 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74 68 _CIPHER_get_auth
11480 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d _nid(cipher)), -
11490 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 1);.../* message
114a0 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 authentication
114b0 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69 73 code - Cipher is
114c0 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 AEAD (e.g. GCM
114d0 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 or ChaCha20/Poly
114e0 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 1305) or not */.
114f0 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74 65 ./* Authenticate
11500 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 d Encryption wit
11510 68 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 h associated dat
11520 61 20 28 41 45 41 44 29 20 63 68 65 63 6b 20 2a a (AEAD) check *
11530 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
11540 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11550 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64 22 "cipher_is_aead"
11560 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f , SSL_CIPHER_is_
11570 61 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a 0a aead(cipher));..
11580 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64 20 ./* Digest used
11590 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 during the SSL/T
115a0 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68 65 LS handshake whe
115b0 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69 70 68 n using the ciph
115c0 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c er. */..md = SSL
115d0 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 _CIPHER_get_hand
115e0 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69 70 shake_digest(cip
115f0 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 her);..LAPPEND_S
11600 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11610 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 r, "handshake_di
11620 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29 45 gest", (char *)E
11630 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 VP_MD_name(md),
11640 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 -1);.../* Get Op
11650 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 enSSL-specific I
11660 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a D, not IANA ID *
11670 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 /..LAPPEND_INT(i
11680 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11690 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 cipher_id", (int
116a0 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 ) SSL_CIPHER_get
116b0 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 _id(cipher));...
116c0 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 /* Two-byte ID u
116d0 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 sed in the TLS p
116e0 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 rotocol of the g
116f0 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 iven cipher */..
11700 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
11710 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f rp, objPtr, "pro
11720 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 tocol_id", (int)
11730 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
11740 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 protocol_id(ciph
11750 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 er));.../* Textu
11760 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f al description o
11770 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a f the cipher */.
11780 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f .if (SSL_CIPHER_
11790 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 description(ciph
117a0 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 er, buf, sizeof(
117b0 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b buf)) != NULL) {
117c0 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 .. LAPPEND_ST
117d0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
117e0 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c , "description",
117f0 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 buf, -1);..}.
11800 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 }.. /* Sess
11810 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ion info */.
11820 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 session = SSL_ge
11830 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a t_session(ssl);.
11840 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 if (session
11850 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 != NULL) {..cons
11860 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
11870 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 *ticket;..size_t
11880 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 len2;..unsigned
11890 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 int ulen;..cons
118a0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
118b0 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 *session_id, *pr
118c0 6f 74 6f 3b 0a 09 63 68 61 72 20 62 75 66 66 65 oto;..char buffe
118d0 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 r[SSL_MAX_MASTER
118e0 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 _KEY_LENGTH];...
118f0 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 /* Report the se
11900 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
11910 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
11920 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 he ALPN negotiat
11930 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 ion */..SSL_SESS
11940 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 ION_get0_alpn_se
11950 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 lected(session,
11960 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a &proto, &len2);.
11970 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
11980 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c erp, objPtr, "al
11990 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 pn", (char *) pr
119a0 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 oto, (int) len2)
119b0 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 ;.../* Report th
119c0 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
119d0 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
119e0 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 of the NPN negot
119f0 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 iation */.#ifdef
11a00 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 USE_NPN..SSL_ge
11a10 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 t0_next_proto_ne
11a20 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 gotiated(ssl, &p
11a30 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c roto, &ulen);..L
11a40 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11a50 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 p, objPtr, "npn"
11a60 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f , (char *) proto
11a70 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 3b 0a 23 , (int) ulen);.#
11a80 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d endif.../* Resum
11a90 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a able session */.
11aa0 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
11ab0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 terp, objPtr, "r
11ac0 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 esumable", SSL_S
11ad0 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 ESSION_is_resuma
11ae0 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a ble(session));..
11af0 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 ./* Session star
11b00 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 t time (seconds
11b10 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a since epoch) */.
11b20 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e .LAPPEND_LONG(in
11b30 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
11b40 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f tart_time", SSL_
11b50 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 SESSION_get_time
11b60 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a (session));.../*
11b70 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d Timeout value -
11b80 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d SSL_CTX_get_tim
11b90 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 eout (in seconds
11ba0 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f ) */..LAPPEND_LO
11bb0 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NG(interp, objPt
11bc0 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 r, "timeout", SS
11bd0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
11be0 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b meout(session));
11bf0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 .../* Session id
11c00 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 - TLSv1.2 and b
11c10 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 elow only */..se
11c20 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 ssion_id = SSL_S
11c30 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 ESSION_get_id(se
11c40 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 ssion, &ulen);..
11c50 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 LAPPEND_BARRAY(i
11c60 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11c70 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 session_id", ses
11c80 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 sion_id, (int) u
11c90 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 len);.../* Sessi
11ca0 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 on context */..s
11cb0 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f ession_id = SSL_
11cc0 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f SESSION_get0_id_
11cd0 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c context(session,
11ce0 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e &ulen);..LAPPEN
11cf0 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
11d00 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
11d10 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 n_context", sess
11d20 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c ion_id, (int) ul
11d30 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f en);.../* Sessio
11d40 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e n ticket - clien
11d50 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 t only */..SSL_S
11d60 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b ESSION_get0_tick
11d70 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 et(session, &tic
11d80 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 ket, &len2);..LA
11d90 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 PPEND_BARRAY(int
11da0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
11db0 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 ssion_ticket", t
11dc0 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e icket, (int) len
11dd0 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 2);.../* Session
11de0 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 ticket lifetime
11df0 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 hint (in second
11e00 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c s) */..LAPPEND_L
11e10 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ONG(interp, objP
11e20 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 tr, "lifetime",
11e30 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
11e40 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f ticket_lifetime_
11e50 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a hint(session));.
11e60 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 ../* Ticket app
11e70 64 61 74 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 data */..SSL_SES
11e80 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
11e90 5f 61 70 70 64 61 74 61 28 73 65 73 73 69 6f 6e _appdata(session
11ea0 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 , &ticket, &len2
11eb0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
11ec0 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
11ed0 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 r, "ticket_app_d
11ee0 61 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 69 ata", ticket, (i
11ef0 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 nt) len2);.../*
11f00 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a Get master key *
11f10 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 /..len2 = SSL_SE
11f20 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 SSION_get_master
11f30 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 _key(session, bu
11f40 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 ffer, SSL_MAX_MA
11f50 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 STER_KEY_LENGTH)
11f60 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 ;..LAPPEND_BARRA
11f70 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 Y(interp, objPtr
11f80 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 , "master_key",
11f90 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 6c 65 buffer, (int) le
11fa0 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 n2);.../* Compre
11fb0 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 ssion id */..uns
11fc0 69 67 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 igned int id = S
11fd0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 SL_SESSION_get_c
11fe0 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 ompress_id(sessi
11ff0 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 on);..LAPPEND_ST
12000 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
12010 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 , "compression_i
12020 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a d", id == 1 ? "z
12030 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d lib" : "none", -
12040 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 1);. }.. /
12050 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e * Compression in
12060 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 fo */. if (ss
12070 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 l != NULL) {.#if
12080 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d def HAVE_SSL_COM
12090 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 PRESSION..const
120a0 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d COMP_METHOD *com
120b0 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 p, *expn;..comp
120c0 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e = SSL_get_curren
120d0 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 t_compression(ss
120e0 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f l);..expn = SSL_
120f0 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 get_current_expa
12100 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 nsion(ssl);...LA
12110 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12120 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 , objPtr, "compr
12130 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 ession", comp ?
12140 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d SSL_COMP_get_nam
12150 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 e(comp) : "none"
12160 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f , -1);..LAPPEND_
12170 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12180 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c tr, "expansion",
12190 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 expn ? SSL_COMP
121a0 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 _get_name(expn)
121b0 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 : "none", -1);.#
121c0 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 else..LAPPEND_ST
121d0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
121e0 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c , "compression",
121f0 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c "none", -1);..L
12200 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
12210 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 p, objPtr, "expa
12220 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 nsion", "none",
12230 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 -1);.#endif.
12240 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 }.. /* Server
12250 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 info */. {..
12260 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f long mode = SSL_
12270 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f CTX_get_session_
12280 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 cache_mode(state
12290 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 Ptr->ctx);..char
122a0 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 *msg;...if (mod
122b0 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 e & SSL_SESS_CAC
122c0 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d HE_OFF) {.. m
122d0 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 sg = "off";..} e
122e0 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 lse if (mode & S
122f0 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c SL_SESS_CACHE_CL
12300 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 IENT) {.. msg
12310 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 = "client";..}
12320 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 else if (mode &
12330 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 SSL_SESS_CACHE_S
12340 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 ERVER) {.. ms
12350 67 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d g = "server";..}
12360 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 else if (mode &
12370 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
12380 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 BOTH) {.. msg
12390 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c = "both";..} el
123a0 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 se {.. msg =
123b0 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c "unknown";..}..L
123c0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
123d0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 p, objPtr, "sess
123e0 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c ion_cache_mode",
123f0 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d msg, -1);. }
12400 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 .. /* CA List
12410 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f */. /* IF no
12420 74 20 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 t a server, same
12430 20 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 as SSL_get0_pee
12440 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 r_CA_list. If se
12450 72 76 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c rver same as SSL
12460 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f _CTX_get_client_
12470 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c CA_list */. l
12480 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 istPtr = Tcl_New
12490 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
124a0 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 ;. STACK_OF(X
124b0 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 509_NAME) *ca_li
124c0 73 74 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f st;. if ((ca_
124d0 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 list = SSL_get_c
124e0 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 lient_CA_list(ss
124f0 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 l)) != NULL) {..
12500 63 68 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 char buffer[BUFS
12510 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 IZ];..for (int i
12520 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 = 0; i < sk_X50
12530 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 9_NAME_num(ca_li
12540 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 st); i++) {..
12550 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 X509_NAME *name
12560 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f = sk_X509_NAME_
12570 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 value(ca_list, i
12580 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 );.. if (name
12590 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f ) {...X509_NAME_
125a0 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 oneline(name, bu
125b0 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 ffer, BUFSIZ);..
125c0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
125d0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
125e0 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e , listPtr, Tcl_N
125f0 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 ewStringObj(buff
12600 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d er, -1));.. }
12610 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 ..}. }. LA
12620 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
12630 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 , objPtr, "caLis
12640 74 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 t", listPtr);.
12650 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e LAPPEND_INT(in
12660 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
12670 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f aListCount", sk_
12680 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 X509_NAME_num(ca
12690 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 _list));.. Tc
126a0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
126b0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
126c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
126d0 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d K;..clientData =
126e0 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c clientData;.}..
126f0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
12700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12730 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
12740 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d VersionObjCmd --
12750 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 return version
12760 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e string from Open
12770 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c SSL.. *. * Resul
12780 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
12790 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
127a0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
127b0 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
127c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
127d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
127e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
127f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12800 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
12810 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 nt.VersionObjCmd
12820 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
12830 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
12840 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
12850 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
12860 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
12870 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
12880 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 tr;.. dprintf
12890 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
128a0 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 objPtr = Tcl_Ne
128b0 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 wStringObj(OPENS
128c0 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c SL_VERSION_TEXT,
128d0 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 -1);. Tcl_Se
128e0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
128f0 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 p, objPtr);..
12900 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
12910 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
12920 69 65 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63 20 ientData;..objc
12930 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 = objc;..objv =
12940 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d objv;.}.../*. *-
12950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12990 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a --. *. * MiscObj
129a0 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d Cmd -- misc comm
129b0 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ands. *. * Resul
129c0 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
129d0 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
129e0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
129f0 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
12a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a40 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
12a50 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c nt.MiscObjCmd(Cl
12a60 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
12a70 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
12a80 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
12a90 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
12aa0 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
12ab0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
12ac0 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d r *commands [] =
12ad0 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 { "req", "strre
12ae0 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 q", NULL };.
12af0 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 enum command { C
12b00 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 _REQ, C_STRREQ,
12b10 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 C_DUMMY };. i
12b20 6e 74 20 63 6d 64 2c 20 69 73 53 74 72 3b 0a 20 nt cmd, isStr;.
12b30 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 char buffer[1
12b40 36 33 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6384];.. dpri
12b50 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
12b60 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
12b70 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
12b80 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
12b90 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 objv, "subcomma
12ba0 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 nd ?args?");..re
12bb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
12bc0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 }. if (Tc
12bd0 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 l_GetIndexFromOb
12be0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 j(interp, objv[1
12bf0 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f ], commands, "co
12c00 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29 mmand", 0, &cmd)
12c10 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
12c20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
12c30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
12c40 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
12c50 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 isStr = (cmd
12c60 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 == C_STRREQ);.
12c70 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d switch ((enum
12c80 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b command) cmd) {
12c90 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 ..case C_REQ:..c
12ca0 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a ase C_STRREQ: {.
12cb0 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 . EVP_PKEY *p
12cc0 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 key=NULL;.. X
12cd0 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 509 *cert=NULL;.
12ce0 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a . X509_NAME *
12cf0 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 name=NULL;..
12d00 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b Tcl_Obj **listv;
12d10 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 74 63 2c .. int listc,
12d20 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 i;... BIO *ou
12d30 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 t=NULL;... ch
12d40 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 ar *k_C="",*k_ST
12d50 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f ="",*k_L="",*k_O
12d60 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f ="",*k_OU="",*k_
12d70 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 CN="",*k_Email="
12d80 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 ";.. char *ke
12d90 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 yout,*pemout,*st
12da0 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 r;.. int keys
12db0 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 ize,serial=0,day
12dc0 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e s=365;..#if OPEN
12dd0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
12de0 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
12df0 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e .. BIGNUM *bn
12e00 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 e = NULL;.. R
12e10 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a SA *rsa = NULL;.
12e20 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50 #else.. EVP_P
12e30 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e KEY_CTX *ctx = N
12e40 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 ULL;.#endif...
12e50 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c if ((objc<5) |
12e60 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 | (objc>6)) {...
12e70 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
12e80 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 (interp, 2, objv
12e90 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 , "keysize keyfi
12ea0 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 le certfile ?inf
12eb0 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 o?");...return T
12ec0 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
12ed0 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 ... if (Tcl_G
12ee0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 etIntFromObj(int
12ef0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b erp, objv[2], &k
12f00 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f eysize) != TCL_O
12f10 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 K) {...return TC
12f20 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
12f30 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f . keyout=Tcl_
12f40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 GetString(objv[3
12f50 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d ]);.. pemout=
12f60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
12f70 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 jv[4]);.. if
12f80 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f (isStr) {...Tcl_
12f90 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 SetVar(interp,ke
12fa0 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 yout,"",0);...Tc
12fb0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
12fc0 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 pemout,"",0);..
12fd0 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f }... if (o
12fe0 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 bjc>=6) {...if (
12ff0 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c Tcl_ListObjGetEl
13000 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f ements(interp, o
13010 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 6c 69 73 74 bjv[5],....&list
13020 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43 c, &listv) != TC
13030 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 L_OK) {... re
13040 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13050 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 ..}....if ((list
13060 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 c%2) != 0) {...
13070 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
13080 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 (interp,"Informa
13090 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 tion list must h
130a0 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 ave even number
130b0 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 of arguments",NU
130c0 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 LL);... retur
130d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
130e0 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c ...for (i=0; i<l
130f0 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 istc; i+=2) {...
13100 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 str=Tcl_GetS
13110 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b tring(listv[i]);
13120 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63 6d ... if (strcm
13130 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 p(str,"days")==0
13140 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 ) {....if (Tcl_G
13150 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 etIntFromObj(int
13160 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 erp,listv[i+1],&
13170 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 days)!=TCL_OK)..
13180 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
13190 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 _ERROR;... }
131a0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
131b0 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 str,"serial")==0
131c0 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 ) {....if (Tcl_G
131d0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 etIntFromObj(int
131e0 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 erp,listv[i+1],&
131f0 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 serial)!=TCL_OK)
13200 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 .... return T
13210 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 CL_ERROR;...
13220 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
13230 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b p(str,"C")==0) {
13240 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 ....k_C=Tcl_GetS
13250 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
13260 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
13270 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
13280 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f ST")==0) {....k_
13290 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ST=Tcl_GetString
132a0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
132b0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
132c0 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d trcmp(str,"L")==
132d0 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 0) {....k_L=Tcl_
132e0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
132f0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
13300 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
13310 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 tr,"O")==0) {...
13320 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 .k_O=Tcl_GetStri
13330 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
13340 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
13350 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 (strcmp(str,"OU"
13360 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d )==0) {....k_OU=
13370 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
13380 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
13390 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
133a0 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 mp(str,"CN")==0)
133b0 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 {....k_CN=Tcl_G
133c0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
133d0 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
133e0 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
133f0 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b r,"Email")==0) {
13400 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f ....k_Email=Tcl_
13410 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
13420 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
13430 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 lse {....Tcl_Set
13440 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 Result(interp,"U
13450 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 nknown parameter
13460 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 ",NULL);....retu
13470 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
13480 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d }...}.. }
13490 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
134a0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
134b0 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 x30000000L..
134c0 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a bne = BN_new();.
134d0 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e . rsa = RSA_n
134e0 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 ew();.. pkey
134f0 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 = EVP_PKEY_new()
13500 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d ;.. if (bne =
13510 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d = NULL || rsa ==
13520 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d NULL || pkey ==
13530 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 NULL || !BN_set
13540 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 _word(bne,RSA_F4
13550 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 ) ||...!RSA_gene
13560 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c rate_key_ex(rsa,
13570 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e keysize, bne, N
13580 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 ULL) || !EVP_PKE
13590 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 Y_assign_RSA(pke
135a0 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50 y, rsa)) {...EVP
135b0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
135c0 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 ;.../* RSA_free(
135d0 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45 rsa); freed by E
135e0 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a VP_PKEY_free */.
135f0 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a ..BN_free(bne);.
13600 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20 #else.. pkey
13610 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 = EVP_RSA_gen((u
13620 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 nsigned int) key
13630 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20 size);.. ctx
13640 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e = EVP_PKEY_CTX_n
13650 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 ew(pkey,NULL);..
13660 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 if (pkey ==
13670 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e NULL || ctx == N
13680 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 ULL || !EVP_PKEY
13690 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 _keygen_init(ctx
136a0 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 ) ||...!EVP_PKEY
136b0 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 _CTX_set_rsa_key
136c0 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 gen_bits(ctx, ke
136d0 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 ysize) || !EVP_P
136e0 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 KEY_keygen(ctx,
136f0 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f &pkey)) {...EVP_
13700 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
13710 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f ...EVP_PKEY_CTX_
13720 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 free(ctx);.#endi
13730 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c f...Tcl_SetResul
13740 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
13750 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 generating priva
13760 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 te key",NULL);..
13770 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
13780 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b R;.. } else {
13790 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a ...if (isStr) {.
137a0 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
137b0 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a w(BIO_s_mem());.
137c0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
137d0 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f bio_PrivateKey(o
137e0 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c ut,pkey,NULL,NUL
137f0 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a L,0,NULL,NULL);.
13800 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 .. i=BIO_read
13810 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 (out,buffer,size
13820 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 of(buffer)-1);..
13830 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 . i=(i<0) ? 0
13840 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 : i;... buff
13850 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 er[i]='\0';...
13860 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 Tcl_SetVar(int
13870 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 erp,keyout,buffe
13880 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f r,0);... BIO_
13890 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 flush(out);...
138a0 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b BIO_free(out);
138b0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 ...} else {...
138c0 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
138d0 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 O_s_file());...
138e0 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c BIO_write_fil
138f0 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 ename(out,keyout
13900 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 );... PEM_wri
13910 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 te_bio_PrivateKe
13920 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c y(out,pkey,NULL,
13930 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c NULL,0,NULL,NULL
13940 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f );... /* PEM_
13950 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 write_bio_RSAPri
13960 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 vateKey(out, rsa
13970 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c , NULL, NULL, 0,
13980 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f NULL, NULL); */
13990 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f ... BIO_free_
139a0 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a all(out);.. .}..
139b0 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 39 ..if ((cert=X509
139c0 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b _new())==NULL) {
139d0 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 ... Tcl_SetRe
139e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 sult(interp,"Err
139f0 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65 or generating ce
13a00 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65 73 rtificate reques
13a10 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 t",NULL);...
13a20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
13a30 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c ey);.#if OPENSSL
13a40 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
13a50 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 < 0x30000000L...
13a60 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 BN_free(bne)
13a70 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72 ;.#endif... r
13a80 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
13a90 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 ;...}....X509_se
13aa0 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 t_version(cert,2
13ab0 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 );...ASN1_INTEGE
13ac0 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 R_set(X509_get_s
13ad0 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 erialNumber(cert
13ae0 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 ),serial);...X50
13af0 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 9_gmtime_adj(X50
13b00 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 9_getm_notBefore
13b10 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 (cert),0);...X50
13b20 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 9_gmtime_adj(X50
13b30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 9_getm_notAfter(
13b40 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 cert),(long)60*6
13b50 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 0*24*days);...X5
13b60 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 09_set_pubkey(ce
13b70 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d rt,pkey);....nam
13b80 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 e=X509_get_subje
13b90 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a ct_name(cert);..
13ba0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
13bb0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
13bc0 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f e,"C", MBSTRING_
13bd0 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
13be0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 gned char *) k_C
13bf0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
13c00 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
13c10 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
13c20 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 "ST", MBSTRING_A
13c30 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
13c40 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 ned char *) k_ST
13c50 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
13c60 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
13c70 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
13c80 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 "L", MBSTRING_AS
13c90 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
13ca0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 ed char *) k_L,
13cb0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
13cc0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
13cd0 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f y_by_txt(name,"O
13ce0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
13cf0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
13d00 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 char *) k_O, -1
13d10 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
13d20 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
13d30 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 by_txt(name,"OU"
13d40 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
13d50 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
13d60 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 char *) k_OU, -1
13d70 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
13d80 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
13d90 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 by_txt(name,"CN"
13da0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
13db0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
13dc0 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 char *) k_CN, -1
13dd0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
13de0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
13df0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 by_txt(name,"Ema
13e00 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 il", MBSTRING_AS
13e10 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
13e20 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 ed char *) k_Ema
13e30 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a il, -1, -1, 0);.
13e40 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a ...X509_set_subj
13e50 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 ect_name(cert,na
13e60 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 me);....if (!X50
13e70 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 9_sign(cert,pkey
13e80 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 20 ,EVP_sha256()))
13e90 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 65 {... X509_fre
13ea0 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45 e(cert);... E
13eb0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 VP_PKEY_free(pke
13ec0 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f y);.#if OPENSSL_
13ed0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
13ee0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 0x30000000L...
13ef0 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b BN_free(bne);
13f00 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63 .#endif... Tc
13f10 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
13f20 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e rp,"Error signin
13f30 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e g certificate",N
13f40 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 ULL);... retu
13f50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
13f60 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 }....if (isStr)
13f70 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f {... out=BIO_
13f80 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 new(BIO_s_mem())
13f90 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 ;... PEM_writ
13fa0 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 e_bio_X509(out,c
13fb0 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 ert);... i=BI
13fc0 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 O_read(out,buffe
13fd0 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 r,sizeof(buffer)
13fe0 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c -1);... i=(i<
13ff0 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 0) ? 0 : i;...
14000 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 buffer[i]='\0'
14010 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 ;... Tcl_SetV
14020 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 ar(interp,pemout
14030 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 ,buffer,0);...
14040 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 BIO_flush(out)
14050 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 ;... BIO_free
14060 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 (out);...} else
14070 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f {... out=BIO_
14080 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 new(BIO_s_file()
14090 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 );... BIO_wri
140a0 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c te_filename(out,
140b0 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 pemout);... P
140c0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 EM_write_bio_X50
140d0 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 9(out,cert);...
140e0 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 BIO_free_all(
140f0 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 out);...}....X50
14100 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 9_free(cert);...
14110 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
14120 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c ey);.#if OPENSSL
14130 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
14140 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 < 0x30000000L...
14150 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
14160 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 ndif.. }..}..
14170 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 break;. defau
14180 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 lt:..break;.
14190 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c }. return TCL
141a0 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 _OK;..clientData
141b0 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d = clientData;.}
141c0 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
141d0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 ********/./* Ini
141e0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f t */
141f0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
14200 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d ******/../*. *--
14210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14250 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 -. *. * Tls_Free
14260 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
14270 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 rocedure cleans
14280 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f up when a SSL so
14290 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e cket based chann
142a0 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 el. *.is closed
142b0 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 and its referenc
142c0 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 e count falls be
142d0 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 low 1. *. * Resu
142e0 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a lts:. *.none. *.
142f0 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
14300 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 . *.Frees all th
14310 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d e state. *. *---
14320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14360 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 . */.void.Tls_Fr
14370 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 ee(char *blockPt
14380 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a r) {. State *
14390 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
143a0 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 e *)blockPtr;..
143b0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
143c0 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 ed");.. Tls_C
143d0 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a lean(statePtr);.
143e0 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b ckfree(block
143f0 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Ptr);.}.../*. *-
14400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14440 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 --. *. * Tls_Cle
14450 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 an --. *. *.This
14460 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e procedure clean
14470 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 s up when a SSL
14480 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 socket based cha
14490 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 nnel. *.is close
144a0 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 d and its refere
144b0 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 nce count falls
144c0 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 below 1. This s
144d0 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c hould. *.be call
144e0 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 ed synchronously
144f0 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f by the ClosePro
14500 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a c, not in the. *
14510 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 .EventuallyFree
14520 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 callback.. *. *
14530 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 Results:. *.none
14540 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
14550 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c cts:. *.Frees al
14560 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 l the state. *.
14570 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
14580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145b0 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c ----. */.void Tl
145c0 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 s_Clean(State *s
145d0 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 tatePtr) {. d
145e0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
145f0 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
14600 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 we're assuming
14610 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20 here that we're
14620 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a single-threaded.
14630 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 */. if (
14640 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
14650 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b != (Tcl_TimerTok
14660 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c en) NULL) {..Tcl
14670 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 _DeleteTimerHand
14680 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 ler(statePtr->ti
14690 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d mer);..statePtr-
146a0 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 >timer = NULL;.
146b0 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
146c0 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 atePtr->protos)
146d0 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50 {..ckfree(stateP
146e0 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 tr->protos);..st
146f0 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d atePtr->protos =
14700 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
14710 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 if (statePtr->b
14720 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 io) {../* This w
14730 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 ill call SSL_shu
14740 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 tdown. Bug 14140
14750 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 45 */..dprintf("
14760 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 BIO_free_all(%p)
14770 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ", statePtr->bio
14780 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c );..BIO_free_all
14790 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b (statePtr->bio);
147a0 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 ..statePtr->bio
147b0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
147c0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
147d0 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 ssl) {..dprintf(
147e0 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 "SSL_free(%p)",
147f0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
14800 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 .SSL_free(stateP
14810 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 tr->ssl);..state
14820 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b Ptr->ssl = NULL;
14830 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
14840 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a tatePtr->ctx) {.
14850 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 .SSL_CTX_free(st
14860 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 atePtr->ctx);..s
14870 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e tatePtr->ctx = N
14880 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
14890 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
148a0 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 lback) {..Tcl_De
148b0 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
148c0 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
148d0 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 .statePtr->callb
148e0 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ack = NULL;.
148f0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
14900 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a tr->password) {.
14910 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
14920 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 t(statePtr->pass
14930 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 word);..statePtr
14940 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c ->password = NUL
14950 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
14960 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
14970 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {..Tcl_DecrRefC
14980 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 ount(statePtr->v
14990 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d cmd);..statePtr-
149a0 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 >vcmd = NULL;.
149b0 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
149c0 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d ("Returning");.}
149d0 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
149e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
149f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
14a20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a * Tls_Init --. *
14a30 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 . *.This is a pa
14a40 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 ckage initializa
14a50 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 tion procedure,
14a60 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a which is called.
14a70 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 *.by Tcl when t
14a80 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 his package is t
14a90 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e o be added to an
14aa0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a interpreter.. *
14ab0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 . * Results: Ss
14ac0 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 l configured and
14ad0 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 loaded. *. * Si
14ae0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 de effects:. *.
14af0 63 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 create the ssl c
14b00 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 ommand, initiali
14b10 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 ze ssl context.
14b20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
14b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b60 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 -------. */.DLLE
14b70 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e XPORT int Tls_In
14b80 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 it(Tcl_Interp *i
14b90 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e nterp) {. con
14ba0 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e st char tlsTclIn
14bb0 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 itScript[] = {.#
14bc0 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c include "tls.tcl
14bd0 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b .h"..0x00. };
14be0 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
14bf0 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 54 43 alled");..#if TC
14c00 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
14c10 3e 20 38 0a 23 69 66 64 65 66 20 55 53 45 5f 54 > 8.#ifdef USE_T
14c20 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20 CL_STUBS. if
14c30 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 (Tcl_InitStubs(i
14c40 6e 74 65 72 70 2c 20 22 39 2e 30 22 2c 20 30 29 nterp, "9.0", 0)
14c50 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
14c60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
14c70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 }.#endif.
14c80 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 if (Tcl_PkgRequi
14c90 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 re(interp, "Tcl"
14ca0 2c 20 22 39 2e 30 2d 22 2c 20 30 29 20 3d 3d 20 , "9.0-", 0) ==
14cb0 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
14cc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
14cd0 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 55 53 .#else.#ifdef US
14ce0 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 E_TCL_STUBS.
14cf0 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 if (Tcl_InitStub
14d00 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 35 22 2c s(interp, "8.5",
14d10 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 0) == NULL) {..
14d20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
14d30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 ;. }.#endif.
14d40 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 if (Tcl_PkgRe
14d50 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 quire(interp, "T
14d60 63 6c 22 2c 20 22 38 2e 35 2d 22 2c 20 30 29 20 cl", "8.5-", 0)
14d70 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
14d80 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
14d90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 }.#endif..
14da0 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 if (TlsLibInit(0
14db0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
14dc0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
14dd0 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 (interp, "could
14de0 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 not initialize S
14df0 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 4e 55 4c SL library", NUL
14e00 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
14e10 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
14e20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
14e30 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
14e40 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 tls::ciphers", C
14e50 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 iphersObjCmd, (C
14e60 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
14e70 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
14e80 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
14e90 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
14ea0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
14eb0 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 ::connection", C
14ec0 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a onnectionInfoObj
14ed0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
14ee0 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
14ef0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
14f00 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
14f10 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
14f20 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 p, "tls::handsha
14f30 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 ke", HandshakeOb
14f40 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
14f50 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
14f60 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
14f70 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
14f80 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
14f90 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 rp, "tls::import
14fa0 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c ", ImportObjCmd,
14fb0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
14fc0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
14fd0 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
14fe0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
14ff0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
15000 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 tls::unimport",
15010 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 UnimportObjCmd,
15020 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
15030 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
15040 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
15050 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
15060 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
15070 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 ls::status", Sta
15080 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 tusObjCmd, (Clie
15090 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
150a0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
150b0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
150c0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
150d0 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 (interp, "tls::v
150e0 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e ersion", Version
150f0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
15100 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
15110 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
15120 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
15130 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
15140 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 terp, "tls::misc
15150 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 ", MiscObjCmd, (
15160 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
15170 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
15180 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
15190 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
151a0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
151b0 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 s::protocols", P
151c0 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 rotocolsObjCmd,
151d0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
151e0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
151f0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 oc *) NULL);..
15200 20 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a if (interp) {.
15210 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 .Tcl_Eval(interp
15220 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 , tlsTclInitScri
15230 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 pt);. }..
15240 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 return Tcl_PkgPr
15250 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50 41 ovide(interp, PA
15260 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b CKAGE_NAME, PACK
15270 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a AGE_VERSION);.}.
15280 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
15290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
152a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
152b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
152c0 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 . *.Tls_SafeInit
152d0 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d --. *. *.------
152e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
152f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 ----------*. *.S
15310 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 tandard procedur
15320 65 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c e required by 'l
15330 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c oad'.. *.Initial
15340 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 izes this extens
15350 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 ion for a safe i
15360 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d nterpreter.. *.-
15370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
153a0 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 . *. *.Side effe
153b0 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 cts:. *..As of '
153c0 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 Tls_Init'. *. *.
153d0 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 Result:. *..A st
153e0 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 andard Tcl error
153f0 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d code.. *. *----
15400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15430 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 --*. */.DLLEXPOR
15440 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e T int Tls_SafeIn
15450 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 it(Tcl_Interp *i
15460 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 nterp) {. dpr
15470 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
15480 20 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 return(Tls_I
15490 6e 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a nit(interp));.}.
154a0 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
154e0 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d . *.TlsLibInit -
154f0 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d -. *. *.--------
15500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15520 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 --------*. *.Ini
15530 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 tializes SSL lib
15540 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 rary once per ap
15550 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d plication. *.---
15560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
15590 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 *. *.Side effect
155a0 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a s:. *..initializ
155b0 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 es SSL library.
155c0 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 *. *.Result:. *.
155d0 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .none. *. *-----
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 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e -*. */.static in
15620 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 t TlsLibInit(int
15630 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b uninitialize) {
15640 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 . static int
15650 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b initialized = 0;
15660 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 . int status
15670 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 = TCL_OK;.#if de
15680 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
15690 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
156a0 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 d(TCL_THREADS).
156b0 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f size_t num_lo
156c0 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 cks;.#endif..
156d0 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a if (uninitializ
156e0 65 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 e) {..if (!initi
156f0 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 alized) {.. d
15700 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f printf("Asked to
15710 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 uninitialize, b
15720 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e ut we are not in
15730 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 itialized");...
15740 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b return(TCL_OK
15750 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 );..}...dprintf(
15760 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 "Asked to uninit
15770 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 ialize");..#if d
15780 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
15790 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
157a0 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
157b0 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 .Tcl_MutexLock(&
157c0 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 init_mx);...if (
157d0 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 locks) {.. fr
157e0 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 ee(locks);..
157f0 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 locks = NULL;..
15800 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 locksCount =
15810 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 0;..}.#endif..in
15820 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a itialized = 0;..
15830 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
15840 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
15850 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
15860 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 ADS)..Tcl_MutexU
15870 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b nlock(&init_mx);
15880 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e .#endif...return
15890 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a (TCL_OK);. }.
158a0 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c . if (initial
158b0 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 ized) {..dprintf
158c0 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 ("Called, but us
158d0 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 ing cached value
158e0 22 29 3b 0a 09 72 65 74 75 72 6e 28 73 74 61 74 ");..return(stat
158f0 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 us);. }..
15900 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
15910 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 );..#if defined(
15920 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
15930 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
15940 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c THREADS). Tcl
15950 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 _MutexLock(&init
15960 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 _mx);.#endif.
15970 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 initialized = 1
15980 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
15990 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
159a0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
159b0 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f HREADS). num_
159c0 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c locks = 1;. l
159d0 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 ocksCount = (int
159e0 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 ) num_locks;.
159f0 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 locks = malloc(
15a00 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a sizeof(*locks) *
15a10 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 num_locks);.
15a20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 memset(locks, 0
15a30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 , sizeof(*locks)
15a40 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 * num_locks);.#
15a50 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e endif.. /* In
15a60 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 itialize BOTH li
15a70 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 bcrypto and libs
15a80 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 sl. */. OPENS
15a90 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e SL_init_ssl(OPEN
15aa0 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 SSL_INIT_LOAD_SS
15ab0 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e L_STRINGS | OPEN
15ac0 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 SSL_INIT_LOAD_CR
15ad0 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 YPTO_STRINGS..|
15ae0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 OPENSSL_INIT_ADD
15af0 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f _ALL_CIPHERS | O
15b00 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f PENSSL_INIT_ADD_
15b10 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c ALL_DIGESTS, NUL
15b20 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 L);.. BIO_new
15b30 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a _tcl(NULL, 0);..
15b40 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 #if 0. /*.
15b50 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 * XXX:TODO: Re
15b60 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 move this code a
15b70 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 nd replace it wi
15b80 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 th a check.
15b90 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 * for enough ent
15ba0 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 ropy and do not
15bb0 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 try to create ou
15bc0 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 r own. * ter
15bd0 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 rible entropy.
15be0 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 */. /*.
15bf0 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e * Seed the ran
15c00 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 dom number gener
15c10 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 ator in the SSL
15c20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 library,. *
15c30 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 using the do/whi
15c40 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 le construct bec
15c50 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 ause of the bug
15c60 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 note in the.
15c70 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 * OpenSSL FAQ a
15c80 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 t http://www.ope
15c90 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 nssl.org/support
15ca0 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a /faq.html#USER1.
15cb0 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 *. * Th
15cc0 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 e crux of the pr
15cd0 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f oblem is that So
15ce0 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 laris 7 does not
15cf0 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f have a. * /
15d00 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 dev/random or /d
15d10 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 ev/urandom devic
15d20 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 e so it cannot g
15d30 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 ather enough.
15d40 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d * entropy from
15d50 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 the RAND_seed()
15d60 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 when TLS initia
15d70 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 lizes and refuse
15d80 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 s. * to go f
15d90 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 urther. Earlier
15da0 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e versions of Open
15db0 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 SSL carried on r
15dc0 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 egardless..
15dd0 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e */. srand((un
15de0 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 signed int) time
15df0 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c ((time_t *) NULL
15e00 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f ));. do {..fo
15e10 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 r (i = 0; i < 16
15e20 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e ; i++) {.. rn
15e30 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 d_seed[i] = 1 +
15e40 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 (char) (255.0 *
15e50 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 rand()/(RAND_MAX
15e60 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 +1.0));..}..RAND
15e70 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 _seed(rnd_seed,
15e80 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 sizeof(rnd_seed)
15e90 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 );. } while (
15ea0 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d RAND_status() !=
15eb0 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 1);.#endif..#if
15ec0 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
15ed0 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
15ee0 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
15ef0 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f )..Tcl_MutexUnlo
15f00 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 ck(&init_mx);.#e
15f10 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 73 74 ndif...return(st
15f20 61 74 75 73 29 3b 0a 7d 0a atus);.}.