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 28 54 63 6c 5f 53 69 7a 65 20 2a rp), (Tcl_Size *
3240: 29 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 )NULL)) != NULL)
3250: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
3260: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3270: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3280: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 _NewStringObj(ms
3290: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 g, -1));.. }
32a0: 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 20 else {..listPtr
32b0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
32c0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c (0, NULL);..whil
32d0: 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 65 e ((err = ERR_ge
32e0: 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 29 t_error()) != 0)
32f0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
3300: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3310: 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 (interp, listPtr
3320: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
3330: 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 bj(ERR_reason_er
3340: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c ror_string(err),
3350: 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c -1));..}..Tcl_L
3360: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3370: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3380: 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 tr, listPtr);.
3390: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c }.. /* Eval
33a0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
33b0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
33c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
33d0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 );. EvalCallb
33e0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
33f0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 ePtr, cmdPtr);.
3400: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
3410: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c unt(cmdPtr);.}..
3420: 0a 2f 2a 0a 20 2a 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 2d 2d 2d ----------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
3470: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d KeyLogCallback -
3480: 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 -. *. *.Write re
3490: 63 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 20 ceived key data
34a0: 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a to log file.. *.
34b0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
34c0: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d . *.none. *. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3510: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f -. */.void KeyLo
3520: 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 gCallback(const
3530: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 SSL *ssl, const
3540: 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 char *line) {.
3550: 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67 65 char *str = ge
3560: 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 tenv(SSLKEYLOGFI
3570: 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66 LE);. FILE *f
3580: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 d;.. dprintf(
3590: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
35a0: 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d if (str) {..fd =
35b0: 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 fopen(str, "a")
35c0: 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 ;..fprintf(fd, "
35d0: 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 %s\n",line);..fc
35e0: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a lose(fd);. }.
35f0: 7d 0a 0c 0a 2f 2a 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
3640: 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c * Password Call
3650: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 back --. *. *.Ca
3660: 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 lled when a pass
3670: 77 6f 72 64 20 66 6f 72 20 61 20 70 72 69 76 61 word for a priva
3680: 74 65 20 6b 65 79 20 6c 6f 61 64 69 6e 67 2f 73 te key loading/s
3690: 74 6f 72 69 6e 67 20 61 20 50 45 4d 0a 20 2a 09 toring a PEM. *.
36a0: 63 65 72 74 69 66 69 63 61 74 65 20 77 69 74 68 certificate with
36b0: 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 encryption. Eva
36c0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 ls callback scri
36d0: 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 pt and returns.
36e0: 2a 09 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 *.the result as
36f0: 74 68 65 20 70 61 73 73 77 6f 72 64 20 73 74 72 the password str
3700: 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 ing in buf.. *.
3710: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
3720: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
3730: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
3740: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
3750: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 ined). *. * Retu
3760: 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 rns:. *.Password
3770: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f size in bytes o
3780: 72 20 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f r -1 for an erro
3790: 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d r.. *. *--------
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 2d ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
37e0: 73 74 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 static int.Passw
37f0: 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 ordCallback(char
3800: 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c *buf, int size,
3810: 20 69 6e 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 int rwflag, voi
3820: 64 20 2a 75 64 61 74 61 29 20 7b 0a 20 20 20 20 d *udata) {.
3830: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 State *statePtr.
3840: 3d 20 28 53 74 61 74 65 20 2a 29 20 75 64 61 74 = (State *) udat
3850: 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 a;. Tcl_Inter
3860: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
3870: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
3880: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
3890: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b r;. int code;
38a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
38b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
38c0: 20 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c If no callback,
38d0: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c use default cal
38e0: 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 lback */. if
38f0: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
3900: 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ord == NULL) {..
3910: 69 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 if (Tcl_EvalEx(i
3920: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 nterp, "tls::pas
3930: 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f sword", -1, TCL_
3940: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 EVAL_GLOBAL) ==
3950: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 TCL_OK) {.. c
3960: 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 har *ret = (char
3970: 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e *) Tcl_GetStrin
3980: 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b gResult(interp);
3990: 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 .. strncpy(bu
39a0: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 f, ret, (size_t)
39b0: 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 size);.. ret
39c0: 75 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 urn (int)strlen(
39d0: 72 65 74 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a ret);..} else {.
39e0: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a . return -1;.
39f0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
3a00: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 Create command
3a10: 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 to eval */. c
3a20: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
3a30: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
3a40: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 20 r->password);.
3a50: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
3a60: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3a70: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
3a80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 73 ewStringObj("pas
3a90: 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20 sword", -1));.
3aa0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
3ab0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3ac0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
3ad0: 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29 ewIntObj(rwflag)
3ae0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
3af0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3b00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3b10: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69 Tcl_NewIntObj(si
3b20: 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 ze));.. Tcl_P
3b30: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
3b40: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
3b50: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
3b60: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
3b70: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 ePtr);.. /* E
3b80: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d val callback com
3b90: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f mand */. Tcl_
3ba0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
3bb0: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d Ptr);. code =
3bc0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 Tcl_EvalObjEx(i
3bd0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3be0: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b CL_EVAL_GLOBAL);
3bf0: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d . if (code !=
3c00: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 TCL_OK) {.#if (
3c10: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
3c20: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f N == 8) && (TCL_
3c30: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 MINOR_VERSION <
3c40: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6)..Tcl_Backgrou
3c50: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ndError(interp);
3c60: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b .#else..Tcl_Back
3c70: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 groundException(
3c80: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 interp, code);.#
3c90: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 endif. }.
3ca0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
3cb0: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 (cmdPtr);.. T
3cc0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
3cd0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
3ce0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 );.. /* If su
3cf0: 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 62 ccessful, pass b
3d00: 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 72 ack password str
3d10: 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 65 ing and truncate
3d20: 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a if too long */.
3d30: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 if (code ==
3d40: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 TCL_OK) {..Tcl_S
3d50: 69 7a 65 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a ize len;..char *
3d60: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 ret = (char *) T
3d70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
3d80: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 Obj(Tcl_GetObjRe
3d90: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c sult(interp), &l
3da0: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 en);..if (len >
3db0: 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d (Tcl_Size) size-
3dc0: 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 1) {.. len =
3dd0: 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d (Tcl_Size) size-
3de0: 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28 62 1;..}..strncpy(b
3df0: 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 uf, ret, (size_t
3e00: 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65 6e ) len);..buf[len
3e10: 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f 52 ] = '\0';..Tcl_R
3e20: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
3e30: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 72 65 ta) interp);..re
3e40: 74 75 72 6e 28 28 69 6e 74 29 20 6c 65 6e 29 3b turn((int) len);
3e50: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 . }. Tcl_R
3e60: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
3e70: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 ta) interp);.
3e80: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a return -1;.}...
3e90: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 --------. *. * S
3ee0: 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 ession Callback
3ef0: 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 for Clients --.
3f00: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e *. *.Called when
3f10: 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 69 a new session i
3f20: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 s added to the c
3f30: 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33 ache. In TLS 1.3
3f40: 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20 . *.this may be
3f50: 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c received multipl
3f60: 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 68 e times after th
3f70: 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72 e handshake. For
3f80: 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73 . *.earlier vers
3f90: 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 ions, this will
3fa0: 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 69 be received duri
3fb0: 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 ng the handshake
3fc0: 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 65 .. *.This is the
3fd0: 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20 74 preferred way t
3fe0: 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 6d o obtain a resum
3ff0: 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a able session.. *
4000: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
4010: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
4020: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
4030: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
4040: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 efined). *. * Re
4050: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30 turn codes:. *.0
4060: 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 73 = error where s
4070: 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69 ession will be i
4080: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f 76 mmediately remov
4090: 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 ed from the inte
40a0: 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31 rnal cache.. *.1
40b0: 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 65 = success where
40c0: 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 73 app retains ses
40d0: 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20 sion in session
40e0: 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 20 cache, and must
40f0: 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e call SSL_SESSION
4100: 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f 6e _free() when don
4110: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
4160: 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 69 static int.Sessi
4170: 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 onCallback(const
4180: 20 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 SSL *ssl, SSL_S
4190: 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 ESSION *session)
41a0: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
41b0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a atePtr = (State*
41c0: 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 )SSL_get_app_dat
41d0: 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 a((SSL *)ssl);.
41e0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
41f0: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
4200: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
4210: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
4220: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 const unsigne
4230: 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a d char *ticket;.
4240: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
4250: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
4260: 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 _id;. size_t
4270: 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e len2;. unsign
4280: 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 ed int ulen;..
4290: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
42a0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
42b0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
42c0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
42d0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
42e0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
42f0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
4300: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ssl == NULL) {..
4310: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
4320: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
4330: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
4340: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
4350: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 l */. cmdPtr
4360: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
4370: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
4380: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f lback);. Tcl_
4390: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
43a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
43b0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
43c0: 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c ngObj("session",
43d0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
43e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
43f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4400: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
4410: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 StringObj(Tcl_Ge
4420: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
4430: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
4440: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 ));.. /* Sess
4450: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 ion id */. se
4460: 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 ssion_id = SSL_S
4470: 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 ESSION_get_id(se
4480: 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 ssion, &ulen);.
4490: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
44a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
44b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
44c0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
44d0: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c session_id, (Tcl
44e0: 5f 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a _Size) ulen));..
44f0: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 /* Session t
4500: 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c icket */. SSL
4510: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 _SESSION_get0_ti
4520: 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 cket(session, &t
4530: 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 icket, &len2);.
4540: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4550: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4560: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
4570: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
4580: 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a ticket, (Tcl_Siz
4590: 65 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 e) len2));..
45a0: 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 /* Lifetime - nu
45b0: 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 mber of seconds
45c0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f */. Tcl_ListO
45d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
45e0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
45f0: 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 .Tcl_NewLongObj(
4600: 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 (long) SSL_SESSI
4610: 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 ON_get_ticket_li
4620: 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 fetime_hint(sess
4630: 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 ion)));.. /*
4640: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
4650: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
4660: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
4670: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 dPtr);. EvalC
4680: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
4690: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
46a0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
46b0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
46c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d . return 0;.}
46d0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
4720: 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 * ALPN Callback
4730: 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e 64 20 for Servers and
4740: 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 NPN Callback for
4750: 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 Clients --. *.
4760: 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 *.Perform protoc
4770: 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 ol (http/1.1, h2
4780: 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 , h3, etc.) sele
4790: 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a ction for the. *
47a0: 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 .incoming connec
47b0: 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 tion. Called aft
47c0: 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 er Hello and ser
47d0: 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 ver callbacks..
47e0: 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20 69 73 *.Where 'out' is
47f0: 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 selected protoc
4800: 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74 ol and 'in' is t
4810: 68 65 20 70 65 65 72 20 61 64 76 65 72 74 69 73 he peer advertis
4820: 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 ed list.. *. * R
4830: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
4840: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
4850: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
4860: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
4870: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 d). *. * Return
4880: 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c codes:. *.SSL_TL
4890: 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 SEXT_ERR_OK: ALP
48a0: 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 N protocol selec
48b0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
48c0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
48d0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
48e0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 _ALERT_FATAL: Th
48f0: 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c ere was no overl
4900: 61 70 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 ap between the c
4910: 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 lient's. *. s
4920: 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 upplied list and
4930: 20 74 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 the server conf
4940: 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 iguration. The c
4950: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 onnection will b
4960: 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 e aborted.. *.SS
4970: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
4980: 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f CK: ALPN protoco
4990: 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 l not selected,
49a0: 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f e.g., because no
49b0: 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f ALPN. *. pro
49c0: 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 tocols are confi
49d0: 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 gured for this c
49e0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 onnection. The c
49f0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
4a00: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ues.. *. *------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 /.static int.ALP
4a60: 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 NCallback(const
4a70: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 SSL *ssl, const
4a80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a unsigned char **
4a90: 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 out, unsigned ch
4aa0: 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e ar *outlen,..con
4ab0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
4ac0: 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 *in, unsigned i
4ad0: 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a nt inlen, void *
4ae0: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 arg) {. State
4af0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
4b00: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 ate*)arg;. Tc
4b10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
4b20: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
4b30: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
4b40: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e *cmdPtr;. in
4b50: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 t code, res;..
4b60: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
4b70: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 d");.. if (ss
4b80: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 l == NULL || arg
4b90: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
4ba0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
4bb0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
4bc0: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 70 . /* Select p
4bd0: 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 rotocol */. i
4be0: 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 f (SSL_select_ne
4bf0: 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20 6f 75 xt_proto(out, ou
4c00: 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e tlen, statePtr->
4c10: 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 74 72 protos, statePtr
4c20: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 ->protos_len,..i
4c30: 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 n, inlen) == OPE
4c40: 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 NSSL_NPN_NEGOTIA
4c50: 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74 63 68 TED) {../* Match
4c60: 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73 20 3d found */..res =
4c70: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
4c80: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b OK;. } else {
4c90: 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e ../* OPENSSL_NPN
4ca0: 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20 4e 6f _NO_OVERLAP = No
4cb0: 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75 73 65 overlap, so use
4cc0: 20 66 69 72 73 74 20 69 74 65 6d 20 66 72 6f 6d first item from
4cd0: 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c client protocol
4ce0: 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20 3d 20 list */..res =
4cf0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
4d00: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 OACK;. }..
4d10: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
4d20: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a cmd == (Tcl_Obj*
4d30: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
4d40: 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 res;. }..
4d50: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
4d60: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
4d70: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
4d80: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
4d90: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
4da0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4db0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4dc0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4dd0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e wStringObj("alpn
4de0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
4df0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4e00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4e10: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
4e20: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
4e30: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
4e40: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
4e50: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
4e60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4e70: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4e80: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4e90: 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a Obj(*out, -1));.
4ea0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4eb0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4ec0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
4ed0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 _NewBooleanObj(r
4ee0: 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54 es == SSL_TLSEXT
4ef0: 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20 _ERR_OK));..
4f00: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
4f10: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
4f20: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
4f30: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 (cmdPtr);. if
4f40: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 ((code = EvalCa
4f50: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 llback(interp, s
4f60: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 tatePtr, cmdPtr)
4f70: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 ) > 1) {..res =
4f80: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
4f90: 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 OACK;. } else
4fa0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
4fb0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
4fc0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
4fd0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
4fe0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
4ff0: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20 LERT_FATAL;.
5000: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 }. Tcl_DecrRe
5010: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
5020: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a return res;.
5030: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
5080: 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f * Advertise Pro
5090: 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20 tocols Callback
50a0: 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f for Next Protoco
50b0: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e l Negotiation (N
50c0: 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c PN) in ServerHel
50d0: 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c lo --. *. *.call
50e0: 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65 ed when a TLS se
50f0: 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73 rver needs a lis
5100: 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70 t of supported p
5110: 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78 rotocols for Nex
5120: 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 t. *.Protocol Ne
5130: 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a gotiation.. *. *
5140: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
5150: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
5160: 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 ects:. *. * Retu
5170: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c rn codes:. *.SSL
5180: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 _TLSEXT_ERR_OK:
5190: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c NPN protocol sel
51a0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 ected. The conne
51b0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
51c0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
51d0: 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 RR_NOACK: NPN pr
51e0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 otocol not selec
51f0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
5200: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
5210: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 -------. */.#ifd
5260: 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69 ef USE_NPN.stati
5270: 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 c int.NPNCallbac
5280: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
5290: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 , const unsigned
52a0: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 char **out, uns
52b0: 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65 igned int *outle
52c0: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a n, void *arg) {.
52d0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
52e0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
52f0: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 g;.. dprintf(
5300: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
5310: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 if (ssl == NULL
5320: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 || arg == NULL)
5330: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
5340: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
5350: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
5360: 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 t protocols list
5370: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
5380: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
5390: 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 NULL) {..*out =
53a0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
53b0: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61 ;..*outlen = sta
53c0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 tePtr->protos_le
53d0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a n;. } else {.
53e0: 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a .*out = NULL;..*
53f0: 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74 outlen = 0;..ret
5400: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
5410: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
5420: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 return SSL_T
5430: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a LSEXT_ERR_OK;.}.
5440: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d #endif.../*. *--
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5490: 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c -. *. * SNI Call
54a0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 back for Servers
54b0: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 --. *. *.Perfor
54c0: 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e m server-side SN
54d0: 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 I hostname selec
54e0: 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69 tion after recei
54f0: 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69 ving SNI extensi
5500: 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20 on. *.in Client
5510: 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66 Hello. Called af
5520: 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 ter hello callba
5530: 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c ck but before AL
5540: 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a PN callback.. *.
5550: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
5560: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
5570: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
5580: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
5590: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
55a0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
55b0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a L_TLSEXT_ERR_OK:
55c0: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 SNI hostname is
55d0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 accepted. The c
55e0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
55f0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ues.. *.SSL_TLSE
5600: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 XT_ERR_ALERT_FAT
5610: 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 AL: SNI hostname
5620: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 is not accepted
5630: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
5640: 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 . *. is abort
5650: 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 ed. Default for
5660: 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f alert is SSL_AD_
5670: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d UNRECOGNIZED_NAM
5680: 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 E.. *.SSL_TLSEXT
5690: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 _ERR_ALERT_WARNI
56a0: 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 NG: SNI hostname
56b0: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 is not accepted
56c0: 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a , warning alert.
56d0: 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 *. sent (not
56e0: 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c supported in TL
56f0: 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e Sv1.3). The conn
5700: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
5710: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
5720: 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 ERR_NOACK: SNI h
5730: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 ostname is not a
5740: 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 ccepted and not
5750: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a acknowledged,. *
5760: 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 . e.g. if SNI
5770: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f has not been co
5780: 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f nfigured. The co
5790: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
57a0: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d es.. *. *-------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
57f0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 .static int.SNIC
5800: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
5810: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
5820: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
5830: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
5840: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
5850: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
5860: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
5870: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
5880: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
5890: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
58a0: 2c 20 72 65 73 3b 0a 20 20 20 20 63 68 61 72 20 , res;. char
58b0: 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 *servername = NU
58c0: 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 LL;.. dprintf
58d0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
58e0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
58f0: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 || arg == NULL)
5900: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
5910: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
5920: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f . }.. /* O
5930: 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c nly works for TL
5940: 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c 69 65 S 1.2 and earlie
5950: 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65 72 6e r */. servern
5960: 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 ame = SSL_get_se
5970: 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c rvername(ssl, TL
5980: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f SEXT_NAMETYPE_ho
5990: 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 st_name);. if
59a0: 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c (!servername ||
59b0: 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d servername[0] =
59c0: 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74 75 72 = '\0') {..retur
59d0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
59e0: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
59f0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
5a00: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 >vcmd == (Tcl_Ob
5a10: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 j*)NULL) {..retu
5a20: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
5a30: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 R_OK;. }..
5a40: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
5a50: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
5a60: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
5a70: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
5a80: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
5a90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5aa0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5ab0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
5ac0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 wStringObj("sni"
5ad0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
5ae0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5af0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5b00: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
5b10: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
5b20: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
5b30: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
5b40: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
5b50: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
5b60: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
5b70: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
5b80: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 bj(servername ,
5b90: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 -1));.. /* Ev
5ba0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
5bb0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
5bc0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
5bd0: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f tr);. if ((co
5be0: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 de = EvalCallbac
5bf0: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
5c00: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 tr, cmdPtr)) > 1
5c10: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 ) {..res = SSL_T
5c20: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
5c30: 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 WARNING;..*alert
5c40: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f = SSL_AD_UNRECO
5c50: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 GNIZED_NAME; /*
5c60: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 Not supported by
5c70: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 TLS 1.3 */.
5c80: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
5c90: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
5ca0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
5cb0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
5cc0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
5cd0: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
5ce0: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f ;..*alert = SSL_
5cf0: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f AD_UNRECOGNIZED_
5d00: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 NAME; /* Not sup
5d10: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e ported by TLS 1.
5d20: 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 3 */. }. T
5d30: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
5d40: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
5d50: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a urn res;.}.../*.
5d60: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5da0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 -----. *. * Clie
5db0: 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b ntHello Handshak
5dc0: 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 e Callback for S
5dd0: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 ervers --. *. *.
5de0: 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74 Used by server t
5df0: 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65 o examine the se
5e00: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 rver name indica
5e10: 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e tion (SNI) exten
5e20: 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 sion. *.provided
5e30: 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69 by the client i
5e40: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63 n order to selec
5e50: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 t an appropriate
5e60: 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a certificate to.
5e70: 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 *.present, and
5e80: 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 make other confi
5e90: 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d guration adjustm
5ea0: 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f ents relevant to
5eb0: 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09 that server. *.
5ec0: 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e name and its con
5ed0: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 figuration. This
5ee0: 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69 includes swappi
5ef0: 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 ng out the assoc
5f00: 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 iated. *.SSL_CTX
5f10: 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 pointer, modify
5f20: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 ing the server's
5f30: 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74 list of permitt
5f40: 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c ed TLS versions,
5f50: 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65 . *.changing the
5f60: 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72 server's cipher
5f70: 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 list in respons
5f80: 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 e to the client'
5f90: 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65 s cipher list, e
5fa0: 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 tc.. *.Called be
5fb0: 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 fore SNI and ALP
5fc0: 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a N callbacks.. *.
5fd0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
5fe0: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
5ff0: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
6000: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
6010: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
6020: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
6030: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 L_CLIENT_HELLO_R
6040: 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68 ETRY: suspend th
6050: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 e handshake, and
6060: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 the handshake f
6070: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 unction will ret
6080: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a urn immediately.
6090: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 *.SSL_CLIENT_HE
60a0: 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 LLO_ERROR: failu
60b0: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f re, terminate co
60c0: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c nnection. Set al
60d0: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 ert to error cod
60e0: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 e.. *.SSL_CLIENT
60f0: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 _HELLO_SUCCESS:
6100: 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d success. *. *---
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6150: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
6160: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 63 6f HelloCallback(co
6170: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e nst SSL *ssl, in
6180: 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a t *alert, void *
6190: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 arg) {. State
61a0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
61b0: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 ate*)arg;. Tc
61c0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
61d0: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
61e0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
61f0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e *cmdPtr;. in
6200: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 t code, res;.
6210: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 const char *ser
6220: 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e vername;. con
6230: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
6240: 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 *p;. size_t
6250: 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a len, remaining;.
6260: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
6270: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
6280: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 (statePtr->vcmd
6290: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
62a0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
62b0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 _CLIENT_HELLO_SU
62c0: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 CCESS;. } els
62d0: 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 28 63 6f e if (ssl == (co
62e0: 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c 20 7c nst SSL *)NULL |
62f0: 7c 20 61 72 67 20 3d 3d 20 28 76 6f 69 64 20 2a | arg == (void *
6300: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
6310: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6320: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a O_ERROR;. }..
6330: 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d 65 73 /* Get names
6340: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c */. if (!SSL
6350: 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 _client_hello_ge
6360: 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c 53 45 t0_ext(ssl, TLSE
6370: 58 54 5f 54 59 50 45 5f 73 65 72 76 65 72 5f 6e XT_TYPE_server_n
6380: 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61 69 6e ame, &p, &remain
6390: 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e 69 6e ing) || remainin
63a0: 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 g <= 2) {..*aler
63b0: 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f t = SSL_R_SSLV3_
63c0: 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 ALERT_ILLEGAL_PA
63d0: 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e RAMETER;..return
63e0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
63f0: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a O_ERROR;. }..
6400: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 /* Extract t
6410: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 he length of the
6420: 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 6f supplied list o
6430: 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 f names. */.
6440: 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c len = (*(p++) <<
6450: 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 8);. len +=
6460: 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 *(p++);. if (
6470: 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d 61 69 len + 2 != remai
6480: 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 ning) {..*alert
6490: 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c = SSL_R_SSLV3_AL
64a0: 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 ERT_ILLEGAL_PARA
64b0: 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 METER;..return S
64c0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
64d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
64e0: 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e remaining = len
64f0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 ;.. /* The li
6500: 73 74 20 69 6e 20 70 72 61 63 74 69 63 65 20 6f st in practice o
6510: 6e 6c 79 20 68 61 73 20 61 20 73 69 6e 67 6c 65 nly has a single
6520: 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 65 20 element, so we
6530: 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20 74 68 only consider th
6540: 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a e first one. */.
6550: 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e if (remainin
6560: 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 g == 0 || *p++ !
6570: 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 = TLSEXT_NAMETYP
6580: 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a 09 E_host_name) {..
6590: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 *alert = SSL_R_T
65a0: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 LSV1_ALERT_INTER
65b0: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 NAL_ERROR;..retu
65c0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
65d0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
65e0: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 2d 2d . remaining--
65f0: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65 ;.. /* Now we
6600: 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70 75 6c can finally pul
6610: 6c 20 6f 75 74 20 74 68 65 20 62 79 74 65 20 61 l out the byte a
6620: 72 72 61 79 20 77 69 74 68 20 74 68 65 20 61 63 rray with the ac
6630: 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e 20 2a tual hostname. *
6640: 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e /. if (remain
6650: 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c ing <= 2) {..*al
6660: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 ert = SSL_R_TLSV
6670: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 1_ALERT_INTERNAL
6680: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 _ERROR;..return
6690: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
66a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
66b0: 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 len = (*(p++)
66c0: 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b << 8);. len +
66d0: 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 = *(p++);. if
66e0: 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61 (len + 2 > rema
66f0: 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 ining) {..*alert
6700: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
6710: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
6720: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c ROR;..return SSL
6730: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6740: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
6750: 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a emaining = len;.
6760: 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d servername =
6770: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 (const char *)p
6780: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 ;.. /* Create
6790: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c command to eval
67a0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
67b0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
67c0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 j(statePtr->vcmd
67d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
67e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
67f0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
6800: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
6810: 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a ("hello", -1));.
6820: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
6830: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
6840: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
6850: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
6860: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
6870: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
6880: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
6890: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
68a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
68b0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
68c0: 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 wStringObj(serve
68d0: 72 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 rname, (Tcl_Size
68e0: 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a ) len));.. /*
68f0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 Eval callback c
6900: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 ommand */. Tc
6910: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
6920: 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 mdPtr);. if (
6930: 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c (code = EvalCall
6940: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
6950: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 tePtr, cmdPtr))
6960: 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 > 1) {..res = SS
6970: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 L_CLIENT_HELLO_R
6980: 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 ETRY;..*alert =
6990: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
69a0: 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 T_USER_CANCELLED
69b0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
69c0: 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 (code == 1) {..r
69d0: 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f es = SSL_CLIENT_
69e0: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 HELLO_SUCCESS;.
69f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 } else {..res
6a00: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 = SSL_CLIENT_HE
6a10: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 LLO_ERROR;..*ale
6a20: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 rt = SSL_R_TLSV1
6a30: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f _ALERT_INTERNAL_
6a40: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
6a50: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
6a60: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 t(cmdPtr);. r
6a70: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f eturn res;.}.../
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6a90: 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 ****/./* Command
6aa0: 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a s */./**
6ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6ac0: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d **/../*. *------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
6b10: 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d . * CiphersObjCm
6b20: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 d -- list availa
6b30: 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 ble ciphers. *.
6b40: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
6b50: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 is invoked to p
6b60: 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a rocess the "tls:
6b70: 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e :ciphers" comman
6b80: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 d. *.to list ava
6b90: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 ilable ciphers,
6ba0: 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f based upon proto
6bb0: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a col selected.. *
6bc0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
6bd0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
6be0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 esult list.. *.
6bf0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
6c00: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e *.constructs an
6c10: 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 d destroys SSL c
6c20: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a ontext (CTX). *.
6c30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c70: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
6c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f const char *pro
6c90: 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 tocols[] = {.."s
6ca0: 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 sl2", "ssl3", "t
6cb0: 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 ls1", "tls1.1",
6cc0: 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e "tls1.2", "tls1.
6cd0: 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 3", NULL.};.enum
6ce0: 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 protocol {.
6cf0: 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 TLS_SSL2, TLS_SS
6d00: 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c L3, TLS_TLS1, TL
6d10: 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c S_TLS1_1, TLS_TL
6d20: 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 S1_2, TLS_TLS1_3
6d30: 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 , TLS_NONE.};..s
6d40: 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 tatic int.Cipher
6d50: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 sObjCmd(ClientDa
6d60: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
6d70: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
6d80: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
6d90: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
6da0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
6db0: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c j *objPtr = NULL
6dc0: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 ;. SSL_CTX *c
6dd0: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 tx = NULL;. S
6de0: 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a SL *ssl = NULL;.
6df0: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c STACK_OF(SSL
6e00: 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 _CIPHER) *sk;.
6e10: 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b char *cp, buf[
6e20: 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 BUFSIZ];. int
6e30: 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20 index, verbose
6e40: 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 = 0, use_support
6e50: 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 ed = 0;. cons
6e60: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 t SSL_METHOD *me
6e70: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e thod;.. dprin
6e80: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
6e90: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 if ((objc < 2
6ea0: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 ) || (objc > 4))
6eb0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
6ec0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
6ed0: 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 objv, "protocol
6ee0: 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f ?verbose? ?suppo
6ef0: 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e rted?");..return
6f00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
6f10: 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 }. if (Tcl_Ge
6f20: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e tIndexFromObj(in
6f30: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 terp, objv[1], p
6f40: 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f rotocols, "proto
6f50: 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 col", 0, &index)
6f60: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
6f70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6f80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
6f90: 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c objc > 2) && Tcl
6fa0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f _GetBooleanFromO
6fb0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
6fc0: 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d 2], &verbose) !=
6fd0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
6fe0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
6ff0: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a }. if ((obj
7000: 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65 c > 3) && Tcl_Ge
7010: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 tBooleanFromObj(
7020: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c interp, objv[3],
7030: 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 &use_supported)
7040: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
7050: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7060: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
7070: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
7080: 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 switch ((enu
7090: 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 m protocol)index
70a0: 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 ) {..case TLS_SS
70b0: 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f L2:.#if OPENSSL_
70c0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e VERSION_NUMBER >
70d0: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c = 0x10100000L ||
70e0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 defined(NO_SSL2
70f0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
7100: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 NSSL_NO_SSL2)..
7110: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
7120: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
7130: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
7140: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
7150: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
7160: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
7170: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
7180: 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 method = SSLv
7190: 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 2_method(); brea
71a0: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 k;.#endif..case
71b0: 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 TLS_SSL3:.#if de
71c0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c fined(NO_SSL3) |
71d0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
71e0: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 L_NO_SSL3) || de
71f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7200: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 _SSL3_METHOD)..
7210: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
7220: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
7230: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
7240: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
7250: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
7260: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
7270: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
7280: 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 method = SSLv
7290: 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 3_method(); brea
72a0: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 k;.#endif..case
72b0: 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 TLS_TLS1:.#if de
72c0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c fined(NO_TLS1) |
72d0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
72e0: 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 L_NO_TLS1) || de
72f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7300: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 _TLS1_METHOD)..
7310: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
7320: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
7330: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
7340: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
7350: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
7360: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
7370: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
7380: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 method = TLSv
7390: 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 1_method(); brea
73a0: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 k;.#endif..case
73b0: 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 TLS_TLS1_1:.#if
73c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
73d0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
73e0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
73f0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7400: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 SSL_NO_TLS1_1_ME
7410: 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 THOD).. Tcl_A
7420: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7430: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e rp, protocols[in
7440: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f dex], ": protoco
7450: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
7460: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 , NULL);.. re
7470: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7480: 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f #else.. metho
7490: 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 d = TLSv1_1_meth
74a0: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e od(); break;.#en
74b0: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c dif..case TLS_TL
74c0: 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 S1_2:.#if define
74d0: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 d(NO_TLS1_2) ||
74e0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
74f0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 NO_TLS1_2) || de
7500: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7510: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a _TLS1_2_METHOD).
7520: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
7530: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
7540: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
7550: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
7560: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
7570: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
7580: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
7590: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c . method = TL
75a0: 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 Sv1_2_method();
75b0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
75c0: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a ase TLS_TLS1_3:.
75d0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
75e0: 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_3) || define
75f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
7600: 31 5f 33 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 1_3).. Tcl_Ap
7610: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
7620: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
7630: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
7640: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
7650: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
7660: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
7670: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 else.. method
7680: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b = TLS_method();
7690: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
76a0: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 t_min_proto_vers
76b0: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
76c0: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 VERSION);.. S
76d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
76e0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
76f0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
7700: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 );.. break;.#
7710: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a endif..default:.
7720: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c . method = TL
7730: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 S_method();..
7740: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 break;. }..
7750: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
7760: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 _new(method);.
7770: 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c if (ctx == NUL
7780: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
7790: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 Result(interp, R
77a0: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a EASON(), NULL);.
77b0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
77c0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 R;. }.. ss
77d0: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 l = SSL_new(ctx)
77e0: 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d ;. if (ssl ==
77f0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
7800: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
7810: 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c p, REASON(), NUL
7820: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
7830: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
7840: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7850: 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 .. /* Use lis
7860: 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77 t and order as w
7870: 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20 ould be sent in
7880: 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 a ClientHello or
7890: 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 all available c
78a0: 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 iphers */. if
78b0: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 (use_supported)
78c0: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 {..sk = SSL_get
78d0: 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68 1_supported_ciph
78e0: 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 ers(ssl);. }
78f0: 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c else {..sk = SSL
7900: 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c _get_ciphers(ssl
7910: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
7920: 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (sk != NULL) {.
7930: 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b .if (!verbose) {
7940: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
7950: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
7960: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 NULL);.. for
7970: 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c (int i = 0; i <
7980: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e sk_SSL_CIPHER_n
7990: 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 um(sk); i++) {..
79a0: 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 .const SSL_CIPHE
79b0: 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 R *c = sk_SSL_CI
79c0: 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 PHER_value(sk, i
79d0: 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 );...if (c == NU
79e0: 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 LL) continue;...
79f0: 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65 20 ./* cipher name
7a00: 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 or (NONE) */...c
7a10: 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 p = SSL_CIPHER_g
7a20: 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 et_name(c);...if
7a30: 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 (cp == NULL) br
7a40: 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f eak;...Tcl_ListO
7a50: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
7a60: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
7a70: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
7a80: 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 (cp, -1));..
7a90: 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 }...} else {..
7aa0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
7ab0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 ewStringObj("",0
7ac0: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 );.. for (int
7ad0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 i = 0; i < sk_S
7ae0: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b SL_CIPHER_num(sk
7af0: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 ); i++) {...cons
7b00: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 t SSL_CIPHER *c
7b10: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f = sk_SSL_CIPHER_
7b20: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 value(sk, i);...
7b30: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 if (c == NULL) c
7b40: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 ontinue;..../* t
7b50: 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 extual descripti
7b60: 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 on of the cipher
7b70: 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 */...if (SSL_CI
7b80: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e PHER_description
7b90: 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 (c, buf, sizeof(
7ba0: 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b buf)) != NULL) {
7bb0: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ... Tcl_Appen
7bc0: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 dToObj(objPtr, b
7bd0: 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 uf, (Tcl_Size) s
7be0: 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d trlen(buf));...}
7bf0: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 else {... Tc
7c00: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 l_AppendToObj(ob
7c10: 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e jPtr, "UNKNOWN\n
7c20: 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 ", 8);...}..
7c30: 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 }..}..if (use_su
7c40: 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 pported) {..
7c50: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 sk_SSL_CIPHER_fr
7c60: 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d ee(sk);..}. }
7c70: 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 . SSL_free(ss
7c80: 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f l);. SSL_CTX_
7c90: 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 free(ctx);..
7ca0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
7cb0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
7cc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
7cd0: 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 _OK;..clientData
7ce0: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d = clientData;.}
7cf0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
7d40: 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d * ProtocolsObjCm
7d50: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 d -- list availa
7d60: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a ble protocols. *
7d70: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
7d80: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f re is invoked to
7d90: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c process the "tl
7da0: 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f s::protocols" co
7db0: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 mmand. *.to list
7dc0: 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f available proto
7dd0: 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 cols.. *. * Resu
7de0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
7df0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 rd Tcl result li
7e00: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 st.. *. * Side e
7e10: 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a ffects:. *.none.
7e20: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
7e70: 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c tic int.Protocol
7e80: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 sObjCmd(ClientDa
7e90: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
7ea0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
7eb0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
7ec0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
7ed0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
7ee0: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 j *objPtr;..
7ef0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
7f00: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
7f10: 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 != 1) {..Tcl_Wr
7f20: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
7f30: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b p, 1, objv, "");
7f40: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7f50: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 OR;. }.. E
7f60: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
7f70: 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 ;.. objPtr =
7f80: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
7f90: 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 , NULL);..#if OP
7fa0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
7fb0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
7fc0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
7fd0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
7fe0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
7ff0: 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 SL2). Tcl_Lis
8000: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
8010: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
8020: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
8030: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
8040: 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 _SSL2], -1));.#e
8050: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
8060: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 d(NO_SSL3) && !d
8070: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
8080: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
8090: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
80a0: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 SL3_METHOD).
80b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
80c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
80d0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
80e0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 StringObj(protoc
80f0: 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d ols[TLS_SSL3], -
8100: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
8110: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
8120: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8130: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 ENSSL_NO_TLS1) &
8140: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
8150: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
8160: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f D). Tcl_ListO
8170: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
8180: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
8190: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
81a0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 (protocols[TLS_T
81b0: 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 LS1], -1));.#end
81c0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
81d0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
81e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
81f0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
8200: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8210: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a _TLS1_1_METHOD).
8220: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
8230: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
8240: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
8250: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
8260: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
8270: 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 _1], -1));.#endi
8280: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
8290: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
82a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
82b0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
82c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
82d0: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_2_METHOD).
82e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
82f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
8300: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
8310: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
8320: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f tocols[TLS_TLS1_
8330: 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 2], -1));.#endif
8340: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
8350: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 _TLS1_3) && !def
8360: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8370: 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f TLS1_3). Tcl_
8380: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
8390: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
83a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
83b0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
83c0: 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 TLS_TLS1_3], -1)
83d0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 );.#endif.. T
83e0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
83f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
8400: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
8410: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 OK;..clientData
8420: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a = clientData;.}.
8430: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
8480: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 HandshakeObjCmd
8490: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 --. *. *.This c
84a0: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 ommand is used t
84b0: 6f 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72 o verify whether
84c0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 the handshake i
84d0: 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 s complete. *.or
84e0: 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 not.. *. * Resu
84f0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
8500: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 rd Tcl result. 1
8510: 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 means handshake
8520: 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 complete, 0 mea
8530: 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 ns pending.. *.
8540: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
8550: 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c *.May force SSL
8560: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 negotiation to
8570: 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 take place.. *.
8580: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85c0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
85d0: 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a int HandshakeObj
85e0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
85f0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
8600: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
8610: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
8620: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
8630: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
8640: 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f l chan; /
8650: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
8660: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 set a mode on.
8670: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 */. State *st
8680: 61 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f atePtr; /
8690: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
86a0: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
86b0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
86c0: 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a *errStr = NULL;.
86d0: 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b int ret = 1;
86e0: 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 . int err = 0
86f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
8700: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
8710: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
8720: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
8730: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
8740: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
8750: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
8760: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 );. }.. ER
8770: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
8780: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
8790: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
87a0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
87b0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d gFromObj(objv[1]
87c0: 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 , (Tcl_Size *)NU
87d0: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 LL), NULL);.
87e0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
87f0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
8800: 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 {..return(TCL_ER
8810: 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ROR);. }..
8820: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f /* Make sure to
8830: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
8840: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
8850: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
8860: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
8870: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 chan);. if (T
8880: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
8890: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
88a0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
88b0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
88c0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
88d0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
88e0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
88f0: 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 han),.. "\":
8900: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
8910: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f l", NULL);..Tcl_
8920: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
8930: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e erp, "TLS", "HAN
8940: 44 53 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 DSHAKE", "CHANNE
8950: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 L", "INVALID", (
8960: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
8970: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
8980: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 );. }. sta
8990: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
89a0: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 )Tcl_GetChannelI
89b0: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e nstanceData(chan
89c0: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 );.. dprintf(
89d0: 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 "Calling Tls_Wai
89e0: 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 tForConnect");.
89f0: 20 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 ret = Tls_Wai
8a00: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 tForConnect(stat
8a10: 65 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a ePtr, &err, 1);.
8a20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 dprintf("Tls
8a30: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 _WaitForConnect
8a40: 72 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 returned: %i", r
8a50: 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 et);.. if (re
8a60: 74 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 t < 0 && ((state
8a70: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 Ptr->flags & TLS
8a80: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 _TCL_ASYNC) && (
8a90: 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 err == EAGAIN)))
8aa0: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 {..dprintf("Asy
8ab0: 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d nc set and err =
8ac0: 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 EAGAIN");..ret
8ad0: 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 = 0;. } else
8ae0: 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 if (ret < 0) {..
8af0: 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 long result;..er
8b00: 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d rStr = statePtr-
8b10: 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 >err;..Tcl_Reset
8b20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
8b30: 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 .Tcl_SetErrno(er
8b40: 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 r);...if (!errSt
8b50: 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d r || (*errStr ==
8b60: 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 0)) {.. errS
8b70: 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 tr = Tcl_PosixEr
8b80: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a ror(interp);..}.
8b90: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
8ba0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 lt(interp, "hand
8bb0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c shake failed: ",
8bc0: 20 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a errStr, (char *
8bd0: 29 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 ) NULL);..if ((r
8be0: 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f esult = SSL_get_
8bf0: 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 verify_result(st
8c00: 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d atePtr->ssl)) !=
8c10: 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 X509_V_OK) {..
8c20: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
8c30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20 64 75 ult(interp, " du
8c40: 65 20 74 6f 3a 20 22 2c 20 58 35 30 39 5f 76 65 e to: ", X509_ve
8c50: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f rify_cert_error_
8c60: 73 74 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 string(result),
8c70: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
8c80: 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 .}..Tcl_SetError
8c90: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
8ca0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c S", "HANDSHAKE",
8cb0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
8cc0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 *) NULL);..dpri
8cd0: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 ntf("Returning T
8ce0: 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 CL_ERROR with ha
8cf0: 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 ndshake failed:
8d00: 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 %s", errStr);..r
8d10: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
8d20: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
8d30: 69 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a if (err != 0) {.
8d40: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f . dprintf("Go
8d50: 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 t an error with
8d60: 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 a completed hand
8d70: 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 shake: err = %i"
8d80: 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 , err);..}..ret
8d90: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 = 1;. }..
8da0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
8db0: 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 ng TCL_OK with d
8dc0: 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 ata \"%i\"", ret
8dd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 );. Tcl_SetOb
8de0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
8df0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 Tcl_NewIntObj(re
8e00: 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 t));. return(
8e10: 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 TCL_OK);..client
8e20: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
8e30: 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d a;.}../*. *-----
8e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
8e80: 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d *. * ImportObjCm
8e90: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 d --. *. *.This
8ea0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
8eb0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
8ec0: 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e the "ssl" comman
8ed0: 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 d. *. *.The ssl
8ee0: 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 command pushes S
8ef0: 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 SL over a (newly
8f00: 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 connected) tcp
8f10: 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 socket. *. * Res
8f20: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
8f30: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
8f40: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
8f50: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 ts:. *.May modif
8f60: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f y the behavior o
8f70: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e f an IO channel.
8f80: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
8f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
8fd0: 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f atic int.ImportO
8fe0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
8ff0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
9000: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
9010: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
9020: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
9030: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ) {. Tcl_Chan
9040: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 nel chan;../* Th
9050: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 e channel to set
9060: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 a mode on. */.
9070: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
9080: 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 tr;../* client s
9090: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 tate for ssl soc
90a0: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 ket */. SSL_C
90b0: 54 58 20 2a 63 74 78 09 20 20 20 20 20 20 20 20 TX *ctx.
90c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
90d0: 4f 62 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20 Obj *script.
90e0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
90f0: 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 Tcl_Obj *passwor
9100: 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c d. = NULL
9110: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 ;. Tcl_Obj *v
9120: 63 6d 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 cmd. = NU
9130: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 LL;. Tcl_DStr
9140: 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c ing upperChannel
9150: 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 Translation, upp
9160: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
9170: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 g, upperChannelE
9180: 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 ncoding, upperCh
9190: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 annelEOFChar;.
91a0: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 int idx;. T
91b0: 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 cl_Size len;.
91c0: 20 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20 int flags..
91d0: 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e = TLS_TCL_IN
91e0: 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 IT;. int serv
91f0: 65 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b er.. = 0;
9200: 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f ./* is connectio
9210: 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 n incoming or ou
9220: 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 tgoing? */. c
9230: 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 har *keyfile.
9240: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
9250: 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 char *certfile.
9260: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
9270: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
9280: 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b r *key .= NULL;
9290: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 . Tcl_Size ke
92a0: 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 y_len
92b0: 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 75 = 0;. u
92c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 nsigned char *ce
92d0: 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e 55 4c rt = NUL
92e0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 L;. Tcl_Size
92f0: 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 20 20 cert_len
9300: 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 = 0;.
9310: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 09 20 char *ciphers.
9320: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
9330: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 char *ciphers
9340: 75 69 74 65 73 09 20 20 20 20 20 20 20 20 3d 20 uites. =
9350: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
9360: 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d CAfile. =
9370: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
9380: 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 20 20 *CAdir..
9390: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
93a0: 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 20 20 *DHparams.
93b0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 = NULL;. c
93c0: 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20 har *model..
93d0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
93e0: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 char *servername
93f0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
9400: 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 ./* hostname for
9410: 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 Server Name Ind
9420: 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 ication */. c
9430: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
9440: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d ar *session_id =
9450: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f NULL;. Tcl_O
9460: 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c bj *alpn..= NULL
9470: 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d ;. int ssl2 =
9480: 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 0, ssl3 = 0;.
9490: 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 int tls1 = 1,
94a0: 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 tls1_1 = 1, tls1
94b0: 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d _2 = 1, tls1_3 =
94c0: 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 1;. int prot
94d0: 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d o = 0, level = -
94e0: 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 1;. int verif
94f0: 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d y = 0, require =
9500: 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c 0, request = 1,
9510: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 post_handshake
9520: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 = 0;.. dprint
9530: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 f("Called");..#i
9540: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
9550: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
9560: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 ENSSL_NO_TLS1).
9570: 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e tls1 = 0;.#en
9580: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
9590: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
95a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
95b0: 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 _TLS1_1). tls
95c0: 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 1_1 = 0;.#endif.
95d0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
95e0: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
95f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
9600: 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 1_2). tls1_2
9610: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 0;.#endif.#if
9620: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
9630: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
9640: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
9650: 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b . tls1_3 = 0;
9660: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 .#endif.. if
9670: 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 (objc < 2) {..Tc
9680: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
9690: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
96a0: 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e "channel ?option
96b0: 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 s?");..return TC
96c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
96d0: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
96e0: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e ror();.. chan
96f0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
9700: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
9710: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
9720: 62 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 7a bjv[1], (Tcl_Siz
9730: 65 20 2a 29 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 e *)NULL), NULL)
9740: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
9750: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
9760: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
9770: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
9780: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
9790: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
97a0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
97b0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
97c0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
97d0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 nnel(chan);..
97e0: 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 for (idx = 2; i
97f0: 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b dx < objc; idx++
9800: 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d ) {..char *opt =
9810: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
9820: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c omObj(objv[idx],
9830: 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 4c (Tcl_Size *)NUL
9840: 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d L);...if (opt[0]
9850: 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 != '-').. br
9860: 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d eak;...OPTOBJ("-
9870: 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f alpn", alpn);..O
9880: 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20 PTSTR("-cadir",
9890: 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 CAdir);..OPTSTR(
98a0: 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 6c "-cafile", CAfil
98b0: 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 e);..OPTBYTE("-c
98c0: 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72 74 ert", cert, cert
98d0: 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 _len);..OPTSTR("
98e0: 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74 -certfile", cert
98f0: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 file);..OPTSTR("
9900: 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 -cipher", cipher
9910: 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 s);..OPTSTR("-ci
9920: 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 29 phers", ciphers)
9930: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 ;..OPTSTR("-ciph
9940: 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 65 ersuites", ciphe
9950: 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 rsuites);..OPTOB
9960: 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 J("-command", sc
9970: 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 ript);..OPTSTR("
9980: 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61 -dhparams", DHpa
9990: 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 rams);..OPTBYTE(
99a0: 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 "-key", key, key
99b0: 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 _len);..OPTSTR("
99c0: 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 -keyfile", keyfi
99d0: 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d le);..OPTSTR("-m
99e0: 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 odel", model);..
99f0: 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 OPTOBJ("-passwor
9a00: 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 d", password);..
9a10: 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 OPTBOOL("-post_h
9a20: 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f andshake", post_
9a30: 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 handshake);..OPT
9a40: 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 2c BOOL("-request",
9a50: 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 request);..OPTB
9a60: 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c 20 OOL("-require",
9a70: 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e require);..OPTIN
9a80: 54 28 22 2d 73 65 63 75 72 69 74 79 6c 65 76 65 T("-securityleve
9a90: 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 l", level);..OPT
9aa0: 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 BOOL("-server",
9ab0: 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 server);..OPTSTR
9ac0: 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 ("-servername",
9ad0: 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 servername);..OP
9ae0: 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 TSTR("-session_i
9af0: 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b d", session_id);
9b00: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 ..OPTBOOL("-ssl2
9b10: 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f ", ssl2);..OPTBO
9b20: 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 OL("-ssl3", ssl3
9b30: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
9b40: 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 s1", tls1);..OPT
9b50: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 BOOL("-tls1.1",
9b60: 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f tls1_1);..OPTBOO
9b70: 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 L("-tls1.2", tls
9b80: 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 1_2);..OPTBOOL("
9b90: 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 -tls1.3", tls1_3
9ba0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c );..OPTOBJ("-val
9bb0: 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 idatecommand", v
9bc0: 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d cmd);..OPTOBJ("-
9bd0: 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 vcmd", vcmd);...
9be0: 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c OPTBAD("option",
9bf0: 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c "-alpn, -cadir,
9c00: 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c -cafile, -cert,
9c10: 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 -certfile, -cip
9c20: 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 her, -ciphersuit
9c30: 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 es, -command, -d
9c40: 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d hparams, -key, -
9c50: 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c keyfile, -model,
9c60: 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 -password, -pos
9c70: 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 t_handshake, -re
9c80: 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c quest, -require,
9c90: 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c 2c -securitylevel,
9ca0: 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 -server, -serve
9cb0: 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f rname, -session_
9cc0: 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 id, -ssl2, -ssl3
9cd0: 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 , -tls1, -tls1.1
9ce0: 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 , -tls1.2, -tls1
9cf0: 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 .3, or -validate
9d00: 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 command");...ret
9d10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
9d20: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 }. if (req
9d30: 75 65 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d uest)..verify |=
9d40: 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 SSL_VERIFY_CLIE
9d50: 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 NT_ONCE | SSL_VE
9d60: 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 RIFY_PEER;. i
9d70: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72 65 f (request && re
9d80: 71 75 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d quire).verify |=
9d90: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
9da0: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
9db0: 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 ;. if (reques
9dc0: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 t && post_handsh
9dd0: 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 ake).verify |= S
9de0: 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 SL_VERIFY_POST_H
9df0: 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 ANDSHAKE;. if
9e00: 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 (verify == 0)..
9e10: 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 verify = SSL_VER
9e20: 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 IFY_NONE;.. p
9e30: 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 roto |= (ssl2 ?
9e40: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a TLS_PROTO_SSL2 :
9e50: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
9e60: 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 = (ssl3 ? TLS_PR
9e70: 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 OTO_SSL3 : 0);.
9e80: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 proto |= (tls
9e90: 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 1 ? TLS_PROTO_TL
9ea0: 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f S1 : 0);. pro
9eb0: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 to |= (tls1_1 ?
9ec0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
9ed0: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f : 0);. proto
9ee0: 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c |= (tls1_2 ? TL
9ef0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a S_PROTO_TLS1_2 :
9f00: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
9f10: 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f = (tls1_3 ? TLS_
9f20: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 PROTO_TLS1_3 : 0
9f30: 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 );.. /* reset
9f40: 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e to NULL if blan
9f50: 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 k string provide
9f60: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 d */. if (cer
9f70: 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 t && !*cert)..
9f80: 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20 20 cert.
9f90: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
9fa0: 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 f (key && !*key)
9fb0: 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 .. key.
9fc0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
9fd0: 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 if (certfile &
9fe0: 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 & !*certfile)
9ff0: 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d certfile.=
a000: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b NULL;. if (k
a010: 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 eyfile && !*keyf
a020: 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 ile)..keyfile.
a030: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
a040: 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 if (ciphers &&
a050: 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 !*ciphers).
a060: 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20 20 ciphers.
a070: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a080: 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65 73 if (ciphersuites
a090: 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 && !*ciphersuit
a0a0: 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65 73 es) ciphersuites
a0b0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a0c0: 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a if (CAfile && !*
a0d0: 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 CAfile).
a0e0: 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d CAfile. =
a0f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 NULL;. if (C
a100: 41 64 69 72 20 26 26 20 21 2a 43 41 64 69 72 29 Adir && !*CAdir)
a110: 09 20 20 20 20 20 20 20 20 43 41 64 69 72 09 20 . CAdir.
a120: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a130: 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 if (DHparams
a140: 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09 20 && !*DHparams).
a150: 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73 20 DHparams
a160: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a = NULL;..
a170: 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 /* new SSL s
a180: 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 tate */. stat
a190: 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20 2a ePtr..= (State *
a1a0: 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 ) ckalloc((unsig
a1b0: 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61 74 ned) sizeof(Stat
a1c0: 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 e));. memset(
a1d0: 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a statePtr, 0, siz
a1e0: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 eof(State));..
a1f0: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 statePtr->flag
a200: 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 s.= flags;. s
a210: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 tatePtr->interp.
a220: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 = interp;. st
a230: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d atePtr->vflags.=
a240: 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74 61 verify;. sta
a250: 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b tePtr->err.= "";
a260: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 .. /* allocat
a270: 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 e script */.
a280: 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09 28 if (script) {..(
a290: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 void) Tcl_GetStr
a2a0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 ingFromObj(scrip
a2b0: 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c t, &len);..if (l
a2c0: 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 en) {.. state
a2d0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 Ptr->callback =
a2e0: 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63 6c script;.. Tcl
a2f0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _IncrRefCount(st
a300: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
a310: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
a320: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 /* allocate pas
a330: 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 sword */. if
a340: 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 (password) {..(v
a350: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 oid) Tcl_GetStri
a360: 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f ngFromObj(passwo
a370: 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 rd, &len);..if (
a380: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 len) {.. stat
a390: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
a3a0: 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 password;..
a3b0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
a3c0: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
a3d0: 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a ord);..}. }..
a3e0: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 /* allocate
a3f0: 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 validate command
a400: 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d 64 */. if (vcmd
a410: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f ) {..(void) Tcl_
a420: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
a430: 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 (vcmd, &len);..i
a440: 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 f (len) {.. s
a450: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 tatePtr->vcmd =
a460: 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 vcmd;.. Tcl_I
a470: 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ncrRefCount(stat
a480: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a ePtr->vcmd);..}.
a490: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d }.. if (m
a4a0: 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a odel != NULL) {.
a4b0: 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 .int mode;../* G
a4c0: 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 et the "model" c
a4d0: 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 ontext */..chan
a4e0: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
a4f0: 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 (interp, model,
a500: 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61 &mode);..if (cha
a510: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
a520: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 l) NULL) {..
a530: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
a540: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
a550: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
a560: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 OR;..}.../*.. *
a570: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
a580: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
a590: 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f ost channel.. */
a5a0: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 ..chan = Tcl_Get
a5b0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
a5c0: 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 ;..if (Tcl_GetCh
a5d0: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
a5e0: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
a5f0: 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c pe()) {.. Tcl
a600: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
a610: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
a620: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
a630: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
a640: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 ,..."\": not a T
a650: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
a660: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
a670: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
a680: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
a690: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 ", "CHANNEL", "I
a6a0: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a NVALID", (char *
a6b0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c ) NULL);.. Tl
a6c0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
a6d0: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
a6e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a6f0: 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 ;..}..ctx = ((St
a700: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 ate *)Tcl_GetCha
a710: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
a720: 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 (chan))->ctx;.
a730: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 } else {..if (
a740: 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 (ctx = CTX_Init(
a750: 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 statePtr, server
a760: 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 , proto, keyfile
a770: 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c , certfile, key,
a780: 20 63 65 72 74 2c 20 28 69 6e 74 29 20 6b 65 79 cert, (int) key
a790: 5f 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e 74 29 _len,.. (int)
a7a0: 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 cert_len, CAdir
a7b0: 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 , CAfile, cipher
a7c0: 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c s, ciphersuites,
a7d0: 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 level, DHparams
a7e0: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 )) == NULL) {..
a7f0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
a800: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
a810: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
a820: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
a830: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 . statePtr->c
a840: 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f tx = ctx;.. /
a850: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 *. * We need
a860: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 to make sure th
a870: 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 at the channel w
a880: 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 orks in binary (
a890: 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 for the. * e
a8a0: 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f ncryption not to
a8b0: 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e get goofed up).
a8c0: 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 . * We only
a8d0: 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 want to adjust t
a8e0: 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 he buffering in
a8f0: 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c pre-v2 channels,
a900: 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 where. * ea
a910: 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 ch channel in th
a920: 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e e stack maintain
a930: 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 ed its own buffe
a940: 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 rs.. */.
a950: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
a960: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
a970: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 nslation);. T
a980: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
a990: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
a9a0: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 king);. Tcl_D
a9b0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
a9c0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
a9d0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
a9e0: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e gInit(&upperChan
a9f0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 nelEncoding);.
aa00: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
aa10: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
aa20: 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c han, "-eofchar",
aa30: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f &upperChannelEO
aa40: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f FChar);. Tcl_
aa50: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
aa60: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
aa70: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 -encoding", &upp
aa80: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
aa90: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 g);. Tcl_GetC
aaa0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
aab0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 erp, chan, "-tra
aac0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 nslation", &uppe
aad0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
aae0: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 ion);. Tcl_Ge
aaf0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
ab00: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 nterp, chan, "-b
ab10: 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 locking", &upper
ab20: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 ChannelBlocking)
ab30: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
ab40: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
ab50: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 p, chan, "-trans
ab60: 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 lation", "binary
ab70: 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ");. Tcl_SetC
ab80: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
ab90: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f erp, chan, "-blo
aba0: 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b cking", "true");
abb0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f . dprintf("Co
abc0: 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e nsuming Tcl chan
abd0: 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 nel %s", Tcl_Get
abe0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
abf0: 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 ));. statePtr
ac00: 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 ->self = Tcl_Sta
ac10: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 ckChannel(interp
ac20: 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 , Tls_ChannelTyp
ac30: 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 e(), (ClientData
ac40: 29 20 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c ) statePtr, (TCL
ac50: 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f _READABLE | TCL_
ac60: 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 WRITABLE), chan)
ac70: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 ;. dprintf("C
ac80: 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e reated channel n
ac90: 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 amed %s", Tcl_Ge
aca0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
acb0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 tePtr->self));.
acc0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
acd0: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 >self == (Tcl_Ch
ace0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
acf0: 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 /*.. * No use of
ad00: 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 Tcl_EventuallyF
ad10: 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 ree because no p
ad20: 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 ossible Tcl_Pres
ad30: 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f erve... */..Tls_
ad40: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
ad50: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e atePtr);..return
ad60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
ad70: 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 }.. Tcl_SetCh
ad80: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
ad90: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
ada0: 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f lf, "-translatio
adb0: 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 n", Tcl_DStringV
adc0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
add0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b elTranslation));
ade0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
adf0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
ae00: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
ae10: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 , "-encoding", T
ae20: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
ae30: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
ae40: 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c oding));. Tcl
ae50: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
ae60: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
ae70: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 tr->self, "-eofc
ae80: 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e har", Tcl_DStrin
ae90: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
aea0: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 nnelEOFChar));.
aeb0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
aec0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
aed0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 statePtr->self,
aee0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c "-blocking", Tcl
aef0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
af00: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
af10: 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 ing));.. /*.
af20: 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 * SSL Initia
af30: 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f lization. */
af40: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 . statePtr->s
af50: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 sl = SSL_new(sta
af60: 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 tePtr->ctx);.
af70: 20 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e if (!statePtr->
af80: 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c ssl) {../* SSL l
af90: 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a ibrary error */.
afa0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
afb0: 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 t(interp, "could
afc0: 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 n't construct ss
afd0: 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45 l session: ", RE
afe0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
aff0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c NULL);.. Tcl
b000: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
b010: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
b020: 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 PORT", "INIT", "
b030: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
b040: 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 ) NULL);..Tls_Fr
b050: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
b060: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 ePtr);..return T
b070: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
b080: 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 . /* Set host
b090: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a server name */.
b0a0: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 if (serverna
b0b0: 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 me) {../* Sets t
b0c0: 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 he server name i
b0d0: 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 ndication (SNI)
b0e0: 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 in ClientHello e
b0f0: 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 xtension */../*
b100: 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68 6f Per RFC 6066, ho
b110: 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43 49 stname is a ASCI
b120: 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 I encoded string
b130: 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34 33 36 , though RFC 436
b140: 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20 2a 2f 6 says UTF-8. */
b150: 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 ..if (!SSL_set_t
b160: 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 lsext_host_name(
b170: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 statePtr->ssl, s
b180: 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65 ervername) && re
b190: 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63 quire) {.. Tc
b1a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
b1b0: 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 nterp, "setting
b1c0: 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 TLS host name ex
b1d0: 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c tension failed",
b1e0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b1f0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
b200: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
b210: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
b220: 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c "SNI", "FAILED",
b230: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b240: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
b250: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
b260: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
b270: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
b280: 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 * Set hostname f
b290: 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 69 63 or peer certific
b2a0: 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 ate hostname ver
b2b0: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 ification in cli
b2c0: 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 ents... Don't
b2d0: 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 use SSL_set1_hos
b2e0: 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c t since it has l
b2f0: 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 imitations. */..
b300: 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f if (!SSL_add1_ho
b310: 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c st(statePtr->ssl
b320: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b , servername)) {
b330: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
b340: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b350: 73 65 74 74 69 6e 67 20 44 4e 53 20 68 6f 73 74 setting DNS host
b360: 20 6e 61 6d 65 20 66 61 69 6c 65 64 22 2c 20 28 name failed", (
b370: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
b380: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
b390: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
b3a0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 S", "IMPORT", "H
b3b0: 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 OSTNAME", "FAILE
b3c0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
b3d0: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
b3e0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
b3f0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
b400: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
b410: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 }.. /* Re
b420: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 sume session id
b430: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 */. if (sessi
b440: 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28 on_id && strlen(
b450: 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 session_id) <= S
b460: 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c SL_MAX_SID_CTX_L
b470: 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c ENGTH) {../* SSL
b480: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a _set_session() *
b490: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 /..if (!SSL_SESS
b4a0: 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 ION_set1_id_cont
b4b0: 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 ext(SSL_get_sess
b4c0: 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ion(statePtr->ss
b4d0: 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 l), session_id,
b4e0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 (unsigned int) s
b4f0: 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 trlen(session_id
b500: 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 ))) {.. Tcl_A
b510: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
b520: 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73 rp, "Resume sess
b530: 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 73 69 6f ion id ", sessio
b540: 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 64 22 2c n_id, " failed",
b550: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b560: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
b570: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
b580: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
b590: 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c "SESSION", "FAIL
b5a0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
b5b0: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
b5c0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
b5d0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
b5e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
b5f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 . }.. /* E
b600: 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f nable Applicatio
b610: 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c n-Layer Protocol
b620: 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 Negotiation. Ex
b630: 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 amples are: http
b640: 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c /1.0,..http/1.1,
b650: 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d h2, h3, ftp, im
b660: 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 ap, pop3, xmpp-c
b670: 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 lient, xmpp-serv
b680: 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 er, mqtt, irc, e
b690: 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 tc. */. if (a
b6a0: 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 lpn) {../* Conve
b6b0: 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e rt a TCL list in
b6c0: 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 to a protocol-li
b6d0: 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 st in wire-forma
b6e0: 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 t */..unsigned c
b6f0: 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b har *protos, *p;
b700: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 ..unsigned int p
b710: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 rotos_len = 0;..
b720: 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b Tcl_Size cnt, i;
b730: 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 ..int j;..Tcl_Ob
b740: 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 j **list;...if (
b750: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c Tcl_ListObjGetEl
b760: 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 ements(interp, a
b770: 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 lpn, &cnt, &list
b780: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
b790: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
b7a0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
b7b0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
b7c0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
b7d0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 Determine the me
b7e0: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f mory required fo
b7f0: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c r the protocol-l
b800: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d ist */..for (i =
b810: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 0; i < cnt; i++
b820: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 ) {.. Tcl_Get
b830: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 StringFromObj(li
b840: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 st[i], &len);..
b850: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 if (len > 255
b860: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
b870: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b880: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 ALPN protocol na
b890: 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 me too long", (c
b8a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
b8b0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
b8c0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
b8d0: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 "IMPORT", "ALPN"
b8e0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
b8f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c r *) NULL);...Tl
b900: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
b910: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 statePtr);...ret
b920: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
b930: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f }.. proto
b940: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e s_len += 1 + (in
b950: 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 t) len;..}.../*
b960: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 Build the comple
b970: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 te protocol-list
b980: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b */..protos = ck
b990: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e alloc(protos_len
b9a0: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d );../* protocol-
b9b0: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 lists consist of
b9c0: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 8-bit length-pr
b9d0: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 efixed, byte str
b9e0: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 ings */..for (j
b9f0: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b = 0, p = protos;
ba00: 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b j < cnt; j++) {
ba10: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 .. char *str
ba20: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
ba30: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 romObj(list[j],
ba40: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b &len);.. *p++
ba50: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 = (unsigned cha
ba60: 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d r) len;.. mem
ba70: 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a cpy(p, str, (siz
ba80: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 e_t) len);..
ba90: 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f p += len;..}.../
baa0: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 * SSL_set_alpn_p
bab0: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f rotos makes a co
bac0: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 py of the protoc
bad0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e ol-list */../* N
bae0: 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 ote: This functi
baf0: 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 65 ons reverses the
bb00: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f return value co
bb10: 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 nvention */..if
bb20: 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 (SSL_set_alpn_pr
bb30: 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 otos(statePtr->s
bb40: 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 sl, protos, prot
bb50: 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 os_len)) {..
bb60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
bb70: 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65 64 (interp, "failed
bb80: 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70 72 6f to set ALPN pro
bb90: 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20 2a tocols", (char *
bba0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 ) NULL);.. Tc
bbb0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
bbc0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
bbd0: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 MPORT", "ALPN",
bbe0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
bbf0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
bc00: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
bc10: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
bc20: 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b ckfree(protos);
bc30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
bc40: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
bc50: 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 Store protocols
bc60: 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 list */..statePt
bc70: 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 r->protos = prot
bc80: 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 os;..statePtr->p
bc90: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 rotos_len = prot
bca0: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c os_len;. } el
bcb0: 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e se {..statePtr->
bcc0: 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 protos = NULL;..
bcd0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
bce0: 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a _len = 0;. }.
bcf0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 . /*. * S
bd00: 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 SL Callbacks.
bd10: 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 */. SSL_set
bd20: 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 _app_data(stateP
bd30: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a tr->ssl, (void *
bd40: 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 )statePtr);./* p
bd50: 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 oint back to us
bd60: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 */. SSL_set_v
bd70: 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e erify(statePtr->
bd80: 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 ssl, verify, Ver
bd90: 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 ifyCallback);.
bda0: 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 SSL_set_info_c
bdb0: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 allback(statePtr
bdc0: 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 ->ssl, InfoCallb
bdd0: 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 ack);.. /* Ca
bde0: 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 llback for obser
bdf0: 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 ving protocol me
be00: 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 ssages */.#ifnde
be10: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c f OPENSSL_NO_SSL
be20: 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f _TRACE. /* vo
be30: 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d id SSL_CTX_set_m
be40: 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 sg_callback_arg(
be50: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 statePtr->ctx, (
be60: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
be70: 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 ;. void SSL_C
be80: 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 TX_set_msg_callb
be90: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ack(statePtr->ct
bea0: 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 x, MessageCallba
beb0: 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f ck); */. SSL_
bec0: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
bed0: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73 _arg(statePtr->s
bee0: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 sl, (void *)stat
bef0: 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 ePtr);. SSL_s
bf00: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 et_msg_callback(
bf10: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d statePtr->ssl, M
bf20: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b essageCallback);
bf30: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
bf40: 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e Create Tcl_Chann
bf50: 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a el BIO Handler *
bf60: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e /. statePtr->
bf70: 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f p_bio.= BIO_new_
bf80: 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 tcl(statePtr, BI
bf90: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 O_NOCLOSE);.
bfa0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 statePtr->bio.=
bfb0: 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 BIO_new(BIO_f_ss
bfc0: 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 l());.. if (s
bfd0: 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 erver) {../* Ser
bfe0: 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f ver callbacks */
bff0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c ..SSL_CTX_set_tl
c000: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f sext_servername_
c010: 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 arg(statePtr->ct
c020: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 x, (void *)state
c030: 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 Ptr);..SSL_CTX_s
c040: 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 et_tlsext_server
c050: 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 name_callback(st
c060: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 atePtr->ctx, SNI
c070: 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f Callback);..SSL_
c080: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 CTX_set_client_h
c090: 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 ello_cb(statePtr
c0a0: 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c ->ctx, HelloCall
c0b0: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 back, (void *)st
c0c0: 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 atePtr);..if (st
c0d0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 atePtr->protos !
c0e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 = NULL) {.. S
c0f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f SL_CTX_set_alpn_
c100: 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 select_cb(stateP
c110: 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c tr->ctx, ALPNCal
c120: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
c130: 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 tatePtr);.#ifdef
c140: 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 USE_NPN.. if
c150: 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 (tls1_2 == 0 &&
c160: 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a tls1_3 == 0) {.
c170: 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 ..SSL_CTX_set_ne
c180: 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 xt_protos_advert
c190: 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 ised_cb(statePtr
c1a0: 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 ->ctx, NPNCallba
c1b0: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
c1c0: 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 ePtr);.. }.#e
c1d0: 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 ndif..}.../* Ena
c1e0: 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 ble server to se
c1f0: 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74 20 nd cert request
c200: 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 after handshake
c210: 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a (TLS 1.3 only) *
c220: 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 /../* A write op
c230: 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b eration must tak
c240: 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20 e place for the
c250: 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71 75 Certificate Requ
c260: 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65 est to be.. se
c270: 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 nt to the client
c280: 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f , this can be do
c290: 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 ne with SSL_do_h
c2a0: 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 andshake(). */..
c2b0: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 if (request && p
c2c0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 ost_handshake &&
c2d0: 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 tls1_3) {..
c2e0: 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e SSL_verify_clien
c2f0: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 t_post_handshake
c300: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
c310: 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 ..}.../* set aut
c320: 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 6c omatic curve sel
c330: 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 ection */..SSL_s
c340: 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61 et_ecdh_auto(sta
c350: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a tePtr->ssl, 1);.
c360: 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 ../* Set server
c370: 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 mode */..statePt
c380: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
c390: 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c TCL_SERVER;..SSL
c3a0: 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 _set_accept_stat
c3b0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
c3c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
c3d0: 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 /* Client callba
c3e0: 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 cks */.#ifdef US
c3f0: 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 E_NPN..if (state
c400: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e Ptr->protos != N
c410: 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d ULL && tls1_2 ==
c420: 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 0 && tls1_3 ==
c430: 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 0) {.. SSL_CT
c440: 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f X_set_next_proto
c450: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 _select_cb(state
c460: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 Ptr->ctx, ALPNCa
c470: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
c480: 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 statePtr);..}.#e
c490: 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f ndif.../* Sessio
c4a0: 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 n caching */..SS
c4b0: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f L_CTX_set_sessio
c4c0: 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 n_cache_mode(sta
c4d0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f tePtr->ctx, SSL_
c4e0: 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e SESS_CACHE_CLIEN
c4f0: 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 T | SSL_SESS_CAC
c500: 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 HE_NO_INTERNAL_S
c510: 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f TORE);..SSL_CTX_
c520: 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 sess_set_new_cb(
c530: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 statePtr->ctx, S
c540: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b essionCallback);
c550: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 .../* Enable pos
c560: 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 t handshake Auth
c570: 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e entication exten
c580: 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e sion. TLS 1.3 on
c590: 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 ly, not http/2.
c5a0: 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 */..if (request
c5b0: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b && post_handshak
c5c0: 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 e) {.. SSL_se
c5d0: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 t_post_handshake
c5e0: 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e _auth(statePtr->
c5f0: 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a ssl, 1);..}.../*
c600: 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 Set client mode
c610: 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e */..SSL_set_con
c620: 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 nect_state(state
c630: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
c640: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f . SSL_set_bio
c650: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c660: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c statePtr->p_bio,
c670: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
c680: 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 );. BIO_set_s
c690: 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f sl(statePtr->bio
c6a0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c , statePtr->ssl,
c6b0: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a BIO_NOCLOSE);..
c6c0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e /*. * En
c6d0: 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 d of SSL Init.
c6e0: 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 */. dprint
c6f0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 f("Returning %s"
c700: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
c710: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
c720: 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 elf));. Tcl_S
c730: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
c740: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 (char *) Tcl_Ge
c750: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
c760: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 tePtr->self), TC
c770: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 L_VOLATILE);..
c780: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
c790: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
c7a0: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
c7b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
c7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c7f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e -------. *. * Un
c800: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a importObjCmd --.
c810: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
c820: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
c830: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f to remove the to
c840: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 pmost channel fi
c850: 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 lter.. *. * Resu
c860: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
c870: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
c880: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
c890: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 s:. *.May modify
c8a0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 the behavior of
c8b0: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a an IO channel..
c8c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
c8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c900: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
c910: 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 tic int.Unimport
c920: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
c930: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
c940: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
c950: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
c960: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
c970: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
c980: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 nnel chan;../* T
c990: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 he channel to se
c9a0: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a t a mode on. */.
c9b0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
c9c0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
c9d0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
c9e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
c9f0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
ca00: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
ca10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
ca20: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 }.. chan
ca30: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
ca40: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 (interp, Tcl_Get
ca50: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c String(objv[1]),
ca60: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
ca70: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
ca80: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
ca90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
caa0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
cab0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
cac0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
cad0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
cae0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
caf0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
cb00: 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 ;.. if (Tcl_G
cb10: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
cb20: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
cb30: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
cb40: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
cb50: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
cb60: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
cb70: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
cb80: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 ,..."\": not a T
cb90: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
cba0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
cbb0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
cbc0: 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f , "TLS", "UNIMPO
cbd0: 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 RT", "CHANNEL",
cbe0: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 "INVALID", (char
cbf0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
cc00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
cc10: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c }.. if (Tcl
cc20: 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 _UnstackChannel(
cc30: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d interp, chan) ==
cc40: 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 TCL_ERROR) {..r
cc50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
cc60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 . }.. retu
cc70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
cc80: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
cc90: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
cca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ccb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cce0: 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 -. *. * CTX_Init
ccf0: 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 -- construct a
cd00: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 SSL_CTX instance
cd10: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
cd20: 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 *.A valid SSL_C
cd30: 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e TX instance or N
cd40: 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ULL.. *. * Side
cd50: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 effects:. *.cons
cd60: 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 tructs SSL conte
cd70: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d xt (CTX). *. *--
cd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cdc0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c -. */.static SSL
cdd0: 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 _CTX *.CTX_Init(
cde0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c State *statePtr,
cdf0: 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 int isServer, i
ce00: 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a nt proto, char *
ce10: 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 keyfile, char *c
ce20: 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 ertfile,. uns
ce30: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c igned char *key,
ce40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
ce50: 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 cert, int key_le
ce60: 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c n, int cert_len,
ce70: 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 char *CAdir,.
ce80: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 char *CAfile,
ce90: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 char *ciphers, c
cea0: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
ceb0: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 s, int level, ch
cec0: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a ar *DHparams) {.
ced0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
cee0: 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 interp = statePt
cef0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 r->interp;. S
cf00: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 SL_CTX *ctx = NU
cf10: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 LL;. Tcl_DStr
cf20: 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f ing ds;. Tcl_
cf30: 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 DString ds1;.
cf40: 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 int off = 0;.
cf50: 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 int load_priva
cf60: 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 te_key;. cons
cf70: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 t SSL_METHOD *me
cf80: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e thod;.. dprin
cf90: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
cfa0: 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b if (!proto) {
cfb0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
cfc0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 lt(interp, "no v
cfd0: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 alid protocol se
cfe0: 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a lected", (char *
cff0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
d000: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
d010: 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 /* create SSL
d020: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f context */.#if O
d030: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
d040: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 UMBER >= 0x10100
d050: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 000L || defined(
d060: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 NO_SSL2) || defi
d070: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
d080: 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 SL2). if (ENA
d090: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
d0a0: 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 PROTO_SSL2)) {..
d0b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d0c0: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 (interp, "SSL2 p
d0d0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
d0e0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
d0f0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
d100: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
d110: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
d120: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e O_SSL3) || defin
d130: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
d140: 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 L3). if (ENAB
d150: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
d160: 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 ROTO_SSL3)) {..T
d170: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d180: 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 interp, "SSL3 pr
d190: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d1a0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
d1b0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d1c0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
d1d0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
d1e0: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 _TLS1) || define
d1f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d200: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 1). if (ENABL
d210: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d220: 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 OTO_TLS1)) {..Tc
d230: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d240: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 nterp, "TLS 1.0
d250: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
d260: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
d270: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
d280: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
d290: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
d2a0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
d2b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d2c0: 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 _TLS1_1). if
d2d0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
d2e0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
d2f0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
d300: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d310: 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c TLS 1.1 protocol
d320: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
d330: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d340: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
d350: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
d360: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
d370: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
d380: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
d390: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
d3a0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
d3b0: 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 O_TLS1_2)) {..Tc
d3c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d3d0: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 nterp, "TLS 1.2
d3e0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
d3f0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
d400: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
d410: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
d420: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
d430: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
d440: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d450: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 _TLS1_3). if
d460: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
d470: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
d480: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
d490: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d4a0: 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c TLS 1.3 protocol
d4b0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
d4c0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d4d0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
d4e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 }.#endif.
d4f0: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 if (proto == 0)
d500: 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 {../* Use full r
d510: 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 ange */..SSL_CTX
d520: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 _set_min_proto_v
d530: 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a ersion(ctx, 0);.
d540: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 .SSL_CTX_set_max
d550: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
d560: 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 tx, 0);. }..
d570: 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f switch (proto
d580: 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f ) {.#if OPENSSL_
d590: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
d5a0: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 0x10100000L &&
d5b0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 !defined(NO_SSL2
d5c0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d5d0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 ENSSL_NO_SSL2).
d5e0: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
d5f0: 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 O_SSL2:..method
d600: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c = isServer ? SSL
d610: 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 v2_server_method
d620: 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e () : SSLv2_clien
d630: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
d640: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
d650: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
d660: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d670: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 NSSL_NO_SSL3) &&
d680: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
d690: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 L_NO_SSL3_METHOD
d6a0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
d6b0: 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 ROTO_SSL3:..meth
d6c0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
d6d0: 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 SSLv3_server_met
d6e0: 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c hod() : SSLv3_cl
d6f0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
d700: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
d710: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
d720: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
d730: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
d740: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d750: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 NSSL_NO_TLS1_MET
d760: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
d770: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d S_PROTO_TLS1:..m
d780: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
d790: 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f ? TLSv1_server_
d7a0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 method() : TLSv1
d7b0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
d7c0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
d7d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
d7e0: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
d7f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d800: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
d810: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d820: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 LS1_1_METHOD).
d830: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
d840: 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 _TLS1_1:..method
d850: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c = isServer ? TL
d860: 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 Sv1_1_server_met
d870: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f hod() : TLSv1_1_
d880: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
d890: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
d8a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
d8b0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
d8c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d8d0: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
d8e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d8f0: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_2_METHOD).
d900: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
d910: 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 TLS1_2:..method
d920: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 = isServer ? TLS
d930: 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 v1_2_server_meth
d940: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 od() : TLSv1_2_c
d950: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
d960: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
d970: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
d980: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
d990: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d9a0: 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 S1_3). case T
d9b0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a LS_PROTO_TLS1_3:
d9c0: 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e ../* Use the gen
d9d0: 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 eric method and
d9e0: 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 constraint range
d9f0: 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 after context i
da00: 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 s created */..me
da10: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
da20: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 ? TLS_server_met
da30: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 hod() : TLS_clie
da40: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
da50: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
da60: 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 default:../* Neg
da70: 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61 otiate highest a
da80: 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 vailable SSL/TLS
da90: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 version */..met
daa0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
dab0: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 TLS_server_meth
dac0: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e od() : TLS_clien
dad0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 t_method();.#if
dae0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
daf0: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
db00: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 000L && !defined
db10: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 (NO_SSL2) && !de
db20: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
db30: 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 _SSL2)..off |= (
db40: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
db50: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 LS_PROTO_SSL2)
db60: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
db70: 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a _SSLv2);.#endif.
db80: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
db90: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
dba0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
dbb0: 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 3)..off |= (ENAB
dbc0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
dbd0: 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 ROTO_SSL3) ? 0
dbe0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c : SSL_OP_NO_SSL
dbf0: 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 v3);.#endif.#if
dc00: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
dc10: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
dc20: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 ENSSL_NO_TLS1)..
dc30: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
dc40: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
dc50: 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 _TLS1) ? 0 : S
dc60: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b SL_OP_NO_TLSv1);
dc70: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
dc80: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
dc90: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
dca0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 SSL_NO_TLS1_1)..
dcb0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
dcc0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
dcd0: 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 _TLS1_1) ? 0 : S
dce0: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 SL_OP_NO_TLSv1_1
dcf0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
dd00: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
dd10: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
dd20: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
dd30: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
dd40: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
dd50: 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a TO_TLS1_2) ? 0 :
dd60: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
dd70: 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 _2);.#endif.#if
dd80: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
dd90: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
dda0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
ddb0: 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 3)..off |= (ENAB
ddc0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
ddd0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 ROTO_TLS1_3) ? 0
dde0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
ddf0: 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 v1_3);.#endif..b
de00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
de10: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 ERR_clear_error
de20: 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 ();.. ctx = S
de30: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f SL_CTX_new(metho
de40: 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 d);. if (!ctx
de50: 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c ) {..return(NULL
de60: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
de70: 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c (getenv(SSLKEYL
de80: 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f OGFILE)) {..SSL_
de90: 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 CTX_set_keylog_c
dea0: 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 allback(ctx, Key
deb0: 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 LogCallback);.
dec0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 }..#if !define
ded0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 d(NO_TLS1_3) &&
dee0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
def0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
df00: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 if (proto == TLS
df10: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b _PROTO_TLS1_3) {
df20: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 ..SSL_CTX_set_mi
df30: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 n_proto_version(
df40: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 ctx, TLS1_3_VERS
df50: 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ION);..SSL_CTX_s
df60: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 et_max_proto_ver
df70: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 sion(ctx, TLS1_3
df80: 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d _VERSION);. }
df90: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
dfa0: 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c Force cipher sel
dfb0: 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 ection order by
dfc0: 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 server */. if
dfd0: 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 (!isServer) {..
dfe0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
dff0: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f ons(ctx, SSL_OP_
e000: 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 CIPHER_SERVER_PR
e010: 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d EFERENCE);. }
e020: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
e030: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
e040: 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f x10100000L. O
e050: 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 penSSL_add_all_a
e060: 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 lgorithms(); /*
e070: 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 6e 64 Load ciphers and
e080: 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 digests */.#end
e090: 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f if.. SSL_CTX_
e0a0: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 set_app_data(ctx
e0b0: 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 , (void*)interp)
e0c0: 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 ;./* remember th
e0d0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f e interpreter */
e0e0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
e0f0: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 _options(ctx, SS
e100: 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c L_OP_ALL);./* al
e110: 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 l SSL bug workar
e120: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c ounds */. SSL
e130: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
e140: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f (ctx, SSL_OP_NO_
e150: 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a COMPRESSION);./*
e160: 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 disable compres
e170: 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 sion even if sup
e180: 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 ported */. SS
e190: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e L_CTX_set_option
e1a0: 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a s(ctx, off);../*
e1b0: 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f disable protoco
e1c0: 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 l versions */.#i
e1d0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
e1e0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
e1f0: 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 01000L. SSL_C
e200: 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c TX_set_mode(ctx,
e210: 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 SSL_MODE_AUTO_R
e220: 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 ETRY);./* handle
e230: 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 new handshakes
e240: 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f in background. O
e250: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20 n by default in
e260: 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a OpenSSL 1.1.1. *
e270: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c /.#endif. SSL
e280: 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 _CTX_sess_set_ca
e290: 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 che_size(ctx, 12
e2a0: 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 8);.. /* Set
e2b0: 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 user defined cip
e2c0: 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 hers, cipher sui
e2d0: 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 tes, and securit
e2e0: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 y level */. i
e2f0: 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e f ((ciphers != N
e300: 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 ULL) && !SSL_CTX
e310: 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 _set_cipher_list
e320: 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 (ctx, ciphers))
e330: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
e340: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 ult(interp, "Set
e350: 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a ciphers failed:
e360: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 No valid cipher
e370: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c s", (char *) NUL
e380: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
e390: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
e3a0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
e3b0: 69 66 20 28 28 63 69 70 68 65 72 73 75 69 74 65 if ((ciphersuite
e3c0: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 s != NULL) && !S
e3d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 SL_CTX_set_ciphe
e3e0: 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 rsuites(ctx, cip
e3f0: 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 hersuites)) {..T
e400: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e410: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 interp, "Set cip
e420: 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 her suites faile
e430: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 d: No valid ciph
e440: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ers", (char *) N
e450: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
e460: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
e470: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 n NULL;. }..
e480: 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 /* Set securi
e490: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 ty level */.
e4a0: 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 if (level > -1 &
e4b0: 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 & level < 6) {..
e4c0: 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 /* SSL_set_secur
e4d0: 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 ity_level */..SS
e4e0: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 L_CTX_set_securi
e4f0: 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 ty_level(ctx, le
e500: 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 vel);. }..
e510: 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c /* set some cal
e520: 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 lbacks */. SS
e530: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c L_CTX_set_defaul
e540: 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c t_passwd_cb(ctx,
e550: 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 PasswordCallbac
e560: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f k);. SSL_CTX_
e570: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 set_default_pass
e580: 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 wd_cb_userdata(c
e590: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 tx, (void *)stat
e5a0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 ePtr);.. /* r
e5b0: 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c ead a Diffie-Hel
e5c0: 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 lman parameters
e5d0: 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 file, or use the
e5e0: 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f built-in one */
e5f0: 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f .#ifdef OPENSSL_
e600: 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 NO_DH. if (DH
e610: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 params != NULL)
e620: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
e630: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 ult(interp, "DH
e640: 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 parameter suppor
e650: 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 t not available"
e660: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
e670: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
e680: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ctx);..return NU
e690: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a LL;. }.#else.
e6a0: 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 {..DH* dh;..
e6b0: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 if (DHparams !=
e6c0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f NULL) {.. BIO
e6d0: 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f *bio;.. Tcl_
e6e0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
e6f0: 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f ;.. bio = BIO
e700: 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 _new_file(F2N(DH
e710: 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 params, &ds), "r
e720: 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 ");.. if (!bi
e730: 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 o) {...Tcl_DStri
e740: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 ngFree(&ds);...T
e750: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e760: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e interp, "Could n
e770: 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d ot find DH param
e780: 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 eters file", (ch
e790: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
e7a0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
e7b0: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
e7c0: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 .. }... dh
e7d0: 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f = PEM_read_bio_
e7e0: 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 DHparams(bio, NU
e7f0: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b LL, NULL, NULL);
e800: 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 .. BIO_free(b
e810: 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 io);.. Tcl_DS
e820: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
e830: 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a . if (!dh) {.
e840: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
e850: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c lt(interp, "Coul
e860: 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 d not read DH pa
e870: 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 rameters from fi
e880: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 le", (char *) NU
e890: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
e8a0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
e8b0: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a rn NULL;.. }.
e8c0: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 .} else {.. d
e8d0: 68 20 3d 20 67 65 74 5f 64 68 50 61 72 61 6d 73 h = get_dhParams
e8e0: 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f ();..}..SSL_CTX_
e8f0: 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 set_tmp_dh(ctx,
e900: 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 dh);..DH_free(dh
e910: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a );. }.#endif.
e920: 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 . /* set our
e930: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 certificate */.
e940: 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f load_private_
e950: 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 key = 0;. if
e960: 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c (certfile != NUL
e970: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 L) {..load_priva
e980: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 te_key = 1;...Tc
e990: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 l_DStringInit(&d
e9a0: 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 s);...if (SSL_CT
e9b0: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 X_use_certificat
e9c0: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 e_file(ctx, F2N(
e9d0: 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 certfile, &ds),
e9e0: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
e9f0: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) <= 0) {.. T
ea00: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
ea10: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 ds);.. Tcl_Ap
ea20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
ea30: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
ea40: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 t certificate fi
ea50: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 le ", certfile,
ea60: 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 ": ",.... RE
ea70: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
ea80: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
ea90: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
eaa0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
eab0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
eac0: 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c if (cert != NULL
ead0: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 ) {..load_privat
eae0: 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 e_key = 1;..if (
eaf0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 SSL_CTX_use_cert
eb00: 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 ificate_ASN1(ctx
eb10: 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 , cert_len, cert
eb20: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) <= 0) {.. T
eb30: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
eb40: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 ds);.. Tcl_Ap
eb50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
eb60: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
eb70: 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 t certificate: "
eb80: 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e ,.... REASON
eb90: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
eba0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
ebb0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
ebc0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d return NULL;..}
ebd0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 . } else {..c
ebe0: 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a ertfile = (char*
ebf0: 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c )X509_get_defaul
ec00: 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a t_cert_file();..
ec10: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 .if (SSL_CTX_use
ec20: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c _certificate_fil
ec30: 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c e(ctx, certfile,
ec40: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 SSL_FILETYPE_PE
ec50: 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 M) <= 0) {.#if 0
ec60: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
ec70: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 gFree(&ds);..
ec80: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
ec90: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
eca0: 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 e to use default
ecb0: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c certificate fil
ecc0: 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 e ", certfile, "
ecd0: 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 : ",.... REA
ece0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
ecf0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
ed00: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
ed10: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
ed20: 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d .#endif..}. }
ed30: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 .. /* set our
ed40: 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a private key */.
ed50: 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 if (load_pri
ed60: 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 vate_key) {..if
ed70: 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c (keyfile == NULL
ed80: 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 && key == NULL)
ed90: 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20 {.. keyfile
eda0: 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a = certfile;..}..
edb0: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 .if (keyfile !=
edc0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 NULL) {.. /*
edd0: 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 20 get the private
ede0: 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 key associated w
edf0: 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 69 ith this certifi
ee00: 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 cate */.. if
ee10: 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c (keyfile == NULL
ee20: 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 ) {...keyfile =
ee30: 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d certfile;.. }
ee40: 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 ... if (SSL_C
ee50: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 TX_use_PrivateKe
ee60: 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 y_file(ctx, F2N(
ee70: 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 keyfile, &ds), S
ee80: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 SL_FILETYPE_PEM)
ee90: 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 <= 0) {...Tcl_D
eea0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
eeb0: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 .../* flush the
eec0: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 passphrase which
eed0: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 might be left i
eee0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a n the result */.
eef0: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 ..Tcl_SetResult(
ef00: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 interp, NULL, TC
ef10: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c L_STATIC);...Tcl
ef20: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
ef30: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
ef40: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 set public key
ef50: 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c file ", keyfile,
ef60: 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20 20 20 " ",....
ef70: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 REASON(), (cha
ef80: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
ef90: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
efa0: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
efb0: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f . }.. Tcl_
efc0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
efd0: 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b ;...} else if (k
efe0: 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 ey != NULL) {..
eff0: 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 if (SSL_CTX_u
f000: 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 se_PrivateKey_AS
f010: 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c N1(EVP_PKEY_RSA,
f020: 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 ctx, key,key_le
f030: 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c n) <= 0) {...Tcl
f040: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
f050: 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 );.../* flush th
f060: 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 e passphrase whi
f070: 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 ch might be left
f080: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a in the result *
f090: 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c /...Tcl_SetResul
f0a0: 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 t(interp, NULL,
f0b0: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 TCL_STATIC);...T
f0c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
f0d0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
f0e0: 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 to set public ke
f0f0: 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 y: ", REASON(),
f100: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
f110: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
f120: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
f130: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f LL;.. }..}../
f140: 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 * Now we know th
f150: 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 at a key and cer
f160: 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 t have been set
f170: 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 against.. * the
f180: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 SSL context */..
f190: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 if (!SSL_CTX_che
f1a0: 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 ck_private_key(c
f1b0: 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f tx)) {.. Tcl_
f1c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f1d0: 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 erp, "private ke
f1e0: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 y does not match
f1f0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
f200: 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 public key",...
f210: 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e . (char *) N
f220: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
f230: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
f240: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
f250: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
f260: 20 53 65 74 20 76 65 72 69 66 69 63 61 74 69 6f Set verificatio
f270: 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c n CAs */. Tcl
f280: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
f290: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
f2a0: 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 ngInit(&ds1);.
f2b0: 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e /* There is on
f2c0: 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 e default direct
f2d0: 6f 72 79 2c 20 6f 6e 65 20 64 65 66 61 75 6c 74 ory, one default
f2e0: 20 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 65 20 64 file, and one d
f2f0: 65 66 61 75 6c 74 20 73 74 6f 72 65 2e 0a 09 54 efault store...T
f300: 68 65 20 64 65 66 61 75 6c 74 20 43 41 20 63 65 he default CA ce
f310: 72 74 69 66 69 63 61 74 65 73 20 64 69 72 65 63 rtificates direc
f320: 74 6f 72 79 20 28 61 6e 64 20 64 65 66 61 75 6c tory (and defaul
f330: 74 20 73 74 6f 72 65 29 20 69 73 20 69 6e 20 74 t store) is in t
f340: 68 65 20 4f 70 65 6e 53 53 4c 0a 09 63 65 72 74 he OpenSSL..cert
f350: 73 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20 s directory. It
f360: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 can be overridde
f370: 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 n by the SSL_CER
f380: 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54 T_DIR env var. T
f390: 68 65 0a 09 64 65 66 61 75 6c 74 20 43 41 20 63 he..default CA c
f3a0: 65 72 74 69 66 69 63 61 74 65 73 20 66 69 6c 65 ertificates file
f3b0: 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74 2e is called cert.
f3c0: 70 65 6d 20 69 6e 20 74 68 65 20 64 65 66 61 75 pem in the defau
f3d0: 6c 74 20 4f 70 65 6e 53 53 4c 0a 09 64 69 72 65 lt OpenSSL..dire
f3e0: 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 62 65 ctory. It can be
f3f0: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 overridden by t
f400: 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 he SSL_CERT_FILE
f410: 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 09 2f 2a env var. */../*
f420: 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65 74 int SSL_CTX_set
f430: 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f _default_verify_
f440: 64 69 72 28 53 53 4c 5f 43 54 58 20 2a 63 74 78 dir(SSL_CTX *ctx
f450: 29 20 61 6e 64 20 69 6e 74 20 53 53 4c 5f 43 54 ) and int SSL_CT
f460: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 X_set_default_ve
f470: 72 69 66 79 5f 66 69 6c 65 28 53 53 4c 5f 43 54 rify_file(SSL_CT
f480: 58 20 2a 63 74 78 29 20 2a 2f 0a 20 20 20 20 69 X *ctx) */. i
f490: 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 f (!SSL_CTX_load
f4a0: 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e _verify_location
f4b0: 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c s(ctx, F2N(CAfil
f4c0: 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 64 e, &ds), F2N(CAd
f4d0: 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 ir, &ds1)) ||..!
f4e0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
f4f0: 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 ult_verify_paths
f500: 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 (ctx)) {.#if 0..
f510: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
f520: 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 &ds);..Tcl_DStri
f530: 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f ngFree(&ds1);../
f540: 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c * Don't currentl
f550: 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20 66 y care if this f
f560: 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 ails */..Tcl_App
f570: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
f580: 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76 , "SSL default v
f590: 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c 20 erify paths: ",
f5a0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
f5b0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 *) NULL);..SSL_C
f5c0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 TX_free(ctx);..r
f5d0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 eturn NULL;.#end
f5e0: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a if. }.. /*
f5f0: 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 https://sourcef
f600: 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 orge.net/p/tls/b
f610: 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 20 2f ugs/57/ */. /
f620: 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 * XXX:TODO: Let
f630: 74 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 the user supply
f640: 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 values here inst
f650: 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 ead of something
f660: 20 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 that exists on
f670: 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a the filesystem *
f680: 2f 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 /. if (CAfile
f690: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53 54 41 != NULL) {..STA
f6a0: 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 CK_OF(X509_NAME)
f6b0: 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 *certNames = SS
f6c0: 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 L_load_client_CA
f6d0: 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 _file(F2N(CAfile
f6e0: 2c 20 26 64 73 29 29 3b 0a 09 69 66 20 28 63 65 , &ds));..if (ce
f6f0: 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 rtNames != NULL)
f700: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f {.. SSL_CTX_
f710: 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 set_client_CA_li
f720: 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 st(ctx, certName
f730: 73 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 s);..}. }..
f740: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
f750: 65 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f e(&ds);. Tcl_
f760: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 DStringFree(&ds1
f770: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 );. return ct
f780: 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d x;.}.../*. *----
f790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
f7d0: 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 *. * StatusObjC
f7e0: 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 md -- return cer
f7f0: 74 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e tificate for con
f800: 6e 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a nected peer.. *.
f810: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
f820: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
f830: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
f840: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
f850: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
f860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
f8a0: 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 static int.Statu
f8b0: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 sObjCmd(ClientDa
f8c0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
f8d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
f8e0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
f8f0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
f900: 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 []) {. State
f910: 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 *statePtr;. X
f920: 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 509 *peer;. T
f930: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a cl_Obj *objPtr;.
f940: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
f950: 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a chan;. char *
f960: 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 channelName, *ci
f970: 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d phers;. int m
f980: 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 ode;. const u
f990: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 nsigned char *pr
f9a0: 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 oto;. unsigne
f9b0: 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 d int len;. i
f9c0: 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 0a 20 20 nt nid, res;..
f9d0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
f9e0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
f9f0: 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e jc < 2 || objc >
fa00: 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 3 || (objc == 3
fa10: 20 26 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f && !strcmp(Tcl_
fa20: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 GetString(objv[1
fa30: 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 ]), "-local")))
fa40: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
fa50: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
fa60: 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 bjv, "?-local? c
fa70: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 hannel");..retur
fa80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
fa90: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 }.. /* Get c
faa0: 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 hannel Id */.
fab0: 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 channelName = T
fac0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
fad0: 4f 62 6a 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d Obj(objv[(objc =
fae0: 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d 2c 20 28 = 2 ? 1 : 2)], (
faf0: 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c Tcl_Size *) NULL
fb00: 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 );. chan = Tc
fb10: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
fb20: 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 erp, channelName
fb30: 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 , &mode);. if
fb40: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
fb50: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
fb60: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
fb70: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
fb80: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
fb90: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
fba0: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a most channel */.
fbb0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
fbc0: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
fbd0: 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f n);. if (Tcl_
fbe0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
fbf0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
fc00: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 nelType()) {..Tc
fc10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
fc20: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
fc30: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
fc40: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
fc50: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
fc60: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
fc70: 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 LL);..Tcl_SetErr
fc80: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
fc90: 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 TLS", "STATUS",
fca0: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 "CHANNEL", "INVA
fcb0: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LID", (char *) N
fcc0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
fcd0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
fce0: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 statePtr = (S
fcf0: 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 tate *) Tcl_GetC
fd00: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
fd10: 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f ta(chan);.. /
fd20: 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61 74 * Get certificat
fd30: 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 e for peer or se
fd40: 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 lf */. if (ob
fd50: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 jc == 2) {..peer
fd60: 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f = SSL_get_peer_
fd70: 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 certificate(stat
fd80: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
fd90: 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d } else {..peer =
fda0: 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 SSL_get_certifi
fdb0: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 cate(statePtr->s
fdc0: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f sl);. }. /
fdd0: 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 74 69 * Get X509 certi
fde0: 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 ficate info */.
fdf0: 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 if (peer) {..
fe00: 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 objPtr = Tls_New
fe10: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 X509Obj(interp,
fe20: 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 peer);..if (objc
fe30: 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 == 2) {.. X5
fe40: 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 09_free(peer);..
fe50: 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b peer = NULL;
fe60: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ..}. } else {
fe70: 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e ..objPtr = Tcl_N
fe80: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
fe90: 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f L);. }.. /
fea0: 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 * Peer name */.
feb0: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
fec0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
fed0: 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 peername", SSL_g
fee0: 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 et0_peername(sta
fef0: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 tePtr->ssl), -1)
ff00: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e ;. LAPPEND_IN
ff10: 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
ff20: 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 , "sbits", SSL_g
ff30: 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 et_cipher_bits(s
ff40: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 tatePtr->ssl, NU
ff50: 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 LL));.. ciphe
ff60: 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f rs = (char*)SSL_
ff70: 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 get_cipher(state
ff80: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c Ptr->ssl);. L
ff90: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
ffa0: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 p, objPtr, "ciph
ffb0: 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 er", ciphers, -1
ffc0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 );.. /* Verif
ffd0: 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 y the X509 certi
ffe0: 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 ficate presented
fff0: 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a by the peer */.
10000 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
10010 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10020 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a "verifyResult",.
10030 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 .X509_verify_cer
10040 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 t_error_string(S
10050 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 SL_get_verify_re
10060 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 sult(statePtr->s
10070 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 sl)), -1);..
10080 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a /* Verify mode *
10090 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c /. mode = SSL
100a0 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 _get_verify_mode
100b0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
100c0 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 . if (mode &&
100d0 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 SSL_VERIFY_NONE
100e0 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 ) {..LAPPEND_STR
100f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10100 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 "verifyMode", "
10110 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 none", -1);.
10120 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 } else {..Tcl_Ob
10130 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 j *listObjPtr =
10140 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
10150 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f , NULL);..if (mo
10160 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 de && SSL_VERIFY
10170 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 _PEER) {.. Tc
10180 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10190 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
101a0 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e istObjPtr, Tcl_N
101b0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 ewStringObj("pee
101c0 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 r", -1));..}..if
101d0 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 (mode && SSL_VE
101e0 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f RIFY_FAIL_IF_NO_
101f0 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 PEER_CERT) {..
10200 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
10210 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10220 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 p, listObjPtr, T
10230 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
10240 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 "fail if no peer
10250 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d cert", -1));..}
10260 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 ..if (mode && SS
10270 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f L_VERIFY_CLIENT_
10280 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c ONCE) {.. Tcl
10290 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
102a0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 ement(interp, li
102b0 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 stObjPtr, Tcl_Ne
102c0 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 wStringObj("clie
102d0 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a nt once", -1));.
102e0 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 .}..if (mode &&
102f0 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f SSL_VERIFY_POST_
10300 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 HANDSHAKE) {..
10310 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
10320 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10330 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 p, listObjPtr, T
10340 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
10350 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 "post handshake"
10360 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 , -1));..}..LAPP
10370 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
10380 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d objPtr, "verifyM
10390 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 ode", listObjPtr
103a0 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ). }.. /*
103b0 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 Verify mode dept
103c0 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 h */. LAPPEND
103d0 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
103e0 50 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 Ptr, "verifyDept
103f0 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 h", SSL_get_veri
10400 66 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 fy_depth(statePt
10410 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f r->ssl));.. /
10420 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c * Report the sel
10430 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
10440 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 s a result of th
10450 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f e negotiation */
10460 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c . SSL_get0_al
10470 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 pn_selected(stat
10480 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 ePtr->ssl, &prot
10490 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 o, &len);. LA
104a0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
104b0 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 , objPtr, "alpn"
104c0 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c , (char *)proto,
104d0 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 (Tcl_Size) len)
104e0 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 ;. LAPPEND_ST
104f0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
10500 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 , "protocol", SS
10510 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 L_get_version(st
10520 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 atePtr->ssl), -1
10530 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 );.. /* Valid
10540 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 for non-RSA sig
10550 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 nature and TLS 1
10560 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 .3 */. if (ob
10570 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 jc == 2) {..res
10580 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 = SSL_get_peer_s
10590 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 ignature_nid(sta
105a0 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
105b0 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
105c0 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 .res = SSL_get_s
105d0 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 ignature_nid(sta
105e0 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
105f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 );. }. if
10600 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b (!res) {nid = 0;
10610 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 }. LAPPEND_ST
10620 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
10630 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 , "signatureHash
10640 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f Algorithm", OBJ_
10650 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 nid2ln(nid), -1)
10660 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
10670 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 2) {..res = S
10680 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e SL_get_peer_sign
10690 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 ature_type_nid(s
106a0 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e tatePtr->ssl, &n
106b0 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 id);. } else
106c0 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 {..res = SSL_get
106d0 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f _signature_type_
106e0 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
106f0 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a l, &nid);. }.
10700 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e if (!res) {n
10710 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 id = 0;}. LAP
10720 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
10730 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 objPtr, "signat
10740 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 ureType", OBJ_ni
10750 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a d2ln(nid), -1);.
10760 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
10770 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
10780 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
10790 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e n TCL_OK;..clien
107a0 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
107b0 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ta;.}.../*. *---
107c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
107d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
107e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
107f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10800 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f . *. * Connectio
10810 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 nInfoObjCmd -- r
10820 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e eturn connection
10830 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 info from OpenS
10840 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 SL.. *. * Result
10850 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 s:. *.A list of
10860 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a connection info.
10870 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *----------
10880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
108a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
108b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
108c0 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 tatic int Connec
108d0 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 tionInfoObjCmd(C
108e0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
108f0 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
10900 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
10910 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
10920 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
10930 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
10940 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
10950 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
10960 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 on */. State
10970 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 *statePtr;../*
10980 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 client state for
10990 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 ssl socket */.
109a0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
109b0 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 tr, *listPtr;.
109c0 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c const SSL *ssl
109d0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f ;. const SSL_
109e0 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a CIPHER *cipher;.
109f0 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 const SSL_SE
10a00 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a SSION *session;.
10a10 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 const EVP_MD
10a20 20 2a 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28 6f *md;.. if (o
10a30 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
10a40 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
10a50 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
10a60 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
10a70 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
10a80 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d }.. chan =
10a90 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
10aa0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
10ab0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
10ac0 76 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20 v[1], (Tcl_Size
10ad0 2a 29 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a *)NULL), NULL);.
10ae0 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
10af0 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
10b00 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 LL) {..return(TC
10b10 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a L_ERROR);. }.
10b20 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
10b30 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
10b40 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
10b50 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
10b60 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
10b70 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 nel(chan);. i
10b80 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
10b90 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
10ba0 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
10bb0 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
10bc0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
10bd0 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
10be0 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
10bf0 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 me(chan),.. "
10c00 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
10c10 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 annel", NULL);..
10c20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
10c30 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
10c40 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 "CONNECTION", "C
10c50 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
10c60 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
10c70 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f L);..return(TCL_
10c80 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 ERROR);. }..
10c90 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
10ca0 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
10cb0 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e LL);.. /* Con
10cc0 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a nection info */.
10cd0 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
10ce0 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
10cf0 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
10d00 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 ta(chan);. ss
10d10 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 l = statePtr->ss
10d20 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 l;. if (ssl !
10d30 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f = NULL) {../* co
10d40 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a nnection state *
10d50 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
10d60 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10d70 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 state", SSL_stat
10d80 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 e_string_long(ss
10d90 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 l), -1);.../* Ge
10da0 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 t SNI requested
10db0 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 server name */..
10dc0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
10dd0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 rp, objPtr, "ser
10de0 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 vername", SSL_ge
10df0 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c t_servername(ssl
10e00 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 , TLSEXT_NAMETYP
10e10 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 E_host_name), -1
10e20 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 );.../* Get prot
10e30 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 ocol */..LAPPEND
10e40 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
10e50 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c Ptr, "protocol",
10e60 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e SSL_get_version
10e70 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a (ssl), -1);.../*
10e80 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 Renegotiation a
10e90 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 llowed */..LAPPE
10ea0 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
10eb0 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 objPtr, "renegot
10ec0 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c iation_allowed",
10ed0 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f SSL_get_secure_
10ee0 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 renegotiation_su
10ef0 70 70 6f 72 74 28 73 73 6c 29 29 3b 0a 0a 09 2f pport(ssl));.../
10f00 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 20 6c * Get security l
10f10 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 evel */..LAPPEND
10f20 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
10f30 50 74 72 2c 20 22 73 65 63 75 72 69 74 79 5f 6c Ptr, "security_l
10f40 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 evel", SSL_get_s
10f50 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 ecurity_level(ss
10f60 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f l));.../* Sessio
10f70 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 n info */..LAPPE
10f80 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
10f90 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
10fa0 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 _reused", SSL_se
10fb0 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c ssion_reused(ssl
10fc0 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 ));.../* Is serv
10fd0 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 er info */..LAPP
10fe0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
10ff0 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 objPtr, "is_ser
11000 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 ver", SSL_is_ser
11010 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 ver(ssl));.../*
11020 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 Is DTLS */..LAPP
11030 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
11040 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c objPtr, "is_dtl
11050 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 s", SSL_is_dtls(
11060 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 ssl));. }..
11070 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f /* Cipher info
11080 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d */. cipher =
11090 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 SSL_get_current
110a0 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 _cipher(ssl);.
110b0 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 if (cipher !=
110c0 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 NULL) {..char bu
110d0 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b f[BUFSIZ] = {0};
110e0 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f ..int bits, alg_
110f0 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 bits;.../* Ciphe
11100 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 r name */..LAPPE
11110 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11120 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c bjPtr, "cipher",
11130 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
11140 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 name(cipher), -1
11150 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 );.../* RFC name
11160 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c of cipher */..L
11170 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11180 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e p, objPtr, "stan
11190 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f dard_name", SSL_
111a0 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f CIPHER_standard_
111b0 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 name(cipher), -1
111c0 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 );.../* OpenSSL
111d0 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a name of cipher *
111e0 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
111f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11200 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f openssl_name", O
11210 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 PENSSL_cipher_na
11220 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 me(SSL_CIPHER_st
11230 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 andard_name(ciph
11240 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 er)), -1);.../*
11250 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 number of secret
11260 20 62 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 bits used for c
11270 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d ipher */..bits =
11280 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
11290 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c bits(cipher, &al
112a0 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e g_bits);..LAPPEN
112b0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
112c0 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 jPtr, "secret_bi
112d0 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 ts", bits);..LAP
112e0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
112f0 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 objPtr, "algori
11300 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 thm_bits", alg_b
11310 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 its);../* alg_bi
11320 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 ts is actual key
11330 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 secret bits. If
11340 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 use bits and se
11350 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 cret (algorithm)
11360 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 bits differ,..
11370 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 the rest of th
11380 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65 64 e bits are fixed
11390 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 , i.e. for limit
113a0 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 ed export cipher
113b0 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f s (bits < 56) */
113c0 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 .../* Indicates
113d0 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 which SSL/TLS pr
113e0 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 otocol version f
113f0 69 72 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 irst defined the
11400 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 cipher */..LAPP
11410 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11420 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 objPtr, "min_ver
11430 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 sion", SSL_CIPHE
11440 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 R_get_version(ci
11450 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a pher), -1);.../*
11460 20 43 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 Cipher NID */..
11470 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11480 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
11490 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a herNID", (char *
114a0 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f )OBJ_nid2ln(SSL_
114b0 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 CIPHER_get_ciphe
114c0 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 r_nid(cipher)),
114d0 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 -1);..LAPPEND_ST
114e0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
114f0 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 , "digestNID", (
11500 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c char *)OBJ_nid2l
11510 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 n(SSL_CIPHER_get
11520 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 _digest_nid(ciph
11530 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 er)), -1);..LAPP
11540 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11550 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 objPtr, "keyExch
11560 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 angeNID", (char
11570 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c *)OBJ_nid2ln(SSL
11580 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e _CIPHER_get_kx_n
11590 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 id(cipher)), -1)
115a0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
115b0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
115c0 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 authenticationNI
115d0 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f D", (char *)OBJ_
115e0 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 nid2ln(SSL_CIPHE
115f0 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 R_get_auth_nid(c
11600 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 ipher)), -1);...
11610 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 /* message authe
11620 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d ntication code -
11630 20 43 69 70 68 65 72 20 69 73 20 41 45 41 44 20 Cipher is AEAD
11640 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 (e.g. GCM or Cha
11650 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 Cha20/Poly1305)
11660 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 or not */../* Au
11670 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 thenticated Encr
11680 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f yption with asso
11690 63 69 61 74 65 64 20 64 61 74 61 20 28 41 45 41 ciated data (AEA
116a0 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 D) check */..LAP
116b0 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 PEND_BOOL(interp
116c0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 , objPtr, "ciphe
116d0 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f r_is_aead", SSL_
116e0 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 CIPHER_is_aead(c
116f0 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 ipher));.../* Di
11700 67 65 73 74 20 75 73 65 64 20 64 75 72 69 6e 67 gest used during
11710 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e the SSL/TLS han
11720 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e dshake when usin
11730 67 20 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f g the cipher. */
11740 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 ..md = SSL_CIPHE
11750 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f R_get_handshake_
11760 64 69 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a digest(cipher);.
11770 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
11780 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 erp, objPtr, "ha
11790 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c ndshake_digest",
117a0 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f (char *)EVP_MD_
117b0 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a name(md), -1);..
117c0 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d ./* Get OpenSSL-
117d0 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 specific ID, not
117e0 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 IANA ID */..LAP
117f0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
11800 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 objPtr, "cipher
11810 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f _id", (int) SSL_
11820 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 CIPHER_get_id(ci
11830 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f pher));.../* Two
11840 2d 62 79 74 65 20 49 44 20 75 73 65 64 20 69 6e -byte ID used in
11850 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f the TLS protoco
11860 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 l of the given c
11870 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e ipher */..LAPPEN
11880 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
11890 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f jPtr, "protocol_
118a0 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 id", (int) SSL_C
118b0 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 IPHER_get_protoc
118c0 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a ol_id(cipher));.
118d0 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 ../* Textual des
118e0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 cription of the
118f0 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 cipher */..if (S
11900 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 SL_CIPHER_descri
11910 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 ption(cipher, bu
11920 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 f, sizeof(buf))
11930 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
11940 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11950 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 rp, objPtr, "des
11960 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 cription", buf,
11970 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 -1);..}. }..
11980 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e /* Session in
11990 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f fo */. sessio
119a0 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 n = SSL_get_sess
119b0 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 ion(ssl);. if
119c0 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c (session != NUL
119d0 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 L) {..const unsi
119e0 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 gned char *ticke
119f0 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b t;..size_t len2;
11a00 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 ..unsigned int u
11a10 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 len;..const unsi
11a20 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 gned char *sessi
11a30 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 on_id, *proto;..
11a40 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f char buffer[SSL_
11a50 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c MAX_MASTER_KEY_L
11a60 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 ENGTH];.../* Rep
11a70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 ort the selected
11a80 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 protocol as a r
11a90 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 esult of the ALP
11aa0 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f N negotiation */
11ab0 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 ..SSL_SESSION_ge
11ac0 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 t0_alpn_selected
11ad0 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f (session, &proto
11ae0 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 , &len2);..LAPPE
11af0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11b00 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 bjPtr, "alpn", (
11b10 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 char *) proto, (
11b20 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b Tcl_Size) len2);
11b30 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 .../* Report the
11b40 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 selected protoc
11b50 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f ol as a result o
11b60 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 f the NPN negoti
11b70 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 ation */.#ifdef
11b80 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 USE_NPN..SSL_get
11b90 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 0_next_proto_neg
11ba0 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 otiated(ssl, &pr
11bb0 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 oto, &ulen);..LA
11bc0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11bd0 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c , objPtr, "npn",
11be0 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c (char *) proto,
11bf0 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e (Tcl_Size) ulen
11c00 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 );.#endif.../* R
11c10 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e esumable session
11c20 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
11c30 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
11c40 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 , "resumable", S
11c50 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 SL_SESSION_is_re
11c60 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 sumable(session)
11c70 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
11c80 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f start time (seco
11c90 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 nds since epoch)
11ca0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e */..LAPPEND_LON
11cb0 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 G(interp, objPtr
11cc0 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 , "start_time",
11cd0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
11ce0 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a time(session));.
11cf0 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c ../* Timeout val
11d00 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 ue - SSL_CTX_get
11d10 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 _timeout (in sec
11d20 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e onds) */..LAPPEN
11d30 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f D_LONG(interp, o
11d40 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 bjPtr, "timeout"
11d50 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 , SSL_SESSION_ge
11d60 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f t_timeout(sessio
11d70 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f n));.../* Sessio
11d80 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 n id - TLSv1.2 a
11d90 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f nd below only */
11da0 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 ..session_id = S
11db0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 SL_SESSION_get_i
11dc0 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e d(session, &ulen
11dd0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
11de0 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
11df0 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c r, "session_id",
11e00 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 session_id, (Tc
11e10 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a l_Size) ulen);..
11e20 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 ./* Session cont
11e30 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f ext */..session_
11e40 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e id = SSL_SESSION
11e50 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 _get0_id_context
11e60 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 (session, &ulen)
11e70 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 ;..LAPPEND_BARRA
11e80 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 Y(interp, objPtr
11e90 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 , "session_conte
11ea0 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c xt", session_id,
11eb0 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e (Tcl_Size) ulen
11ec0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
11ed0 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 ticket - client
11ee0 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 only */..SSL_SES
11ef0 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
11f00 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 (session, &ticke
11f10 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 t, &len2);..LAPP
11f20 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 END_BARRAY(inter
11f30 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 p, objPtr, "sess
11f40 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 ion_ticket", tic
11f50 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 ket, (Tcl_Size)
11f60 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 len2);.../* Sess
11f70 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 ion ticket lifet
11f80 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 ime hint (in sec
11f90 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e onds) */..LAPPEN
11fa0 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f D_LONG(interp, o
11fb0 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 bjPtr, "lifetime
11fc0 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 ", SSL_SESSION_g
11fd0 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 et_ticket_lifeti
11fe0 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 me_hint(session)
11ff0 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 );.../* Ticket a
12000 70 70 20 64 61 74 61 20 2a 2f 0a 09 53 53 4c 5f pp data */..SSL_
12010 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 SESSION_get0_tic
12020 6b 65 74 5f 61 70 70 64 61 74 61 28 73 65 73 73 ket_appdata(sess
12030 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
12040 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 en2);..LAPPEND_B
12050 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 ARRAY(interp, ob
12060 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 jPtr, "ticket_ap
12070 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c p_data", ticket,
12080 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
12090 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 );.../* Get mast
120a0 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 er key */..len2
120b0 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
120c0 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 t_master_key(ses
120d0 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 sion, buffer, SS
120e0 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 L_MAX_MASTER_KEY
120f0 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 _LENGTH);..LAPPE
12100 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 ND_BARRAY(interp
12110 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 , objPtr, "maste
12120 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20 r_key", buffer,
12130 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
12140 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 ;.../* Compressi
12150 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e on id */..unsign
12160 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f ed int id = SSL_
12170 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 SESSION_get_comp
12180 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 ress_id(session)
12190 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
121a0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
121b0 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c compression_id",
121c0 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 id == 1 ? "zlib
121d0 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b " : "none", -1);
121e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
121f0 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 ompression info
12200 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 */. if (ssl !
12210 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 = NULL) {.#ifdef
12220 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 HAVE_SSL_COMPRE
12230 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d SSION..const COM
12240 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 P_METHOD *comp,
12250 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 *expn;..comp = S
12260 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 SL_get_current_c
12270 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b ompression(ssl);
12280 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 ..expn = SSL_get
12290 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 _current_expansi
122a0 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 on(ssl);...LAPPE
122b0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
122c0 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 bjPtr, "compress
122d0 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c ion", comp ? SSL
122e0 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 _COMP_get_name(c
122f0 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d omp) : "none", -
12300 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 1);..LAPPEND_STR
12310 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12320 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 "expansion", ex
12330 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 pn ? SSL_COMP_ge
12340 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 t_name(expn) : "
12350 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 none", -1);.#els
12360 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 e..LAPPEND_STR(i
12370 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12380 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e compression", "n
12390 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 one", -1);..LAPP
123a0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
123b0 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 objPtr, "expansi
123c0 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 on", "none", -1)
123d0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a ;.#endif. }..
123e0 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e /* Server in
123f0 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e fo */. {..lon
12400 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 g mode = SSL_CTX
12410 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 _get_session_cac
12420 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 he_mode(statePtr
12430 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d ->ctx);..char *m
12440 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 sg;...if (mode &
12450 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
12460 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 OFF) {.. msg
12470 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 = "off";..} else
12480 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f if (mode & SSL_
12490 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e SESS_CACHE_CLIEN
124a0 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 T) {.. msg =
124b0 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 "client";..} els
124c0 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c e if (mode & SSL
124d0 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 _SESS_CACHE_SERV
124e0 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d ER) {.. msg =
124f0 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c "server";..} el
12500 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
12510 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 L_SESS_CACHE_BOT
12520 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 H) {.. msg =
12530 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 "both";..} else
12540 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e {.. msg = "un
12550 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 known";..}..LAPP
12560 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12570 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
12580 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 _cache_mode", ms
12590 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 g, -1);. }..
125a0 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f /* CA List */
125b0 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 . /* IF not a
125c0 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73 server, same as
125d0 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 SSL_get0_peer_C
125e0 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65 A_list. If serve
125f0 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 r same as SSL_CT
12600 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f X_get_client_CA_
12610 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 list */. list
12620 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
12630 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 tObj(0, NULL);.
12640 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 STACK_OF(X509
12650 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b _NAME) *ca_list;
12660 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73 . if ((ca_lis
12670 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 t = SSL_get_clie
12680 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 nt_CA_list(ssl))
12690 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 != NULL) {..cha
126a0 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d r buffer[BUFSIZ]
126b0 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 ;..for (int i =
126c0 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 0; i < sk_X509_N
126d0 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 AME_num(ca_list)
126e0 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 ; i++) {.. X5
126f0 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 09_NAME *name =
12700 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c sk_X509_NAME_val
12710 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a ue(ca_list, i);.
12720 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b . if (name) {
12730 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 ...X509_NAME_one
12740 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 line(name, buffe
12750 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 r, BUFSIZ);...Tc
12760 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
12770 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
12780 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 istPtr, Tcl_NewS
12790 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c tringObj(buffer,
127a0 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d -1));.. }..}
127b0 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 . }. LAPPE
127c0 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f ND_OBJ(interp, o
127d0 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c bjPtr, "caList",
127e0 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c listPtr);. L
127f0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
12800 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 p, objPtr, "caLi
12810 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 stCount", sk_X50
12820 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 9_NAME_num(ca_li
12830 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 st));.. Tcl_S
12840 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
12850 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
12860 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
12870 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
12880 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
12890 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
128a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
128b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
128c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
128d0 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 ------. *. * Ver
128e0 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 sionObjCmd -- re
128f0 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 turn version str
12900 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c ing from OpenSSL
12910 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
12920 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
12930 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
12940 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
12950 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129a0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
129b0 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c VersionObjCmd(Cl
129c0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
129d0 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
129e0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
129f0 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
12a00 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
12a10 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
12a20 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
12a30 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 alled");.. ob
12a40 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 jPtr = Tcl_NewSt
12a50 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f ringObj(OPENSSL_
12a60 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 VERSION_TEXT, -1
12a70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 );. Tcl_SetOb
12a80 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
12a90 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 objPtr);.. re
12aa0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
12ab0 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
12ac0 74 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f tData;..objc = o
12ad0 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a bjc;..objv = obj
12ae0 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d v;.}.../*. *----
12af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
12b30 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 *. * MiscObjCmd
12b40 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 -- misc command
12b50 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
12b60 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
12b70 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
12b80 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
12b90 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
12ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12be0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
12bf0 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e MiscObjCmd(Clien
12c00 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
12c10 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
12c20 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
12c30 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
12c40 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 bjv[]) {. sta
12c50 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tic const char *
12c60 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 commands [] = {
12c70 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c "req", "strreq",
12c80 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 NULL };. enu
12c90 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 m command { C_RE
12ca0 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 Q, C_STRREQ, C_D
12cb0 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f UMMY };. Tcl_
12cc0 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e Size cmd;. in
12cd0 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 t isStr;. cha
12ce0 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b r buffer[16384];
12cf0 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
12d00 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
12d10 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 (objc < 2) {..T
12d20 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
12d30 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
12d40 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 "subcommand ?ar
12d50 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 gs?");..return T
12d60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
12d70 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 if (Tcl_GetI
12d80 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 ndexFromObj(inte
12d90 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d rp, objv[1], com
12da0 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 mands, "command"
12db0 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 , 0, &cmd) != TC
12dc0 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
12dd0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
12de0 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f .. ERR_clear_
12df0 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 error();.. is
12e00 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f Str = (cmd == C_
12e10 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 STRREQ);. swi
12e20 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 tch ((enum comma
12e30 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 nd) cmd) {..case
12e40 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f C_REQ:..case C_
12e50 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 STRREQ: {.. E
12e60 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 VP_PKEY *pkey=NU
12e70 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 LL;.. X509 *c
12e80 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 ert=NULL;.. X
12e90 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 509_NAME *name=N
12ea0 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 ULL;.. Tcl_Ob
12eb0 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 j **listv;..
12ec0 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a Tcl_Size listc;.
12ed0 09 20 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20 . int i;...
12ee0 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b BIO *out=NULL;
12ef0 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 ... char *k_C
12f00 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f ="",*k_ST="",*k_
12f10 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f L="",*k_O="",*k_
12f20 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a OU="",*k_CN="",*
12f30 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 k_Email="";..
12f40 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 char *keyout,*p
12f50 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 emout,*str;..
12f60 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 int keysize,ser
12f70 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a ial=0,days=365;.
12f80 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
12f90 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
12fa0 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 30000000L.. B
12fb0 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c IGNUM *bne = NUL
12fc0 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 L;.. RSA *rsa
12fd0 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 = NULL;.#else..
12fe0 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 EVP_PKEY_CTX
12ff0 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 *ctx = NULL;.#e
13000 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 ndif... if ((
13010 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 objc<5) || (objc
13020 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f >6)) {...Tcl_Wro
13030 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
13040 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 , 2, objv, "keys
13050 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 ize keyfile cert
13060 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 file ?info?");..
13070 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
13080 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 R;.. }...
13090 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 if (Tcl_GetIntFr
130a0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
130b0 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 jv[2], &keysize)
130c0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 != TCL_OK) {...
130d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
130e0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 ;.. }.. ke
130f0 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 yout=Tcl_GetStri
13100 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 ng(objv[3]);..
13110 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 pemout=Tcl_Get
13120 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b String(objv[4]);
13130 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72 29 .. if (isStr)
13140 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 {...Tcl_SetVar(
13150 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 interp,keyout,""
13160 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 ,0);...Tcl_SetVa
13170 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c r(interp,pemout,
13180 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 "",0);.. }...
13190 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 if (objc>=6)
131a0 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 {...if (Tcl_Lis
131b0 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 tObjGetElements(
131c0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c interp, objv[5],
131d0 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 &listc, &listv)
131e0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 != TCL_OK) {...
131f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
13200 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 RROR;...}....if
13210 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 ((listc%2) != 0)
13220 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 {... Tcl_Set
13230 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 Result(interp,"I
13240 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 nformation list
13250 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e must have even n
13260 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e umber of argumen
13270 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 ts",NULL);...
13280 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
13290 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d R;...}...for (i=
132a0 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 0; i<listc; i+=2
132b0 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 ) {... str=Tc
132c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
132d0 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 v[i]);... if
132e0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 (strcmp(str,"day
132f0 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 s")==0) {....if
13300 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
13310 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b bj(interp,listv[
13320 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c i+1],&days)!=TCL
13330 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 _OK).... retu
13340 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
13350 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
13360 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 trcmp(str,"seria
13370 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 l")==0) {....if
13380 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
13390 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b bj(interp,listv[
133a0 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 i+1],&serial)!=T
133b0 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 CL_OK).... re
133c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
133d0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
133e0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 (strcmp(str,"C")
133f0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 ==0) {....k_C=Tc
13400 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
13410 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
13420 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
13430 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b (str,"ST")==0) {
13440 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 ....k_ST=Tcl_Get
13450 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
13460 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
13470 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
13480 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "L")==0) {....k_
13490 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 L=Tcl_GetString(
134a0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
134b0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
134c0 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 rcmp(str,"O")==0
134d0 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 ) {....k_O=Tcl_G
134e0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
134f0 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
13500 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
13510 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 r,"OU")==0) {...
13520 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 .k_OU=Tcl_GetStr
13530 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
13540 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
13550 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e (strcmp(str,"CN
13560 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e ")==0) {....k_CN
13570 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
13580 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
13590 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
135a0 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 cmp(str,"Email")
135b0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 ==0) {....k_Emai
135c0 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 l=Tcl_GetString(
135d0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
135e0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 } else {....T
135f0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
13600 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 erp,"Unknown par
13610 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 ameter",NULL);..
13620 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
13630 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a OR;... }...}.
13640 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e . }..#if OPEN
13650 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
13660 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
13670 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e .. bne = BN_n
13680 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d ew();.. rsa =
13690 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 RSA_new();..
136a0 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 pkey = EVP_PKEY
136b0 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 _new();.. if
136c0 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 (bne == NULL ||
136d0 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 rsa == NULL || p
136e0 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 key == NULL || !
136f0 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c BN_set_word(bne,
13700 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 RSA_F4) ||...!RS
13710 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 A_generate_key_e
13720 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 x(rsa, keysize,
13730 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 bne, NULL) || !E
13740 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 VP_PKEY_assign_R
13750 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b SA(pkey, rsa)) {
13760 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
13770 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 (pkey);.../* RSA
13780 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 _free(rsa); free
13790 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 d by EVP_PKEY_fr
137a0 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 ee */...BN_free(
137b0 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 bne);.#else..
137c0 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f pkey = EVP_RSA_
137d0 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e gen((unsigned in
137e0 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 t) keysize);..
137f0 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 ctx = EVP_PKEY
13800 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 _CTX_new(pkey,NU
13810 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b LL);.. if (pk
13820 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 ey == NULL || ct
13830 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 x == NULL || !EV
13840 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e P_PKEY_keygen_in
13850 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 it(ctx) ||...!EV
13860 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 P_PKEY_CTX_set_r
13870 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 sa_keygen_bits(c
13880 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 tx, keysize) ||
13890 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e !EVP_PKEY_keygen
138a0 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a (ctx, &pkey)) {.
138b0 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 ..EVP_PKEY_free(
138c0 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 pkey);...EVP_PKE
138d0 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b Y_CTX_free(ctx);
138e0 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 .#endif...Tcl_Se
138f0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
13900 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 Error generating
13910 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 private key",NU
13920 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 LL);...return TC
13930 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 L_ERROR;.. }
13940 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 else {...if (isS
13950 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d tr) {... out=
13960 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 BIO_new(BIO_s_me
13970 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f m());... PEM_
13980 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 write_bio_Privat
13990 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 eKey(out,pkey,NU
139a0 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e LL,NULL,0,NULL,N
139b0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 ULL);... i=BI
139c0 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 O_read(out,buffe
139d0 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 r,sizeof(buffer)
139e0 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c -1);... i=(i<
139f0 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 0) ? 0 : i;...
13a00 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 buffer[i]='\0'
13a10 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 ;... Tcl_SetV
13a20 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 ar(interp,keyout
13a30 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 ,buffer,0);...
13a40 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 BIO_flush(out)
13a50 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 ;... BIO_free
13a60 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 (out);...} else
13a70 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f {... out=BIO_
13a80 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 new(BIO_s_file()
13a90 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 );... BIO_wri
13aa0 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c te_filename(out,
13ab0 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 keyout);... P
13ac0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 EM_write_bio_Pri
13ad0 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 vateKey(out,pkey
13ae0 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c ,NULL,NULL,0,NUL
13af0 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f L,NULL);... /
13b00 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f * PEM_write_bio_
13b10 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 RSAPrivateKey(ou
13b20 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 t, rsa, NULL, NU
13b30 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c LL, 0, NULL, NUL
13b40 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f L); */... BIO
13b50 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a _free_all(out);.
13b60 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 . .}....if ((cer
13b70 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e t=X509_new())==N
13b80 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c ULL) {... Tcl
13b90 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
13ba0 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 p,"Error generat
13bb0 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20 ing certificate
13bc0 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a request",NULL);.
13bd0 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 .. EVP_PKEY_f
13be0 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
13bf0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
13c00 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
13c10 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 00L... BN_fre
13c20 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 e(bne);.#endif..
13c30 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f . return(TCL_
13c40 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 ERROR);...}....X
13c50 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 509_set_version(
13c60 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f cert,2);...ASN1_
13c70 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 INTEGER_set(X509
13c80 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 _get_serialNumbe
13c90 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b r(cert),serial);
13ca0 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 ...X509_gmtime_a
13cb0 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 dj(X509_getm_not
13cc0 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b Before(cert),0);
13cd0 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 ...X509_gmtime_a
13ce0 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 dj(X509_getm_not
13cf0 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e After(cert),(lon
13d00 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 g)60*60*24*days)
13d10 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 ;...X509_set_pub
13d20 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a key(cert,pkey);.
13d30 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 ...name=X509_get
13d40 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 _subject_name(ce
13d50 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d rt);....X509_NAM
13d60 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
13d70 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 xt(name,"C", MBS
13d80 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
13d90 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
13da0 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 *) k_C, -1, -1,
13db0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
13dc0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
13dd0 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 (name,"ST", MBST
13de0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
13df0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
13e00 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 ) k_ST, -1, -1,
13e10 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
13e20 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
13e30 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 (name,"L", MBSTR
13e40 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
13e50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
13e60 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_L, -1, -1, 0)
13e70 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
13e80 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
13e90 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e ame,"O", MBSTRIN
13ea0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
13eb0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
13ec0 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a _O, -1, -1, 0);.
13ed0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
13ee0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
13ef0 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 e,"OU", MBSTRING
13f00 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
13f10 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
13f20 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a OU, -1, -1, 0);.
13f30 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
13f40 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
13f50 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 e,"CN", MBSTRING
13f60 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
13f70 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
13f80 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a CN, -1, -1, 0);.
13f90 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
13fa0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
13fb0 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 e,"Email", MBSTR
13fc0 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
13fd0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
13fe0 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 k_Email, -1, -1
13ff0 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 , 0);....X509_se
14000 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 t_subject_name(c
14010 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 ert,name);....if
14020 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 (!X509_sign(cer
14030 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 t,pkey,EVP_sha25
14040 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 6())) {... X5
14050 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09_free(cert);..
14060 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 . EVP_PKEY_fr
14070 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 ee(pkey);.#if OP
14080 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
14090 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
140a0 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 0L... BN_free
140b0 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 (bne);.#endif...
140c0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
140d0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
140e0 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 signing certific
140f0 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 ate",NULL);...
14100 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
14110 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 OR;...}....if (i
14120 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 sStr) {... ou
14130 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
14140 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 mem());... PE
14150 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 M_write_bio_X509
14160 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 (out,cert);...
14170 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 i=BIO_read(out
14180 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 ,buffer,sizeof(b
14190 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 uffer)-1);...
141a0 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 i=(i<0) ? 0 : i
141b0 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 ;... buffer[i
141c0 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 ]='\0';... Tc
141d0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
141e0 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 pemout,buffer,0)
141f0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 ;... BIO_flus
14200 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 h(out);... BI
14210 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d O_free(out);...}
14220 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 else {... ou
14230 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
14240 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 file());... B
14250 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d IO_write_filenam
14260 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 e(out,pemout);..
14270 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
14280 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
14290 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
142a0 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a e_all(out);...}.
142b0 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 ...X509_free(cer
142c0 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 t);...EVP_PKEY_f
142d0 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
142e0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
142f0 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
14300 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 00L...BN_free(bn
14310 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 e);.#endif..
14320 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 }..}..break;.
14330 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b default:..break
14340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
14350 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
14360 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
14370 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a ata;.}.../******
14380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
14390 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 /* Init
143a0 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a */./********
143b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f ************/../
143c0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
143d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
143e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
143f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14400 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
14410 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 s_Free --. *. *.
14420 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 This procedure c
14430 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 leans up when a
14440 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 SSL socket based
14450 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 channel. *.is c
14460 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 losed and its re
14470 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 ference count fa
14480 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 lls below 1. *.
14490 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f * Results:. *.no
144a0 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
144b0 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 fects:. *.Frees
144c0 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a all the state. *
144d0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
144e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14510 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a ------. */.void.
14520 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a 62 Tls_Free(char *b
14530 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 lockPtr) {. S
14540 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
14550 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 (State *)blockP
14560 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 tr;.. dprintf
14570 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
14580 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 Tls_Clean(state
14590 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 Ptr);. ckfree
145a0 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a (blockPtr);.}...
145b0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
145c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145f0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
14600 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 ls_Clean --. *.
14610 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
14620 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 cleans up when
14630 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 a SSL socket bas
14640 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 ed channel. *.is
14650 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 closed and its
14660 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 reference count
14670 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 falls below 1.
14680 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 This should. *.b
14690 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f e called synchro
146a0 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c nously by the Cl
146b0 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 oseProc, not in
146c0 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c the. *.Eventuall
146d0 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a yFree callback..
146e0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
146f0 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.none. *. * Sid
14700 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 e effects:. *.Fr
14710 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 ees all the stat
14720 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
14730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 ----------. */.v
14770 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 oid Tls_Clean(St
14780 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b ate *statePtr) {
14790 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
147a0 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a lled");.. /*.
147b0 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 * we're ass
147c0 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 uming here that
147d0 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 we're single-thr
147e0 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 eaded. */.
147f0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
14800 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 timer != (Tcl_Ti
14810 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 merToken) NULL)
14820 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d {..Tcl_DeleteTim
14830 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 erHandler(stateP
14840 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 tr->timer);..sta
14850 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e tePtr->timer = N
14860 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
14870 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 if (statePtr->pr
14880 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 otos) {..ckfree(
14890 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
148a0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 );..statePtr->pr
148b0 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 otos = NULL;.
148c0 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
148d0 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 Ptr->bio) {../*
148e0 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 This will call S
148f0 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 SL_shutdown. Bug
14900 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 1414045 */..dpr
14910 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 intf("BIO_free_a
14920 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 ll(%p)", statePt
14930 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 r->bio);..BIO_fr
14940 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d ee_all(statePtr-
14950 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 >bio);..statePtr
14960 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->bio = NULL;.
14970 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
14980 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 ePtr->ssl) {..dp
14990 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 rintf("SSL_free(
149a0 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e %p)", statePtr->
149b0 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 ssl);..SSL_free(
149c0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
149d0 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d .statePtr->ssl =
149e0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
149f0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
14a00 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 tx) {..SSL_CTX_f
14a10 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ree(statePtr->ct
14a20 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 x);..statePtr->c
14a30 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d tx = NULL;. }
14a40 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
14a50 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 r->callback) {..
14a60 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
14a70 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
14a80 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ack);..statePtr-
14a90 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c >callback = NULL
14aa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
14ab0 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
14ac0 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 rd) {..Tcl_DecrR
14ad0 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
14ae0 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 ->password);..st
14af0 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
14b00 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
14b10 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
14b20 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 >vcmd) {..Tcl_De
14b30 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
14b40 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 Ptr->vcmd);..sta
14b50 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 tePtr->vcmd = NU
14b60 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 LL;. }.. d
14b70 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
14b80 67 22 29 3b 0a 7d 0a 0c 0a 23 69 66 20 54 43 4c g");.}...#if TCL
14b90 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e _MAJOR_VERSION >
14ba0 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56 8.#define MIN_V
14bb0 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65 6c ERSION "9.0".#el
14bc0 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56 se.#define MIN_V
14bd0 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65 6e ERSION "8.5".#en
14be0 64 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d dif../*. *------
14bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
14c30 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a . * Tls_Init --.
14c40 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 *. *.This is a
14c50 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 package initiali
14c60 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 zation procedure
14c70 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 , which is calle
14c80 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e d. *.by Tcl when
14c90 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 this package is
14ca0 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 to be added to
14cb0 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a an interpreter..
14cc0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 *. * Results:
14cd0 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 Ssl configured a
14ce0 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 nd loaded. *. *
14cf0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
14d00 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c . create the ssl
14d10 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 command, initia
14d20 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 lize ssl context
14d30 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
14d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c ---------. */.DL
14d80 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f LEXPORT int Tls_
14d90 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 Init(Tcl_Interp
14da0 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63 *interp) {. c
14db0 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c onst char tlsTcl
14dc0 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b InitScript[] = {
14dd0 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 .#include "tls.t
14de0 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 cl.h"..0x00.
14df0 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 };.. dprintf(
14e00 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64 "Called");..#ifd
14e10 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 ef USE_TCL_STUBS
14e20 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 . if (Tcl_Ini
14e30 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d tStubs(interp, M
14e40 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d IN_VERSION, 0) =
14e50 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
14e60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
14e70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 }.#endif. if
14e80 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 (Tcl_PkgRequire
14e90 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 (interp, "Tcl",
14ea0 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 MIN_VERSION, 0)
14eb0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
14ec0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
14ed0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 }.. if (Tls
14ee0 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 LibInit(0) != TC
14ef0 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 L_OK) {..Tcl_App
14f00 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
14f10 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 , "could not ini
14f20 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 tialize SSL libr
14f30 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ary", (char *) N
14f40 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
14f50 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
14f60 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
14f70 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
14f80 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c "tls::ciphers",
14f90 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 CiphersObjCmd,
14fa0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
14fb0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
14fc0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
14fd0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
14fe0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
14ff0 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c ls::connection",
15000 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f ConnectionInfoO
15010 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
15020 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
15030 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
15040 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
15050 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
15060 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 erp, "tls::hands
15070 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 hake", Handshake
15080 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
15090 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
150a0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
150b0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
150c0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
150d0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f terp, "tls::impo
150e0 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d rt", ImportObjCm
150f0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
15100 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
15110 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
15120 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
15130 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
15140 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 "tls::unimport"
15150 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 , UnimportObjCmd
15160 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
15170 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15180 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
15190 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
151a0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
151b0 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 "tls::status", S
151c0 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c tatusObjCmd, (Cl
151d0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
151e0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
151f0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
15200 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
15210 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
15220 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 :version", Versi
15230 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e onObjCmd, (Clien
15240 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
15250 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
15260 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
15270 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
15280 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 interp, "tls::mi
15290 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c sc", MiscObjCmd,
152a0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
152b0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
152c0 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
152d0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
152e0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
152f0 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c tls::protocols",
15300 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 ProtocolsObjCmd
15310 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
15320 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15330 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a Proc *) NULL);..
15340 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 29 20 if (interp)
15350 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 {..Tcl_Eval(inte
15360 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 rp, tlsTclInitSc
15370 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 ript);. }..
15380 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 return Tcl_Pkg
15390 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 Provide(interp,
153a0 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 PACKAGE_NAME, PA
153b0 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a CKAGE_VERSION);.
153c0 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
153d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
153e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
153f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
15400 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e *. *.Tls_SafeIn
15410 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d it --. *. *.----
15420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
15450 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 .Standard proced
15460 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20 ure required by
15470 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 'load'.. *.Initi
15480 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 alizes this exte
15490 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 nsion for a safe
154a0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a interpreter.. *
154b0 09 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 2d 2d 2d 2d ----------------
154e0 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 -*. *. *.Side ef
154f0 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 fects:. *..As of
15500 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 'Tls_Init'. *.
15510 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 *.Result:. *..A
15520 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 standard Tcl err
15530 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d or code.. *. *--
15540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15570 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 ----*. */.DLLEXP
15580 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 ORT int Tls_Safe
15590 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 Init(Tcl_Interp
155a0 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 *interp) {. d
155b0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
155c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 6c 73 ;. return(Tls
155d0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b 0a _Init(interp));.
155e0 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
155f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
15620 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 *. *.TlsLibInit
15630 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d --. *. *.------
15640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 ----------*. *.I
15670 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c nitializes SSL l
15680 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 ibrary once per
15690 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d application. *.-
156a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
156b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
156c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
156d0 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 . *. *.Side effe
156e0 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c cts:. *..initial
156f0 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 izes SSL library
15700 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 . *. *.Result:.
15710 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *..none. *. *---
15720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15750 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ---*. */.static
15760 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 int TlsLibInit(i
15770 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 nt uninitialize)
15780 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e {. static in
15790 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 t initialized =
157a0 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75 0;. int statu
157b0 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 s = TCL_OK;.#if
157c0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
157d0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
157e0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
157f0 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f . size_t num_
15800 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 locks;.#endif..
15810 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c if (uninitial
15820 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 ize) {..if (!ini
15830 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 tialized) {..
15840 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 dprintf("Asked
15850 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c to uninitialize,
15860 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 but we are not
15870 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a initialized");..
15880 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f . return(TCL_
15890 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 OK);..}...dprint
158a0 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e f("Asked to unin
158b0 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 itialize");..#if
158c0 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
158d0 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
158e0 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
158f0 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b )..Tcl_MutexLock
15900 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 (&init_mx);...if
15910 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 (locks) {..
15920 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 free(locks);..
15930 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a locks = NULL;.
15940 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 . locksCount
15950 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 = 0;..}.#endif..
15960 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b initialized = 0;
15970 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
15980 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
15990 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
159a0 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 READS)..Tcl_Mute
159b0 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 xUnlock(&init_mx
159c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 );.#endif...retu
159d0 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 rn(TCL_OK);.
159e0 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 }.. if (initi
159f0 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e alized) {..dprin
15a00 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 tf("Called, but
15a10 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c using cached val
15a20 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 28 73 74 ue");..return(st
15a30 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 atus);. }..
15a40 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
15a50 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 d");..#if define
15a60 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
15a70 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
15a80 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 L_THREADS). T
15a90 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e cl_MutexLock(&in
15aa0 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 it_mx);.#endif.
15ab0 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d initialized =
15ac0 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 1;..#if defined
15ad0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
15ae0 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
15af0 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 _THREADS). nu
15b00 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 m_locks = 1;.
15b10 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 locksCount = (i
15b20 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 nt) num_locks;.
15b30 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f locks = mallo
15b40 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 c(sizeof(*locks)
15b50 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 * num_locks);.
15b60 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c memset(locks,
15b70 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 0, sizeof(*lock
15b80 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b s) * num_locks);
15b90 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
15ba0 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 Initialize BOTH
15bb0 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 libcrypto and li
15bc0 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 bssl. */. OPE
15bd0 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 NSSL_init_ssl(OP
15be0 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f ENSSL_INIT_LOAD_
15bf0 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 SSL_STRINGS | OP
15c00 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f ENSSL_INIT_LOAD_
15c10 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 CRYPTO_STRINGS..
15c20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 | OPENSSL_INIT_A
15c30 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c DD_ALL_CIPHERS |
15c40 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 OPENSSL_INIT_AD
15c50 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e D_ALL_DIGESTS, N
15c60 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e ULL);.. BIO_n
15c70 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b ew_tcl(NULL, 0);
15c80 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 ..#if 0. /*.
15c90 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 * XXX:TODO:
15ca0 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65 Remove this code
15cb0 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 and replace it
15cc0 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20 with a check.
15cd0 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 * for enough e
15ce0 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f ntropy and do no
15cf0 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 t try to create
15d00 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 our own. * t
15d10 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a errible entropy.
15d20 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 */. /*.
15d30 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 * Seed the r
15d40 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e andom number gen
15d50 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 erator in the SS
15d60 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 L library,.
15d70 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 * using the do/w
15d80 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 hile construct b
15d90 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 ecause of the bu
15da0 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 g note in the.
15db0 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 * OpenSSL FAQ
15dc0 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f at http://www.o
15dd0 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f penssl.org/suppo
15de0 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 rt/faq.html#USER
15df0 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 1. *. *
15e00 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 The crux of the
15e10 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 problem is that
15e20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e Solaris 7 does n
15e30 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a ot have a. *
15e40 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 /dev/random or
15e50 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 /dev/urandom dev
15e60 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 ice so it cannot
15e70 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 gather enough.
15e80 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 * entropy fr
15e90 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 om the RAND_seed
15ea0 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 () when TLS init
15eb0 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 ializes and refu
15ec0 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f ses. * to go
15ed0 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 further. Earlie
15ee0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 r versions of Op
15ef0 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e enSSL carried on
15f00 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 regardless..
15f10 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 */. srand((
15f20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 unsigned int) ti
15f30 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 me((time_t *) NU
15f40 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 LL));. do {..
15f50 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 for (i = 0; i <
15f60 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 16; i++) {..
15f70 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 rnd_seed[i] = 1
15f80 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 + (char) (255.0
15f90 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d * rand()/(RAND_M
15fa0 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 AX+1.0));..}..RA
15fb0 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 ND_seed(rnd_seed
15fc0 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 , sizeof(rnd_see
15fd0 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 d));. } while
15fe0 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 (RAND_status()
15ff0 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 != 1);.#endif..#
16000 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
16010 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
16020 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
16030 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e DS)..Tcl_MutexUn
16040 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a lock(&init_mx);.
16050 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 #endif...return(
16060 73 74 61 74 75 73 29 3b 0a 7d 0a status);.}.