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 3b 0a 0a 20 20 20 20 54 63 ode, ok;.. Tc
0bd0: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 l_Preserve((Clie
0be0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
0bf0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 . Tcl_Preserv
0c00: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
0c10: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f tatePtr);.. /
0c20: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
0c30: 77 69 74 68 20 73 75 63 63 65 73 73 20 66 6f 72 with success for
0c40: 20 6f 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61 ok or return va
0c50: 6c 75 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20 lue 1, fail for
0c60: 65 72 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20 error or return
0c70: 76 61 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 63 value 0 */. c
0c80: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 ode = Tcl_EvalOb
0c90: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 jEx(interp, cmdP
0ca0: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f tr, TCL_EVAL_GLO
0cb0: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f BAL);. if (co
0cc0: 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a de == TCL_OK) {.
0cd0: 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74 ./* Check result
0ce0: 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 for return valu
0cf0: 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 e */..Tcl_Obj *r
0d00: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f esult = Tcl_GetO
0d10: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 bjResult(interp)
0d20: 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d ;..if (result ==
0d30: 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 NULL || Tcl_Get
0d40: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 IntFromObj(inter
0d50: 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 p, result, &ok)
0d60: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
0d70: 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 20 20 ok = 1;..}.
0d80: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 72 } else {../* Er
0d90: 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65 ror - reject the
0da0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
0db0: 09 6f 6b 20 3d 20 30 3b 0a 23 69 66 20 28 54 43 .ok = 0;.#if (TC
0dc0: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
0dd0: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 == 8) && (TCL_MI
0de0: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 NOR_VERSION < 6)
0df0: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
0e00: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 Error(interp);.#
0e10: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 else..Tcl_Backgr
0e20: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e oundException(in
0e30: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e terp, code);.#en
0e40: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 dif. }.. T
0e50: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
0e60: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
0e70: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 );. Tcl_Relea
0e80: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
0e90: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 interp);. ret
0ea0: 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 urn ok;.}.../*.
0eb0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ef0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 ----. *. * InfoC
0f00: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a allback --. *. *
0f10: 09 6d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f .monitors SSL co
0f20: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 nnection process
0f30: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
0f40: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
0f50: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
0f60: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
0f70: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fc0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 ---. */.static v
0fd0: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b oid.InfoCallback
0fe0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c (const SSL *ssl,
0ff0: 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20 int where, int
1000: 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65 ret) {. State
1010: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
1020: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 ate*)SSL_get_app
1030: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c _data((SSL *)ssl
1040: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 );. Tcl_Inter
1050: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
1060: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
1070: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
1080: 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 6a r;. char *maj
1090: 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 3b or; char *minor;
10a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
10b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
10c0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
10d0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
10e0: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b *)NULL)..return;
10f0: 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 .. if (where
1100: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 & SSL_CB_HANDSHA
1110: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a KE_START) {..maj
1120: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 or = "handshake"
1130: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 ;..minor = "star
1140: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 t";. } else i
1150: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
1160: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 B_HANDSHAKE_DONE
1170: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 ) {..major = "ha
1180: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 ndshake";..minor
1190: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d = "done";. }
11a0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 else {..if (whe
11b0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 re & SSL_CB_ALER
11c0: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 T)..major = "ale
11d0: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 rt";..else if (w
11e0: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f here & SSL_ST_CO
11f0: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 NNECT).major = "
1200: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 connect";..else
1210: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
1220: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f ST_ACCEPT)..majo
1230: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 r = "accept";..e
1240: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 lse.....major =
1250: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 "unknown";...if
1260: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1270: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 READ)..minor = "
1280: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 read";..else if
1290: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
12a0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 WRITE)..minor =
12b0: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 "write";..else i
12c0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
12d0: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d B_LOOP)..minor =
12e0: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 "loop";..else i
12f0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
1300: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d B_EXIT)..minor =
1310: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 "exit";..else..
1320: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e ...minor = "unkn
1330: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 own";. }..
1340: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
1350: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
1360: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
1370: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
1380: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
1390: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
13a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
13b0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
13c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
13d0: 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 info", -1));.
13e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
13f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
1400: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
1410: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1420: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
1430: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
1440: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 f), -1));. Tc
1450: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1460: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
1470: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
1480: 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d ringObj(major, -
1490: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
14a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
14b0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
14c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
14d0: 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a bj(minor, -1));.
14e0: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 . if (where &
14f0: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b SSL_CB_ALERT) {
1500: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
1510: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1520: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
1530: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1540: 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f (SSL_alert_desc_
1550: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 string_long(ret)
1560: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
1570: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1580: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
1590: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
15a0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 ringObj(SSL_aler
15b0: 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f t_type_string_lo
15c0: 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 ng(ret), -1));.
15d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c } else {..Tcl
15e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
15f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
1600: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
1610: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
1620: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e state_string_lon
1630: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 g(ssl), -1));..T
1640: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1650: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1660: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
1670: 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c tringObj("info",
1680: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 -1));. }..
1690: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
16a0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
16b0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
16c0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
16d0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
16e0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
16f0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
1700: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
1710: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Ptr);.}.../*. *-
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1760: 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 --. *. * VerifyC
1770: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a allback --. *. *
1780: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 .Monitors SSL ce
1790: 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 rtificate valida
17a0: 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 tion process. Us
17b0: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 ed to control th
17c0: 65 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 e. *.behavior wh
17d0: 65 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 en the SSL_VERIF
17e0: 59 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 Y_PEER flag is s
17f0: 65 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c et. This is call
1800: 65 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 ed. *.whenever a
1810: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 certificate is
1820: 69 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 inspected or dec
1830: 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 0a 20 2a ided invalid.. *
1840: 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 63 . * Checks:. *.c
1850: 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69 6e ertificate chain
1860: 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61 72 is checked star
1870: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64 65 ting with the de
1880: 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c 65 epest nesting le
1890: 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72 6f vel. *. (the ro
18a0: 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74 ot CA certificat
18b0: 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75 70 e) and worked up
18c0: 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65 72 ward to the peer
18d0: 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e 0a 's certificate..
18e0: 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72 65 *.All signature
18f0: 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75 72 s are valid, cur
1900: 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69 74 rent time is wit
1910: 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c 61 hin first and la
1920: 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d 65 st validity time
1930: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74 20 .. *.Check that
1940: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
1950: 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68 65 is issued by the
1960: 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69 63 issuer certific
1970: 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09 43 ate issuer.. *.C
1980: 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61 74 heck the revocat
1990: 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20 65 ion status for e
19a0: 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65 2e ach certificate.
19b0: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76 61 . *.Check the va
19c0: 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67 69 lidity of the gi
19d0: 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65 20 ven CRL and the
19e0: 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e 20 cert revocation
19f0: 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63 6b status.. *.Check
1a00: 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f 66 the policies of
1a10: 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66 69 all the certifi
1a20: 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67 73 cates. *. * Args
1a30: 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f 6b . *.preverify_ok
1a40: 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 68 indicates wheth
1a50: 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63 61 er the certifica
1a60: 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 te verification
1a70: 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e 6f passed (1) or no
1a80: 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73 75 t (0). *. * Resu
1a90: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 lts:. *.A callba
1aa0: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 ck bound to the
1ab0: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72 socket may retur
1ac0: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 n one of:. *.
1ad0: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 0...- the certi
1ae0: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 ficate is deemed
1af0: 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20 76 invalid, send v
1b00: 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09 09 erification. *..
1b10: 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65 72 .. failure aler
1b20: 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20 74 t to peer, and t
1b30: 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68 61 erminate handsha
1b40: 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09 2d ke.. *. 1...-
1b50: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
1b60: 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69 64 is deemed valid
1b70: 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 , continue with
1b80: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 handshake.. *.
1b90: 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09 2d empty string.-
1ba0: 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 65 no change to ce
1bb0: 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 rtificate valida
1bc0: 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 tion. *. * Side
1bd0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 effects:. *.The
1be0: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 err field of the
1bf0: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 currently opera
1c00: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 tive State is se
1c10: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 t. *. to a stri
1c20: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 ng describing th
1c30: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f e SSL negotiatio
1c40: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e n failure reason
1c50: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
1c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
1ca0: 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79 43 atic int.VerifyC
1cb0: 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 allback(int ok,
1cc0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a X509_STORE_CTX *
1cd0: 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f ctx) {. Tcl_O
1ce0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
1cf0: 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 53 SSL *ssl..= (S
1d00: 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43 SL*)X509_STORE_C
1d10: 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63 TX_get_ex_data(c
1d20: 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64 tx, SSL_get_ex_d
1d30: 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43 ata_X509_STORE_C
1d40: 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58 TX_idx());. X
1d50: 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35 509 *cert..= X5
1d60: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
1d70: 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74 _current_cert(ct
1d80: 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 x);. State *s
1d90: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 tatePtr.= (State
1da0: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
1db0: 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c ta(ssl);. Tcl
1dc0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
1dd0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
1de0: 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70 74 rp;. int dept
1df0: 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f h..= X509_STORE_
1e00: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65 CTX_get_error_de
1e10: 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69 6e pth(ctx);. in
1e20: 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53 54 t err..= X509_ST
1e30: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f ORE_CTX_get_erro
1e40: 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70 72 r(ctx);.. dpr
1e50: 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25 64 intf("Verify: %d
1e60: 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20 ", ok);.. if
1e70: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 (statePtr->vcmd
1e80: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
1e90: 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65 50 L) {..if (stateP
1ea0: 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c tr->vflags & SSL
1eb0: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f _VERIFY_FAIL_IF_
1ec0: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a NO_PEER_CERT) {.
1ed0: 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a . return ok;.
1ee0: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 .} else {.. r
1ef0: 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 eturn 1;..}.
1f00: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 }.. /* Create
1f10: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c command to eval
1f20: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
1f30: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
1f40: 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 j(statePtr->vcmd
1f50: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
1f60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1f70: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1f80: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1f90: 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b ("verify", -1));
1fa0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1fb0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1fc0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 terp, cmdPtr,..T
1fd0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1fe0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
1ff0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
2000: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 f), -1));. Tc
2010: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2020: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
2030: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e mdPtr, Tcl_NewIn
2040: 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a 20 20 tObj(depth));.
2050: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2060: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2070: 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f 4e p, cmdPtr, Tls_N
2080: 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 ewX509Obj(interp
2090: 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 54 63 , cert));. Tc
20a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
20b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
20c0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e mdPtr, Tcl_NewIn
20d0: 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20 54 tObj(ok));. T
20e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
20f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2100: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 cmdPtr,..Tcl_New
2110: 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a StringObj((char*
2120: 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 )X509_verify_cer
2130: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 t_error_string(e
2140: 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 rr), -1));..
2150: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
2160: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 |= TLS_TCL_CALLB
2170: 41 43 4b 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 ACK;.. /* Eva
2180: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
2190: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
21a0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
21b0: 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 r);. ok = Eva
21c0: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
21d0: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
21e0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 tr);. Tcl_Dec
21f0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
2200: 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 );.. statePtr
2210: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 ->flags &= ~(TLS
2220: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 0a _TCL_CALLBACK);.
2230: 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 3b 09 return(ok);.
2240: 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 6c /* By default, l
2250: 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69 6f eave verificatio
2260: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a n unchanged. */.
2270: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
22c0: 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a * Tls_Error --.
22d0: 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c *. *.Calls call
22e0: 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74 20 6f back with list o
22f0: 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 f errors.. *. *
2300: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
2310: 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f .The err field o
2320: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 f the currently
2330: 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20 operative State
2340: 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 is set. *. to a
2350: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 string describi
2360: 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 ng the SSL negot
2370: 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 iation failure r
2380: 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d eason. *. *-----
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
23d0: 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f */.void.Tls_Erro
23e0: 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 r(State *statePt
23f0: 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a r, char *msg) {.
2400: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
2410: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
2420: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
2430: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 cl_Obj *cmdPtr,
2440: 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 listPtr;. uns
2450: 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a igned long err;.
2460: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 statePtr->er
2470: 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 r = msg;.. dp
2480: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
2490: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
24a0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 tr->callback ==
24b0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a (Tcl_Obj*)NULL).
24c0: 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a .return;.. /*
24d0: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 Create command
24e0: 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 to eval */. c
24f0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
2500: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
2510: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 r->callback);.
2520: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2530: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2540: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2550: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 ewStringObj("err
2560: 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 or", -1));. T
2570: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2580: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2590: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
25a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
25b0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
25c0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
25d0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 , -1));. if (
25e0: 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 msg != NULL) {..
25f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2600: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2610: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2620: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d StringObj(msg, -
2630: 31 29 29 3b 0a 09 2f 2a 20 54 63 6c 5f 53 65 74 1));../* Tcl_Set
2640: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
2650: 2c 20 22 53 53 4c 22 2c 20 6d 73 67 2c 20 28 63 , "SSL", msg, (c
2660: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 20 2a 2f 0a har *)NULL); */.
2670: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
2680: 28 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 (msg = Tcl_GetSt
2690: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f ringFromObj(Tcl_
26a0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 GetObjResult(int
26b0: 65 72 70 29 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 erp), NULL)) !=
26c0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 NULL) {..Tcl_Lis
26d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
26e0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
26f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
2700: 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 bj(msg, -1));..
2710: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73 } else {..lis
2720: 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 tPtr = Tcl_NewLi
2730: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
2740: 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 45 .while ((err = E
2750: 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 20 RR_get_error())
2760: 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c != 0) {.. Tcl
2770: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2780: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 ement(interp, li
2790: 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 stPtr, Tcl_NewSt
27a0: 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 73 ringObj(ERR_reas
27b0: 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 on_error_string(
27c0: 65 72 72 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 err, -1));..}..T
27d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
27e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
27f0: 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 72 29 cmdPtr, listPtr)
2800: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
2810: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
2820: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
2830: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
2840: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 dPtr);. EvalC
2850: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
2860: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
2870: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
2880: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
2890: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
28e0: 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 . * KeyLogCallba
28f0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 ck --. *. *.Writ
2900: 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 20 64 e received key d
2910: 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e ata to log file.
2920: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
2930: 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a cts:. *.none. *.
2940: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2980: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b -----. */.void K
2990: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f eyLogCallback(co
29a0: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f nst SSL *ssl, co
29b0: 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 nst char *line)
29c0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 {. char *str
29d0: 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c = getenv(SSLKEYL
29e0: 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c OGFILE);. FIL
29f0: 45 20 2a 66 64 3b 0a 20 20 20 20 69 66 20 28 73 E *fd;. if (s
2a00: 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 tr) {..fd = fope
2a10: 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 n(str, "a");..fp
2a20: 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 rintf(fd, "%s\n"
2a30: 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 ,line);..fclose(
2a40: 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f fd);. }.}.../
2a50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
2a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a90: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 -------. *. * Pa
2aa0: 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 ssword Callback
2ab0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
2ac0: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 when a password
2ad0: 69 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e 70 is needed to unp
2ae0: 61 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d 20 ack RSA and PEM
2af0: 6b 65 79 73 2e 0a 20 2a 09 45 76 61 6c 73 20 61 keys.. *.Evals a
2b00: 6e 79 20 62 6f 75 6e 64 20 70 61 73 73 77 6f 72 ny bound passwor
2b10: 64 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 d script and ret
2b20: 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 urns the result
2b30: 61 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77 6f as. *.the passwo
2b40: 72 64 20 73 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a rd string.. *. *
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b90: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
2ba0: 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 nt.PasswordCallb
2bb0: 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 ack(char *buf, i
2bc0: 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 72 nt size, int ver
2bd0: 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 ify, void *udata
2be0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
2bf0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 tatePtr.= (State
2c00: 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 54 *) udata;. T
2c10: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
2c20: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
2c30: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
2c40: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
2c50: 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 nt code;.. dp
2c60: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
2c70: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
2c80: 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 tr->password ==
2c90: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c NULL) {..if (Tcl
2ca0: 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 _EvalEx(interp,
2cb0: 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c "tls::password",
2cc0: 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c -1, TCL_EVAL_GL
2cd0: 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 OBAL) == TCL_OK)
2ce0: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65 {.. char *re
2cf0: 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c t = (char *) Tcl
2d00: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 _GetStringResult
2d10: 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 73 (interp);.. s
2d20: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c trncpy(buf, ret,
2d30: 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b (size_t) size);
2d40: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e .. return (in
2d50: 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 t)strlen(ret);..
2d60: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 } else {.. re
2d70: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 turn -1;..}.
2d80: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 }.. /* Create
2d90: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c command to eval
2da0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
2db0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
2dc0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 j(statePtr->pass
2dd0: 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f word);.. Tcl_
2de0: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
2df0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
2e00: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
2e10: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
2e20: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 tePtr);.. /*
2e30: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 61 6e Eval callback an
2e40: 64 20 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b d success for ok
2e50: 2c 20 61 62 6f 72 74 20 66 6f 72 20 65 72 72 6f , abort for erro
2e60: 72 2c 20 63 6f 6e 74 69 6e 75 65 20 66 6f 72 20 r, continue for
2e70: 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20 continue */.
2e80: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
2e90: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
2ea0: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
2eb0: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
2ec0: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
2ed0: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
2ee0: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
2ef0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
2f00: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
2f10: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
2f20: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
2f30: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
2f40: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
2f50: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
2f60: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
2f70: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
2f80: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
2f90: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
2fa0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
2fb0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
2fc0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 ePtr);.. if (
2fd0: 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 code == TCL_OK)
2fe0: 7b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 {..char *ret = (
2ff0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 char *) Tcl_GetS
3000: 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 tringResult(inte
3010: 72 70 29 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e rp);..if (strlen
3020: 28 72 65 74 29 20 3c 20 73 69 7a 65 20 2d 20 31 (ret) < size - 1
3030: 29 20 7b 0a 09 20 20 20 20 73 74 72 6e 63 70 79 ) {.. strncpy
3040: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 (buf, ret, (size
3050: 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 _t) size);..
3060: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
3070: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
3080: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 ;.. return (i
3090: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a nt)strlen(ret);.
30a0: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c .}. }. Tcl
30b0: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
30c0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
30d0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76 return -1;..v
30e0: 65 72 69 66 79 20 3d 20 76 65 72 69 66 79 3b 0a erify = verify;.
30f0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
3140: 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 * Session Callb
3150: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 ack for Clients
3160: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
3170: 77 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 when a new sessi
3180: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 on is added to t
3190: 68 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 he cache. In TLS
31a0: 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 1.3. *.this may
31b0: 20 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c be received mul
31c0: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 tiple times afte
31d0: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e r the handshake.
31e0: 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 For. *.earlier
31f0: 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 versions, this w
3200: 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 ill be received
3210: 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 during the hands
3220: 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 hake.. *.This is
3230: 20 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77 the preferred w
3240: 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 ay to obtain a r
3250: 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e esumable session
3260: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
3270: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
3280: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
3290: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
32a0: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
32b0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
32c0: 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 *.0 = error whe
32d0: 72 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 re session will
32e0: 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 be immediately r
32f0: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 emoved from the
3300: 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a internal cache..
3310: 20 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 *.1 = success w
3320: 68 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 here app retains
3330: 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 session in sess
3340: 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d ion cache, and m
3350: 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 ust call SSL_SES
3360: 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e SION_free() when
3370: 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d done.. *. *----
3380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
33c0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
33d0: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 essionCallback(c
33e0: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53 onst SSL *ssl, S
33f0: 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 SL_SESSION *sess
3400: 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 ion) {. State
3410: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
3420: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 ate*)SSL_get_app
3430: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c _data((SSL *)ssl
3440: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 );. Tcl_Inter
3450: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
3460: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
3470: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
3480: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 r;. const uns
3490: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b igned char *tick
34a0: 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e et;. const un
34b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 signed char *ses
34c0: 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a sion_id;. siz
34d0: 65 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e e_t len2;. un
34e0: 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b signed int ulen;
34f0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
3500: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
3510: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
3520: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
3530: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
3540: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
3550: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 _OK;. } else
3560: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 if (ssl == NULL)
3570: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
3580: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
3590: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
35a0: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
35b0: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 eval */. cmd
35c0: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
35d0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
35e0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 >callback);.
35f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
3600: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
3610: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
3620: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 StringObj("sessi
3630: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 on", -1));..
3640: 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f /* Session id */
3650: 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 . session_id
3660: 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
3670: 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 t_id(session, &u
3680: 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 len);. Tcl_Li
3690: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
36a0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
36b0: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 r, Tcl_NewByteAr
36c0: 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 rayObj(session_i
36d0: 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b d, (int) ulen));
36e0: 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e .. /* Session
36f0: 20 74 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 ticket */. S
3700: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
3710: 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 ticket(session,
3720: 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b &ticket, &len2);
3730: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
3740: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3750: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
3760: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 l_NewByteArrayOb
3770: 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 j(ticket, (int)
3780: 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 len2));.. /*
3790: 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 Lifetime - numbe
37a0: 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a r of seconds */.
37b0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
37c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
37d0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 erp, cmdPtr,..Tc
37e0: 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f l_NewLongObj((lo
37f0: 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f ng) SSL_SESSION_
3800: 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 get_ticket_lifet
3810: 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e ime_hint(session
3820: 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 )));.. /* Eva
3830: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
3840: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
3850: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
3860: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
3870: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
3880: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
3890: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
38a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
38b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a return 0;.}...
38c0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
38d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 --------. *. * A
3910: 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 LPN Callback for
3920: 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e Servers and NPN
3930: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c Callback for Cl
3940: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 ients --. *. *.P
3950: 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 erform protocol
3960: 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 (http/1.1, h2, h
3970: 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 3, etc.) selecti
3980: 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e on for the. *.in
3990: 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f coming connectio
39a0: 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 n. Called after
39b0: 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 Hello and server
39c0: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 callbacks.. *.W
39d0: 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 here 'out' is se
39e0: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
39f0: 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 and 'in' is the
3a00: 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20 peer advertised
3a10: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 list.. *. * Resu
3a20: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
3a30: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
3a40: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
3a50: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
3a60: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
3a70: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
3a80: 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 T_ERR_OK: ALPN p
3a90: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
3aa0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
3ab0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
3ac0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
3ad0: 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 ERT_FATAL: There
3ae0: 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 was no overlap
3af0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 between the clie
3b00: 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 nt's. *. supp
3b10: 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 lied list and th
3b20: 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 e server configu
3b30: 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e ration. The conn
3b40: 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 ection will be a
3b50: 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 borted.. *.SSL_T
3b60: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a LSEXT_ERR_NOACK:
3b70: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e ALPN protocol n
3b80: 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 ot selected, e.g
3b90: 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c ., because no AL
3ba0: 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 PN. *. protoc
3bb0: 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 ols are configur
3bc0: 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e ed for this conn
3bd0: 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e ection. The conn
3be0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
3bf0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
3c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
3c40: 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 tatic int.ALPNCa
3c50: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
3c60: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 *ssl, const uns
3c70: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 igned char **out
3c80: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
3c90: 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 *outlen,..const
3ca0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 unsigned char *i
3cb0: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 n, unsigned int
3cc0: 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 inlen, void *arg
3cd0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
3ce0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
3cf0: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 *)arg;. Tcl_I
3d00: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
3d10: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
3d20: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
3d30: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
3d40: 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 ode, res;.. d
3d50: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
3d60: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d ;.. if (ssl =
3d70: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d = NULL || arg ==
3d80: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
3d90: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
3da0: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
3db0: 20 20 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 /* Select prot
3dc0: 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 ocol */. if (
3dd0: 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f SSL_select_next_
3de0: 70 72 6f 74 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 proto(out, outle
3df0: 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f n, statePtr->pro
3e00: 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 tos, statePtr->p
3e10: 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 rotos_len,..in,
3e20: 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 inlen) == OPENSS
3e30: 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 L_NPN_NEGOTIATED
3e40: 29 20 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f ) {../* Match fo
3e50: 75 6e 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 und */..res = SS
3e60: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
3e70: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f . } else {../
3e80: 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f * OPENSSL_NPN_NO
3e90: 5f 4f 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 _OVERLAP = No ov
3ea0: 65 72 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 erlap, so use fi
3eb0: 72 73 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c rst item from cl
3ec0: 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 ient protocol li
3ed0: 73 74 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c st */..res = SSL
3ee0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
3ef0: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 K;. }.. if
3f00: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 (statePtr->vcmd
3f10: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
3f20: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 LL) {..return re
3f30: 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a s;. }.. /*
3f40: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 Create command
3f50: 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 to eval */. c
3f60: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
3f70: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
3f80: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 r->vcmd);. Tc
3f90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3fa0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3fb0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
3fc0: 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 ringObj("alpn",
3fd0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
3fe0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
3ff0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4000: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4010: 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a Obj(*out, -1));.
4020: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
4030: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
4040: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
4050: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
4060: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 if ((code = E
4070: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
4080: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
4090: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 dPtr)) > 1) {..r
40a0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
40b0: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
40c0: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d else if (code =
40d0: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 1) {..res = SS
40e0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
40f0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 . } else {..r
4100: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
4110: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b ERR_ALERT_FATAL;
4120: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
4130: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
4140: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
4150: 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d res;.}.../*. *--
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41a0: 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 -. *. * Advertis
41b0: 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c e Protocols Call
41c0: 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 back for Next Pr
41d0: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 otocol Negotiati
41e0: 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 on (NPN) in Serv
41f0: 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a erHello --. *. *
4200: 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 .called when a T
4210: 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 20 LS server needs
4220: 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f 72 a list of suppor
4230: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f ted protocols fo
4240: 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 r Next. *.Protoc
4250: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a ol Negotiation..
4260: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
4270: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
4280: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a e effects:. *. *
4290: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
42a0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
42b0: 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f _OK: NPN protoco
42c0: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 l selected. The
42d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
42e0: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
42f0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e EXT_ERR_NOACK: N
4300: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 PN protocol not
4310: 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f selected. The co
4320: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
4330: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d es.. *. *-------
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
4380: 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a .#ifdef USE_NPN.
4390: 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 static int.NPNCa
43a0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
43b0: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 *ssl, const uns
43c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 igned char **out
43d0: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a , unsigned int *
43e0: 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 outlen, void *ar
43f0: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a g) {. State *
4400: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
4410: 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 e*)arg;.. dpr
4420: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
4430: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 . if (ssl ==
4440: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e NULL || arg == N
4450: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
4460: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
4470: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ACK;. }..
4480: 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 /* Set protocols
4490: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 list */. if
44a0: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
44b0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f s != NULL) {..*o
44c0: 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 ut = statePtr->p
44d0: 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 rotos;..*outlen
44e0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 = statePtr->prot
44f0: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c os_len;. } el
4500: 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c se {..*out = NUL
4510: 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b L;..*outlen = 0;
4520: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
4530: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
4540: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
4550: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
4560: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a K;.}.#endif.../*
4570: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 ------. *. * SNI
45c0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 Callback for Se
45d0: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 rvers --. *. *.P
45e0: 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 erform server-si
45f0: 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 de SNI hostname
4600: 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 20 selection after
4610: 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 78 receiving SNI ex
4620: 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c tension. *.in Cl
4630: 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c ient Hello. Call
4640: 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 ed after hello c
4650: 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 6f allback but befo
4660: 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b re ALPN callback
4670: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
4680: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
4690: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
46a0: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
46b0: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
46c0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
46d0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
46e0: 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 R_OK: SNI hostna
46f0: 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e 20 me is accepted.
4700: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
4710: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c ontinues.. *.SSL
4720: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 _TLSEXT_ERR_ALER
4730: 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 T_FATAL: SNI hos
4740: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 tname is not acc
4750: 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 epted. The conne
4760: 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 ction. *. is
4770: 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c 74 aborted. Default
4780: 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 53 for alert is SS
4790: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 L_AD_UNRECOGNIZE
47a0: 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 D_NAME.. *.SSL_T
47b0: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
47c0: 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 WARNING: SNI hos
47d0: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 tname is not acc
47e0: 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 epted, warning a
47f0: 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 lert. *. sent
4800: 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 (not supported
4810: 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 in TLSv1.3). The
4820: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
4830: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c inues.. *.SSL_TL
4840: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 SEXT_ERR_NOACK:
4850: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 SNI hostname is
4860: 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 not accepted and
4870: 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 not acknowledge
4880: 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 d,. *. e.g. i
4890: 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 f SNI has not be
48a0: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 en configured. T
48b0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
48c0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d ntinues.. *. *--
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4910: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
4920: 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e .SNICallback(con
4930: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 st SSL *ssl, int
4940: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 *alert, void *a
4950: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 rg) {. State
4960: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
4970: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c te*)arg;. Tcl
4980: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
4990: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
49a0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
49b0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 *cmdPtr;. int
49c0: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 code, res;.
49d0: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 char *servername
49e0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 = NULL;.. dp
49f0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
4a00: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d .. if (ssl ==
4a10: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 NULL || arg ==
4a20: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
4a30: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
4a40: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 OACK;. }..
4a50: 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 /* Only works f
4a60: 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 65 or TLS 1.2 and e
4a70: 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 65 arlier */. se
4a80: 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 rvername = SSL_g
4a90: 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 et_servername(ss
4aa0: 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 l, TLSEXT_NAMETY
4ab0: 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 PE_host_name);.
4ac0: 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e 61 if (!serverna
4ad0: 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 me || servername
4ae0: 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 [0] == '\0') {..
4af0: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
4b00: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
4b10: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 }.. if (stat
4b20: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 ePtr->vcmd == (T
4b30: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
4b40: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4b50: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
4b60: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
4b70: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
4b80: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
4b90: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
4ba0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
4bb0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
4bc0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
4bd0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
4be0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
4bf0: 22 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 "sni", -1));.
4c00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4c10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4c20: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4c30: 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 wStringObj(serve
4c40: 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 rname , -1));..
4c50: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
4c60: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 ack command */.
4c70: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
4c80: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
4c90: 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 if ((code = Eva
4ca0: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
4cb0: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
4cc0: 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 tr)) > 1) {..res
4cd0: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 = SSL_TLSEXT_ER
4ce0: 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3b R_ALERT_WARNING;
4cf0: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 ..*alert = SSL_A
4d00: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e D_UNRECOGNIZED_N
4d10: 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 AME; /* Not supp
4d20: 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33 orted by TLS 1.3
4d30: 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 */. } else i
4d40: 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a f (code == 1) {.
4d50: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 .res = SSL_TLSEX
4d60: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 T_ERR_OK;. }
4d70: 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 else {..res = SS
4d80: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 L_TLSEXT_ERR_ALE
4d90: 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 72 RT_FATAL;..*aler
4da0: 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 t = SSL_AD_UNREC
4db0: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a OGNIZED_NAME; /*
4dc0: 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 Not supported b
4dd0: 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 y TLS 1.3 */.
4de0: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 }. Tcl_DecrR
4df0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
4e00: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b . return res;
4e10: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
4e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4e60: 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 . * ClientHello
4e70: 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 61 Handshake Callba
4e80: 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d ck for Servers -
4e90: 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 -. *. *.Used by
4ea0: 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 6e server to examin
4eb0: 65 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d e the server nam
4ec0: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e e indication (SN
4ed0: 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 I) extension. *.
4ee0: 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 provided by the
4ef0: 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 client in order
4f00: 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 70 to select an app
4f10: 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 69 ropriate certifi
4f20: 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 cate to. *.prese
4f30: 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 nt, and make oth
4f40: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e er configuration
4f50: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c adjustments rel
4f60: 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 65 evant to that se
4f70: 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 rver. *.name and
4f80: 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 69 its configurati
4f90: 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65 on. This include
4fa0: 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 74 s swapping out t
4fb0: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 2a he associated. *
4fc0: 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 .SSL_CTX pointer
4fd0: 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 , modifying the
4fe0: 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f 66 server's list of
4ff0: 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 76 permitted TLS v
5000: 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e ersions,. *.chan
5010: 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 ging the server'
5020: 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 6e s cipher list in
5030: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 response to the
5040: 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 72 client's cipher
5050: 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09 43 list, etc.. *.C
5060: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e 49 alled before SNI
5070: 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62 61 and ALPN callba
5080: 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c cks.. *. * Resul
5090: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
50a0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
50b0: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
50c0: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
50d0: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
50e0: 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 s:. *.SSL_CLIENT
50f0: 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 75 _HELLO_RETRY: su
5100: 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73 68 spend the handsh
5110: 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61 6e ake, and the han
5120: 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e 20 dshake function
5130: 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d 65 will return imme
5140: 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 diately. *.SSL_C
5150: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
5160: 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72 6d R: failure, term
5170: 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e inate connection
5180: 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20 65 . Set alert to e
5190: 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 rror code.. *.SS
51a0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 L_CLIENT_HELLO_S
51b0: 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 73 0a UCCESS: success.
51c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
5210: 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c tic int.HelloCal
5220: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
5230: 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 *ssl, int *alert
5240: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 , void *arg) {.
5250: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
5260: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 tr = (State*)arg
5270: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
5280: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
5290: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
52a0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
52b0: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 ;. int code,
52c0: 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 res;. const c
52d0: 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 3b har *servername;
52e0: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
52f0: 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 ned char *p;.
5300: 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 6d size_t len, rem
5310: 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70 72 aining;.. dpr
5320: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
5330: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
5340: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f r->vcmd == (Tcl_
5350: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 Obj*)NULL) {..re
5360: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
5370: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 HELLO_SUCCESS;.
5380: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 } else if (ss
5390: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 l == NULL || arg
53a0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
53b0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
53c0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
53d0: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 }.. /* Get na
53e0: 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 mes */. if (!
53f0: 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f SSL_client_hello
5400: 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 _get0_ext(ssl, T
5410: 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65 LSEXT_TYPE_serve
5420: 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d r_name, &p, &rem
5430: 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 aining) || remai
5440: 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 ning <= 2) {..*a
5450: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c lert = SSL_R_SSL
5460: 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c V3_ALERT_ILLEGAL
5470: 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 _PARAMETER;..ret
5480: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
5490: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
54a0: 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 }.. /* Extrac
54b0: 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 t the length of
54c0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73 the supplied lis
54d0: 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 t of names. */.
54e0: 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 len = (*(p++)
54f0: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 << 8);. len
5500: 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 += *(p++);. i
5510: 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 f (len + 2 != re
5520: 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 maining) {..*ale
5530: 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 rt = SSL_R_SSLV3
5540: 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 _ALERT_ILLEGAL_P
5550: 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 ARAMETER;..retur
5560: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
5570: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
5580: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 remaining =
5590: 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 len;.. /* The
55a0: 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63 list in practic
55b0: 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e e only has a sin
55c0: 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 gle element, so
55d0: 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 we only consider
55e0: 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 the first one.
55f0: 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 */. if (remai
5600: 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b ning == 0 || *p+
5610: 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 + != TLSEXT_NAME
5620: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 TYPE_host_name)
5630: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
5640: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e R_TLSV1_ALERT_IN
5650: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 TERNAL_ERROR;..r
5660: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
5670: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
5680: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e }. remainin
5690: 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 g--;.. /* Now
56a0: 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 we can finally
56b0: 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 pull out the byt
56c0: 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 e array with the
56d0: 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 actual hostname
56e0: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d . */. if (rem
56f0: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 aining <= 2) {..
5700: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 *alert = SSL_R_T
5710: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 LSV1_ALERT_INTER
5720: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 NAL_ERROR;..retu
5730: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
5740: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
5750: 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b . len = (*(p+
5760: 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 +) << 8);. le
5770: 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 n += *(p++);.
5780: 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 if (len + 2 > r
5790: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c emaining) {..*al
57a0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 ert = SSL_R_TLSV
57b0: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 1_ALERT_INTERNAL
57c0: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 _ERROR;..return
57d0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
57e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
57f0: 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 remaining = le
5800: 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d n;. servernam
5810: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 e = (const char
5820: 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 *)p;.. /* Cre
5830: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
5840: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 val */. cmdPt
5850: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
5860: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
5870: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
5880: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
5890: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
58a0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
58b0: 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 Obj("hello", -1)
58c0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
58d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
58e0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
58f0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
5900: 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 69 6e (servername, (in
5910: 74 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f t) len));.. /
5920: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
5930: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
5940: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
5950: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 cmdPtr);. if
5960: 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c ((code = EvalCal
5970: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
5980: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 atePtr, cmdPtr))
5990: 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 > 1) {..res = S
59a0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
59b0: 52 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d RETRY;..*alert =
59c0: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 SSL_R_TLSV1_ALE
59d0: 52 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 RT_USER_CANCELLE
59e0: 44 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 D;. } else if
59f0: 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 (code == 1) {..
5a00: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 res = SSL_CLIENT
5a10: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a _HELLO_SUCCESS;.
5a20: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 } else {..re
5a30: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 s = SSL_CLIENT_H
5a40: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c ELLO_ERROR;..*al
5a50: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 ert = SSL_R_TLSV
5a60: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 1_ALERT_INTERNAL
5a70: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
5a80: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
5a90: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
5aa0: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a return res;.}...
5ab0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
5ac0: 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e *****/./* Comman
5ad0: 64 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a ds */./*
5ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5af0: 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ***/../*. *-----
5b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5b40: 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 *. * CiphersObjC
5b50: 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c md -- list avail
5b60: 61 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a able ciphers. *.
5b70: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
5b80: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
5b90: 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 process the "tls
5ba0: 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 ::ciphers" comma
5bb0: 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 nd. *.to list av
5bc0: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c ailable ciphers,
5bd0: 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 based upon prot
5be0: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 ocol selected..
5bf0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
5c00: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
5c10: 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a result list.. *.
5c20: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
5c30: 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 . *.constructs a
5c40: 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 nd destroys SSL
5c50: 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a context (CTX). *
5c60: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ca0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
5cb0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 c const char *pr
5cc0: 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 otocols[] = {.."
5cd0: 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 ssl2", "ssl3", "
5ce0: 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c tls1", "tls1.1",
5cf0: 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 "tls1.2", "tls1
5d00: 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 .3", NULL.};.enu
5d10: 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 m protocol {.
5d20: 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 TLS_SSL2, TLS_S
5d30: 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 SL3, TLS_TLS1, T
5d40: 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 LS_TLS1_1, TLS_T
5d50: 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f LS1_2, TLS_TLS1_
5d60: 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 3, TLS_NONE.};..
5d70: 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 static int.Ciphe
5d80: 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 rsObjCmd(ClientD
5d90: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
5da0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
5db0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
5dc0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
5dd0: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f v[]) {. Tcl_O
5de0: 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c bj *objPtr = NUL
5df0: 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a L;. SSL_CTX *
5e00: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
5e10: 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b SSL *ssl = NULL;
5e20: 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 . STACK_OF(SS
5e30: 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 L_CIPHER) *sk;.
5e40: 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 char *cp, buf
5e50: 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e [BUFSIZ];. in
5e60: 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 t index, verbose
5e70: 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 = 0, use_suppor
5e80: 74 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 ted = 0;.. dp
5e90: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
5ea0: 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 .. if ((objc
5eb0: 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 < 2) || (objc >
5ec0: 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4)) {..Tcl_Wrong
5ed0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
5ee0: 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 1, objv, "protoc
5ef0: 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 ol ?verbose? ?su
5f00: 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 pported?");..ret
5f10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
5f20: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c }. if (Tcl
5f30: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a _GetIndexFromObj
5f40: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d (interp, objv[1]
5f50: 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 , protocols, "pr
5f60: 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 otocol", 0, &ind
5f70: 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ex) != TCL_OK) {
5f80: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
5f90: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
5fa0: 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 ((objc > 2) &&
5fb0: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 Tcl_GetBooleanFr
5fc0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
5fd0: 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 jv[2], &verbose)
5fe0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
5ff0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6000: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
6010: 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c objc > 3) && Tcl
6020: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f _GetBooleanFromO
6030: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
6040: 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 3], &use_support
6050: 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ed) != TCL_OK) {
6060: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
6070: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 OR;. }.. E
6080: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
6090: 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 ;.. switch ((
60a0: 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e enum protocol)in
60b0: 64 65 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 dex) {..case TLS
60c0: 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 _SSL2:.#if OPENS
60d0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
60e0: 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c R >= 0x10100000L
60f0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 || defined(NO_S
6100: 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 SL2) || defined(
6110: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
6120: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
6130: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
6140: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
6150: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
6160: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
6170: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
6180: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
6190: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f .. ctx = SSL_
61a0: 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65 CTX_new(SSLv2_me
61b0: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a thod()); break;.
61c0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 #endif..case TLS
61d0: 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e _SSL3:.#if defin
61e0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 ed(NO_SSL3) || d
61f0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
6200: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e O_SSL3) || defin
6210: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
6220: 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 L3_METHOD)..
6230: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
6240: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
6250: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
6260: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
6270: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
6280: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
6290: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
62a0: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
62b0: 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 w(SSLv3_method()
62c0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
62d0: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a ..case TLS_TLS1:
62e0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
62f0: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 TLS1) || defined
6300: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
6310: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
6320: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 NSSL_NO_TLS1_MET
6330: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 HOD).. Tcl_Ap
6340: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
6350: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
6360: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
6370: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
6380: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
6390: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
63a0: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 else.. ctx =
63b0: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 SSL_CTX_new(TLSv
63c0: 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 1_method()); bre
63d0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
63e0: 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 TLS_TLS1_1:.#if
63f0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
6400: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
6410: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
6420: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
6430: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d NSSL_NO_TLS1_1_M
6440: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
6450: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
6460: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
6470: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
6480: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
6490: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
64a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
64b0: 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 .#else.. ctx
64c0: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c = SSL_CTX_new(TL
64d0: 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b Sv1_1_method());
64e0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
64f0: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a case TLS_TLS1_2:
6500: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
6510: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e TLS1_2) || defin
6520: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
6530: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
6540: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
6550: 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 _2_METHOD)..
6560: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
6570: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
6580: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
6590: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
65a0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
65b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
65c0: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
65d0: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
65e0: 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 w(TLSv1_2_method
65f0: 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 ()); break;.#end
6600: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
6610: 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 1_3:.#if defined
6620: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 (NO_TLS1_3) || d
6630: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
6640: 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 O_TLS1_3).. T
6650: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
6660: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
6670: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
6680: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
6690: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
66a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
66b0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 OR;.#else.. c
66c0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
66d0: 28 54 4c 53 5f 6d 65 74 68 6f 64 28 29 29 3b 0a (TLS_method());.
66e0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
66f0: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _min_proto_versi
6700: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 on(ctx, TLS1_3_V
6710: 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 ERSION);.. SS
6720: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 L_CTX_set_max_pr
6730: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
6740: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 TLS1_3_VERSION)
6750: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 ;.. break;.#e
6760: 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 ndif..default:..
6770: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
6780: 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 . if (ctx ==
6790: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
67a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
67b0: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c , REASON(), NULL
67c0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
67d0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
67e0: 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 ssl = SSL_new(c
67f0: 74 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c tx);. if (ssl
6800: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c == NULL) {..Tcl
6810: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
6820: 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 terp, REASON(),
6830: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f NULL);..SSL_CTX_
6840: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 free(ctx);..retu
6850: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
6860: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 }.. /* Use
6870: 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 list and order a
6880: 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 s would be sent
6890: 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f in a ClientHello
68a0: 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c or all availabl
68b0: 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 e ciphers */.
68c0: 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 if (use_support
68d0: 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f ed) {..sk = SSL_
68e0: 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 get1_supported_c
68f0: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 iphers(ssl);.
6900: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 } else {..sk =
6910: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 SSL_get_ciphers(
6920: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ssl);. }..
6930: 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 if (sk != NULL)
6940: 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 {..if (!verbose
6950: 29 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 ) {.. objPtr
6960: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
6970: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 (0, NULL);..
6980: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 for (int i = 0;
6990: 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 i < sk_SSL_CIPHE
69a0: 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 R_num(sk); i++)
69b0: 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 {...const SSL_CI
69c0: 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c PHER *c = sk_SSL
69d0: 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b _CIPHER_value(sk
69e0: 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d , i);...if (c ==
69f0: 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b NULL) continue;
6a00: 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 ..../* cipher na
6a10: 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a me or (NONE) */.
6a20: 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 ..cp = SSL_CIPHE
6a30: 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 R_get_name(c);..
6a40: 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 .if (cp == NULL)
6a50: 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 break;...Tcl_Li
6a60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
6a70: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
6a80: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
6a90: 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 Obj(cp, -1));..
6aa0: 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a }...} else {.
6ab0: 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 . objPtr = Tc
6ac0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
6ad0: 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 ",0);.. for (
6ae0: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 int i = 0; i < s
6af0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d k_SSL_CIPHER_num
6b00: 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 (sk); i++) {...c
6b10: 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 onst SSL_CIPHER
6b20: 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 *c = sk_SSL_CIPH
6b30: 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b ER_value(sk, i);
6b40: 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c ...if (c == NULL
6b50: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f ) continue;..../
6b60: 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 * textual descri
6b70: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 ption of the cip
6b80: 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c her */...if (SSL
6b90: 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 _CIPHER_descript
6ba0: 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 ion(c, buf, size
6bb0: 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c of(buf)) != NULL
6bc0: 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 ) {... Tcl_Ap
6bd0: 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 pendToObj(objPtr
6be0: 2c 20 62 75 66 2c 20 28 69 6e 74 29 20 73 74 72 , buf, (int) str
6bf0: 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20 65 len(buf));...} e
6c00: 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f lse {... Tcl_
6c10: 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 AppendToObj(objP
6c20: 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c tr, "UNKNOWN\n",
6c30: 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 8);...}.. }.
6c40: 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 70 70 .}..if (use_supp
6c50: 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 73 6b orted) {.. sk
6c60: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 65 65 _SSL_CIPHER_free
6c70: 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 (sk);..}. }.
6c80: 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c 29 SSL_free(ssl)
6c90: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 ;. SSL_CTX_fr
6ca0: 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 63 ee(ctx);.. Tc
6cb0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
6cc0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
6cd0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
6ce0: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d K;..clientData =
6cf0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c clientData;.}..
6d00: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
6d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
6d50: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 ProtocolsObjCmd
6d60: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c -- list availabl
6d70: 65 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 e protocols. *.
6d80: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
6d90: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 is invoked to p
6da0: 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a rocess the "tls:
6db0: 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d :protocols" comm
6dc0: 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 and. *.to list a
6dd0: 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f vailable protoco
6de0: 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ls.. *. * Result
6df0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
6e00: 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 Tcl result list
6e10: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
6e20: 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ects:. *.none. *
6e30: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e70: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
6e80: 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f c int.ProtocolsO
6e90: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
6ea0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
6eb0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
6ec0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
6ed0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
6ee0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ) {. Tcl_Obj
6ef0: 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 *objPtr;.. dp
6f00: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
6f10: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
6f20: 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 1) {..Tcl_Wron
6f30: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
6f40: 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 1, objv, "");..
6f50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
6f60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
6f70: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
6f80: 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 . objPtr = Tc
6f90: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
6fa0: 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e NULL);..#if OPEN
6fb0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
6fc0: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c ER < 0x10100000L
6fd0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f && !defined(NO_
6fe0: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 SSL2) && !define
6ff0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
7000: 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 2). Tcl_ListO
7010: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
7020: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
7030: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
7040: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 (protocols[TLS_S
7050: 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 SL2], -1));.#end
7060: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
7070: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
7080: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
7090: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
70a0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
70b0: 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 3_METHOD). Tc
70c0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
70d0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
70e0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
70f0: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
7100: 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 s[TLS_SSL3], -1)
7110: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
7120: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
7130: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
7140: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 SSL_NO_TLS1) &&
7150: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
7160: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 _NO_TLS1_METHOD)
7170: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
7180: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
7190: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
71a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
71b0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 rotocols[TLS_TLS
71c0: 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 1], -1));.#endif
71d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
71e0: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
71f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
7200: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
7210: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
7220: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 LS1_1_METHOD).
7230: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
7240: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
7250: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
7260: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
7270: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 ocols[TLS_TLS1_1
7280: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
7290: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
72a0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
72b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
72c0: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
72d0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
72e0: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_2_METHOD).
72f0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
7300: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
7310: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
7320: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
7330: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d cols[TLS_TLS1_2]
7340: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
7350: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
7360: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
7370: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7380: 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 S1_3). Tcl_Li
7390: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
73a0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
73b0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
73c0: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
73d0: 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b S_TLS1_3], -1));
73e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c .#endif.. Tcl
73f0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
7400: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 terp, objPtr);.
7410: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
7420: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
7430: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
7440: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
7450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7480: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 --------. *. * H
7490: 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d andshakeObjCmd -
74a0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d -. *. *.This com
74b0: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 mand is used to
74c0: 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20 74 verify whether t
74d0: 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 he handshake is
74e0: 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e complete. *.or n
74f0: 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ot.. *. * Result
7500: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
7510: 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d Tcl result. 1 m
7520: 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 eans handshake c
7530: 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 omplete, 0 means
7540: 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 pending.. *. *
7550: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
7560: 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e .May force SSL n
7570: 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 egotiation to ta
7580: 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d ke place.. *. *-
7590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75d0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
75e0: 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d t HandshakeObjCm
75f0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
7600: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
7610: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
7620: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
7630: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
7640: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
7650: 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 chan; /*
7660: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
7670: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f et a mode on. */
7680: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
7690: 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 ePtr; /*
76a0: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 client state for
76b0: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 ssl socket */.
76c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 const char *e
76d0: 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 rrStr = NULL;.
76e0: 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 int ret = 1;.
76f0: 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a int err = 0;.
7700: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
7710: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
7720: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
7730: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
7740: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
7750: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
7760: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
7770: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
7780: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
7790: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
77a0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
77b0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 , Tcl_GetStringF
77c0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 romObj(objv[1],
77d0: 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 NULL), NULL);.
77e0: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 if (chan == (T
77f0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
7800: 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f ) {..return(TCL_
7810: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 ERROR);. }..
7820: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
7830: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
7840: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
7850: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
7860: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
7870: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 l(chan);. if
7880: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
7890: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
78a0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
78b0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
78c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
78d0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
78e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
78f0: 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 (chan), "\": not
7900: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
7910: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 NULL);..return(
7920: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
7930: 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d }. statePtr =
7940: 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 (State *)Tcl_Ge
7950: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 tChannelInstance
7960: 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 Data(chan);..
7970: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e dprintf("Callin
7980: 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e g Tls_WaitForCon
7990: 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 nect");. ret
79a0: 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e = Tls_WaitForCon
79b0: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 nect(statePtr, &
79c0: 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 err, 1);. dpr
79d0: 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f intf("Tls_WaitFo
79e0: 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 rConnect returne
79f0: 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 d: %i", ret);..
7a00: 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 if (ret < 0 &
7a10: 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c & ((statePtr->fl
7a20: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 ags & TLS_TCL_AS
7a30: 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 YNC) && (err ==
7a40: 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 EAGAIN))) {..dpr
7a50: 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 intf("Async set
7a60: 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e and err = EAGAIN
7a70: 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 ");..ret = 0;.
7a80: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 } else if (ret
7a90: 20 3c 20 30 29 20 7b 0a 09 65 72 72 53 74 72 20 < 0) {..errStr
7aa0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b = statePtr->err;
7ab0: 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c ..Tcl_ResetResul
7ac0: 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f t(interp);..Tcl_
7ad0: 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a SetErrno(err);..
7ae0: 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 .if (!errStr ||
7af0: 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 (*errStr == 0))
7b00: 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 {.. errStr =
7b10: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 Tcl_PosixError(i
7b20: 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c nterp);..}...Tcl
7b30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
7b40: 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 terp, "handshake
7b50: 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 failed: ", errS
7b60: 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c tr, (char *) NUL
7b70: 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65 L);..dprintf("Re
7b80: 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f turning TCL_ERRO
7b90: 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 R with handshake
7ba0: 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 failed: %s", er
7bb0: 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 54 rStr);..return(T
7bc0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
7bd0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72 else {..if (err
7be0: 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 != 0) {.. dp
7bf0: 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 rintf("Got an er
7c00: 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c ror with a compl
7c10: 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 eted handshake:
7c20: 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b err = %i", err);
7c30: 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 ..}..ret = 1;.
7c40: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
7c50: 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f ("Returning TCL_
7c60: 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 25 OK with data \"%
7c70: 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 i\"", ret);.
7c80: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
7c90: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
7ca0: 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 IntObj(ret));.
7cb0: 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 return(TCL_OK)
7cc0: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
7cd0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f clientData;.}../
7ce0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
7cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 49 6d -------. *. * Im
7d30: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a portObjCmd --. *
7d40: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
7d50: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f re is invoked to
7d60: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 process the "ss
7d70: 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a l" command. *. *
7d80: 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 .The ssl command
7d90: 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 pushes SSL over
7da0: 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 a (newly connec
7db0: 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a ted) tcp socket.
7dc0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
7dd0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
7de0: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
7df0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
7e00: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 May modify the b
7e10: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f ehavior of an IO
7e20: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e70: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
7e80: 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 t.ImportObjCmd(C
7e90: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
7ea0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
7eb0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
7ec0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
7ed0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
7ee0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
7ef0: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
7f00: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
7f10: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 on. */. Stat
7f20: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a e *statePtr;../*
7f30: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f client state fo
7f40: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a r ssl socket */.
7f50: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 SSL_CTX *ctx
7f60: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
7f70: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 . Tcl_Obj *sc
7f80: 72 69 70 74 09 20 20 20 20 20 20 20 20 3d 20 4e ript. = N
7f90: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
7fa0: 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 20 20 *password.
7fb0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 = NULL;. T
7fc0: 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 20 20 20 cl_Obj *vcmd.
7fd0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
7fe0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 Tcl_DString upp
7ff0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
8000: 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e tion, upperChann
8010: 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 elBlocking, uppe
8020: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
8030: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f , upperChannelEO
8040: 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 FChar;. int i
8050: 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 dx, len;. int
8060: 20 66 6c 61 67 73 09 09 20 20 20 20 20 20 20 20 flags..
8070: 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a = TLS_TCL_INIT;.
8080: 20 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 int server..
8090: 20 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 = 0;./*
80a0: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e is connection in
80b0: 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 coming or outgoi
80c0: 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 ng? */. char
80d0: 2a 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 *keyfile.
80e0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
80f0: 72 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20 20 r *certfile.
8100: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
8110: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
8120: 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ey .= NULL;.
8130: 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20 20 int key_len
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 = 0
8150: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ;. unsigned c
8160: 68 61 72 20 2a 63 65 72 74 20 20 20 20 20 20 20 har *cert
8170: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e = NULL;. in
8180: 74 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 t cert_len
8190: 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 = 0;.
81a0: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 char *ciphers
81b0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
81c0: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 . char *ciphe
81d0: 72 73 75 69 74 65 73 09 20 20 20 20 20 20 20 20 rsuites.
81e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
81f0: 20 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 *CAfile.
8200: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
8210: 72 20 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 r *CAdir..
8220: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 = NULL;. ch
8230: 61 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 ar *DHparams.
8240: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
8250: 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 char *model..
8260: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
8270: 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 char *serverna
8280: 6d 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c me. = NUL
8290: 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 L;./* hostname f
82a0: 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 or Server Name I
82b0: 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 ndication */.
82c0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
82d0: 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 char *session_id
82e0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
82f0: 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 _Obj *alpn..= NU
8300: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 LL;. int ssl2
8310: 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a = 0, ssl3 = 0;.
8320: 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 int tls1 = 1
8330: 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c , tls1_1 = 1, tl
8340: 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 s1_2 = 1, tls1_3
8350: 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 = 1;. int pr
8360: 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d oto = 0, level =
8370: 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 -1;. int ver
8380: 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 ify = 0, require
8390: 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 = 0, request =
83a0: 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 1, post_handshak
83b0: 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 e = 0;.. dpri
83c0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
83d0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
83e0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
83f0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
8400: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8410: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 SSL2) && !define
8420: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 d(NO_SSL2) && de
8430: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
8440: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 & defined(NO_TLS
8450: 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 1) && defined(NO
8460: 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66 69 _TLS1_1) && defi
8470: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 ned(NO_TLS1_2) &
8480: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 & defined(NO_TLS
8490: 31 5f 33 29 0a 20 20 20 20 73 73 6c 32 20 3d 20 1_3). ssl2 =
84a0: 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 1;.#endif.#if !d
84b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
84c0: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
84d0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 ned(NO_SSL3) &&
84e0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
84f0: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 && defined(NO_T
8500: 4c 53 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 LS1) && defined(
8510: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 NO_TLS1_1) && de
8520: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
8530: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 && defined(NO_T
8540: 4c 53 31 5f 33 29 0a 20 20 20 20 73 73 6c 33 20 LS1_3). ssl3
8550: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 1;.#endif.#if
8560: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
8570: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
8580: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 SSL_NO_TLS1).
8590: 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 tls1 = 0;.#endi
85a0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
85b0: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
85c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
85d0: 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f LS1_1). tls1_
85e0: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 1 = 0;.#endif.#i
85f0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
8600: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
8610: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
8620: 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 2). tls1_2 =
8630: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
8640: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
8650: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
8660: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
8670: 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 tls1_3 = 0;.#
8680: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f endif.. if (o
8690: 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f bjc < 2) {..Tcl_
86a0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
86b0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
86c0: 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f hannel ?options?
86d0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
86e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
86f0: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
8700: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d r();.. chan =
8710: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
8720: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
8730: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
8740: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c v[1], NULL), NUL
8750: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
8760: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
8770: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
8780: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
8790: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
87a0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
87b0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
87c0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
87d0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
87e0: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 hannel(chan);..
87f0: 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b for (idx = 2;
8800: 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 idx < objc; idx
8810: 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 ++) {..char *opt
8820: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
8830: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 FromObj(objv[idx
8840: 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 ], NULL);...if (
8850: 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 opt[0] != '-')..
8860: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 break;...OPT
8870: 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 OBJ("-alpn", alp
8880: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 n);..OPTSTR("-ca
8890: 64 69 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f dir", CAdir);..O
88a0: 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c PTSTR("-cafile",
88b0: 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42 59 CAfile);..OPTBY
88c0: 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 TE("-cert", cert
88d0: 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 , cert_len);..OP
88e0: 54 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 TSTR("-certfile"
88f0: 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 , certfile);..OP
8900: 54 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 TSTR("-cipher",
8910: 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 ciphers);..OPTST
8920: 52 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 R("-ciphers", ci
8930: 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 phers);..OPTSTR(
8940: 22 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c "-ciphersuites",
8950: 20 63 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a ciphersuites);.
8960: 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e .OPTOBJ("-comman
8970: 64 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 d", script);..OP
8980: 54 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 TSTR("-dhparams"
8990: 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 , DHparams);..OP
89a0: 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 TBYTE("-key", ke
89b0: 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 y, key_len);..OP
89c0: 54 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c TSTR("-keyfile",
89d0: 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 keyfile);..OPTS
89e0: 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 TR("-model", mod
89f0: 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 el);..OPTOBJ("-p
8a00: 61 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f assword", passwo
8a10: 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d rd);..OPTBOOL("-
8a20: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c post_handshake",
8a30: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 post_handshake)
8a40: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 ;..OPTBOOL("-req
8a50: 75 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b uest", request);
8a60: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 ..OPTBOOL("-requ
8a70: 69 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a ire", require);.
8a80: 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 .OPTINT("-securi
8a90: 74 79 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 tylevel", level)
8aa0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 ;..OPTBOOL("-ser
8ab0: 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 ver", server);..
8ac0: 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e OPTSTR("-servern
8ad0: 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 ame", servername
8ae0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 );..OPTSTR("-ses
8af0: 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f sion_id", sessio
8b00: 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 n_id);..OPTBOOL(
8b10: 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a "-ssl2", ssl2);.
8b20: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 .OPTBOOL("-ssl3"
8b30: 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f , ssl3);..OPTBOO
8b40: 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 L("-tls1", tls1)
8b50: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
8b60: 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 1.1", tls1_1);..
8b70: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 OPTBOOL("-tls1.2
8b80: 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 ", tls1_2);..OPT
8b90: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 BOOL("-tls1.3",
8ba0: 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a tls1_3);..OPTOBJ
8bb0: 28 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 ("-validatecomma
8bc0: 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 nd", vcmd);..OPT
8bd0: 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d OBJ("-vcmd", vcm
8be0: 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 d);...OPTBAD("op
8bf0: 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d tion", "-alpn, -
8c00: 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 cadir, -cafile,
8c10: 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 -cert, -certfile
8c20: 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 , -cipher, -ciph
8c30: 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 ersuites, -comma
8c40: 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d nd, -dhparams, -
8c50: 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d key, -keyfile, -
8c60: 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 model, -password
8c70: 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b , -post_handshak
8c80: 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 e, -request, -re
8c90: 71 75 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79 quire, -security
8ca0: 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 level, -server,
8cb0: 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 -servername, -se
8cc0: 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c ssion_id, -ssl2,
8cd0: 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d -ssl3, -tls1, -
8ce0: 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c tls1.1, -tls1.2,
8cf0: 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 -tls1.3, or -va
8d00: 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b lidatecommand");
8d10: 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
8d20: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
8d30: 66 20 28 72 65 71 75 65 73 74 29 09 09 76 65 72 f (request)..ver
8d40: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
8d50: 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 Y_CLIENT_ONCE |
8d60: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b SSL_VERIFY_PEER;
8d70: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 . if (request
8d80: 20 26 26 20 72 65 71 75 69 72 65 29 09 76 65 72 && require).ver
8d90: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
8da0: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 Y_FAIL_IF_NO_PEE
8db0: 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 R_CERT;. if (
8dc0: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f request && post_
8dd0: 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 handshake).verif
8de0: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
8df0: 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a POST_HANDSHAKE;.
8e00: 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d if (verify =
8e10: 3d 20 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 = 0)..verify = S
8e20: 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a SL_VERIFY_NONE;.
8e30: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 . proto |= (s
8e40: 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f sl2 ? TLS_PROTO_
8e50: 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 SSL2 : 0);. p
8e60: 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 roto |= (ssl3 ?
8e70: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a TLS_PROTO_SSL3 :
8e80: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
8e90: 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 = (tls1 ? TLS_PR
8ea0: 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 OTO_TLS1 : 0);.
8eb0: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 proto |= (tls
8ec0: 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 1_1 ? TLS_PROTO_
8ed0: 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 TLS1_1 : 0);.
8ee0: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f proto |= (tls1_
8ef0: 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 2 ? TLS_PROTO_TL
8f00: 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 S1_2 : 0);. p
8f10: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 roto |= (tls1_3
8f20: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 ? TLS_PROTO_TLS1
8f30: 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a _3 : 0);.. /*
8f40: 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 reset to NULL i
8f50: 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 f blank string p
8f60: 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 rovided */. i
8f70: 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 f (cert && !*cer
8f80: 74 29 09 09 20 20 20 20 20 20 20 20 63 65 72 74 t).. cert
8f90: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
8fa0: 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 . if (key &&
8fb0: 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 !*key)..
8fc0: 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 key. = NU
8fd0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 LL;. if (cert
8fe0: 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 file && !*certfi
8ff0: 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 72 74 le) cert
9000: 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 file.= NULL;.
9010: 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 if (keyfile &&
9020: 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 !*keyfile)..keyf
9030: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ile. = NU
9040: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 LL;. if (ciph
9050: 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 ers && !*ciphers
9060: 29 09 20 20 20 20 20 20 20 20 63 69 70 68 65 72 ). cipher
9070: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c s. = NULL
9080: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 ;. if (cipher
9090: 73 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 suites && !*ciph
90a0: 65 72 73 75 69 74 65 73 29 20 63 69 70 68 65 72 ersuites) cipher
90b0: 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c suites = NULL
90c0: 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 ;. if (CAfile
90d0: 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 && !*CAfile).
90e0: 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 CAfile.
90f0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
9100: 20 69 66 20 28 43 41 64 69 72 20 26 26 20 21 2a if (CAdir && !*
9110: 43 41 64 69 72 29 09 20 20 20 20 20 20 20 20 43 CAdir). C
9120: 41 64 69 72 09 20 20 20 20 20 20 20 20 3d 20 4e Adir. = N
9130: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 ULL;. if (DHp
9140: 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 arams && !*DHpar
9150: 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70 ams). DHp
9160: 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e arams = N
9170: 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 ULL;.. /* new
9180: 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 SSL state */.
9190: 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 statePtr..= (S
91a0: 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 tate *) ckalloc(
91b0: 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f (unsigned) sizeo
91c0: 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d f(State));. m
91d0: 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 emset(statePtr,
91e0: 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 0, sizeof(State)
91f0: 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 );.. statePtr
9200: 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b ->flags.= flags;
9210: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 . statePtr->i
9220: 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a nterp.= interp;.
9230: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 statePtr->vf
9240: 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 lags.= verify;.
9250: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 statePtr->err
9260: 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 .= "";.. /* a
9270: 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a llocate script *
9280: 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 /. if (script
9290: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f ) {..(void) Tcl_
92a0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
92b0: 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a (script, &len);.
92c0: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 .if (len) {..
92d0: 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 statePtr->callb
92e0: 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 ack = script;..
92f0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
9300: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 unt(statePtr->ca
9310: 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 llback);..}.
9320: 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 }.. /* alloca
9330: 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 te password */.
9340: 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 if (password)
9350: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 {..(void) Tcl_G
9360: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
9370: 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b password, &len);
9380: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 ..if (len) {..
9390: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 statePtr->pass
93a0: 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b word = password;
93b0: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
93c0: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
93d0: 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 >password);..}.
93e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
93f0: 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 ocate validate c
9400: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 ommand */. if
9410: 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 (vcmd) {..(void
9420: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
9430: 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 romObj(vcmd, &le
9440: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
9450: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 . statePtr->v
9460: 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 cmd = vcmd;..
9470: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
9480: 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 t(statePtr->vcmd
9490: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
94a0: 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 if (model != NU
94b0: 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b LL) {..int mode;
94c0: 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f ../* Get the "mo
94d0: 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a del" context */.
94e0: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 .chan = Tcl_GetC
94f0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d hannel(interp, m
9500: 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 odel, &mode);..i
9510: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
9520: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
9530: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
9540: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
9550: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
9560: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
9570: 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 *.. * Make sure
9580: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
9590: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
95a0: 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 l.. */..chan = T
95b0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
95c0: 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c (chan);..if (Tcl
95d0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
95e0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
95f0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 nnelType()) {..
9600: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
9610: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
9620: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
9630: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
9640: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e (chan),..."\": n
9650: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
9660: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 ", NULL);.. T
9670: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
9680: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
9690: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
96a0: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 R;..}..ctx = ((S
96b0: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
96c0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
96d0: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 a(chan))->ctx;.
96e0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
96f0: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 ((ctx = CTX_Init
9700: 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 (statePtr, serve
9710: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c r, proto, keyfil
9720: 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 e, certfile, key
9730: 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c , cert, key_len,
9740: 0a 09 20 20 20 20 63 65 72 74 5f 6c 65 6e 2c 20 .. cert_len,
9750: 43 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 CAdir, CAfile, c
9760: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 iphers, ciphersu
9770: 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 ites, level, DHp
9780: 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 arams)) == NULL)
9790: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
97a0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
97b0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
97c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
97d0: 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 }.. stateP
97e0: 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a tr->ctx = ctx;..
97f0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 /*. * We
9800: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 need to make su
9810: 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e re that the chan
9820: 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e nel works in bin
9830: 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 ary (for the.
9840: 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e * encryption n
9850: 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 ot to get goofed
9860: 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 up).. * We
9870: 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a only want to adj
9880: 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69 6e ust the bufferin
9890: 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e g in pre-v2 chan
98a0: 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20 nels, where.
98b0: 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 * each channel
98c0: 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69 in the stack mai
98d0: 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 ntained its own
98e0: 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f buffers.. */
98f0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
9900: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
9910: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
9920: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
9930: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
9940: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 lBlocking);.
9950: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
9960: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
9970: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 Char);. Tcl_D
9980: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
9990: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
99a0: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
99b0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
99c0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 rp, chan, "-eofc
99d0: 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e har", &upperChan
99e0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 nelEOFChar);.
99f0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
9a00: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
9a10: 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c an, "-encoding",
9a20: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e &upperChannelEn
9a30: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c coding);. Tcl
9a40: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
9a50: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
9a60: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 "-translation",
9a70: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
9a80: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 nslation);. T
9a90: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
9aa0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
9ab0: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 , "-blocking", &
9ac0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
9ad0: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 king);. Tcl_S
9ae0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
9af0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
9b00: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 translation", "b
9b10: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c inary");. Tcl
9b20: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
9b30: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
9b40: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 "-blocking", "tr
9b50: 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 ue");. dprint
9b60: 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c f("Consuming Tcl
9b70: 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 channel %s", Tc
9b80: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
9b90: 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 (chan));. sta
9ba0: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 tePtr->self = Tc
9bb0: 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 l_StackChannel(i
9bc0: 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e nterp, Tls_Chann
9bd0: 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e elType(), (Clien
9be0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c tData) statePtr,
9bf0: 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c (TCL_READABLE |
9c00: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 TCL_WRITABLE),
9c10: 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e chan);. dprin
9c20: 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e tf("Created chan
9c30: 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 nel named %s", T
9c40: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
9c50: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
9c60: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 ));. if (stat
9c70: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 ePtr->self == (T
9c80: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
9c90: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 ) {../*.. * No u
9ca0: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 se of Tcl_Eventu
9cb0: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 allyFree because
9cc0: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c no possible Tcl
9cd0: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a _Preserve... */.
9ce0: 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 .Tls_Free((char
9cf0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 *) statePtr);..r
9d00: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
9d10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
9d20: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
9d30: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
9d40: 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 r->self, "-trans
9d50: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 lation", Tcl_DSt
9d60: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
9d70: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
9d80: 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 on));. Tcl_Se
9d90: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
9da0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
9db0: 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e >self, "-encodin
9dc0: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 g", Tcl_DStringV
9dd0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
9de0: 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 elEncoding));.
9df0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
9e00: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 Option(interp, s
9e10: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 tatePtr->self, "
9e20: 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 -eofchar", Tcl_D
9e30: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
9e40: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
9e50: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ));. Tcl_SetC
9e60: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
9e70: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
9e80: 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 elf, "-blocking"
9e90: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
9ea0: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
9eb0: 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 Blocking));..
9ec0: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 /*. * SSL I
9ed0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 nitialization.
9ee0: 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 */. stateP
9ef0: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 tr->ssl = SSL_ne
9f00: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 w(statePtr->ctx)
9f10: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65 ;. if (!state
9f20: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 Ptr->ssl) {../*
9f30: 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f SSL library erro
9f40: 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 r */..Tcl_Append
9f50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
9f60: 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 couldn't constru
9f70: 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 ct ssl session:
9f80: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 ", REASON(), (ch
9f90: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c ar *) NULL);..Tl
9fa0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
9fb0: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 statePtr);..retu
9fc0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
9fd0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 }.. /* Set
9fe0: 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 host server name
9ff0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 */. if (serv
a000: 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 ername) {../* Se
a010: 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 ts the server na
a020: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 me indication (S
a030: 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c NI) in ClientHel
a040: 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a lo extension */.
a050: 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 ./* Per RFC 6066
a060: 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 , hostname is a
a070: 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 ASCII encoded st
a080: 72 69 6e 67 2e 20 2a 2f 0a 09 69 66 20 28 21 53 ring. */..if (!S
a090: 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f SL_set_tlsext_ho
a0a0: 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 st_name(statePtr
a0b0: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d ->ssl, servernam
a0c0: 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b e) && require) {
a0d0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
a0e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
a0f0: 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f 73 74 setting TLS host
a100: 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20 name extension
a110: 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a failed", (char *
a120: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c ) NULL);.. Tl
a130: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
a140: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
a150: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a160: 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 66 69 67 ;..}.../* Config
a170: 75 72 65 20 73 65 72 76 65 72 20 68 6f 73 74 20 ure server host
a180: 6e 61 6d 65 20 63 68 65 63 6b 73 20 69 6e 20 74 name checks in t
a190: 68 65 20 53 53 4c 20 63 6c 69 65 6e 74 2e 20 53 he SSL client. S
a1a0: 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 et DNS hostname
a1b0: 74 6f 0a 09 20 20 20 6e 61 6d 65 20 66 6f 72 20 to.. name for
a1c0: 70 65 65 72 20 63 65 72 74 69 66 69 63 61 74 65 peer certificate
a1d0: 20 63 68 65 63 6b 73 2e 20 53 53 4c 5f 73 65 74 checks. SSL_set
a1e0: 31 5f 68 6f 73 74 20 68 61 73 20 6c 69 6d 69 74 1_host has limit
a1f0: 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 ations. */..if (
a200: 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 !SSL_add1_host(s
a210: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 tatePtr->ssl, se
a220: 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 rvername)) {..
a230: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
a240: 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74 lt(interp, "sett
a250: 69 6e 67 20 44 4e 53 20 68 6f 73 74 20 6e 61 6d ing DNS host nam
a260: 65 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 e failed", (char
a270: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
a280: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
a290: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
a2a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
a2b0: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
a2c0: 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73 /* Resume sess
a2d0: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 ion id */. if
a2e0: 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 (session_id &&
a2f0: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 strlen(session_i
a300: 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 d) <= SSL_MAX_SI
a310: 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a D_CTX_LENGTH) {.
a320: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 ./* SSL_set_sess
a330: 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 ion() */..if (!S
a340: 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f SL_SESSION_set1_
a350: 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 id_context(SSL_g
a360: 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65 et_session(state
a370: 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69 Ptr->ssl), sessi
a380: 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 on_id, (unsigned
a390: 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 int) strlen(ses
a3a0: 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 sion_id))) {..
a3b0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
a3c0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 lt(interp, "Resu
a3d0: 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 22 2c me session id ",
a3e0: 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 22 20 66 session_id, " f
a3f0: 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 ailed", (char *)
a400: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 NULL);.
a410: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
a420: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
a430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 . ret
a440: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
a450: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 }. }.. if
a460: 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e (alpn) {../* Con
a470: 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20 vert a TCL list
a480: 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d into a protocol-
a490: 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 list in wire-for
a4a0: 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 mat */..unsigned
a4b0: 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a char *protos, *
a4c0: 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 p;..unsigned int
a4d0: 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b protos_len = 0;
a4e0: 0a 09 69 6e 74 20 69 2c 20 6c 65 6e 2c 20 63 6e ..int i, len, cn
a4f0: 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 t;..Tcl_Obj **li
a500: 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 st;...if (Tcl_Li
a510: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 stObjGetElements
a520: 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 (interp, alpn, &
a530: 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 cnt, &list) != T
a540: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c CL_OK) {.. Tl
a550: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
a560: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
a570: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a580: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d ;..}.../* Determ
a590: 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 ine the memory r
a5a0: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 equired for the
a5b0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f protocol-list */
a5c0: 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 ..for (i = 0; i
a5d0: 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 < cnt; i++) {..
a5e0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 Tcl_GetString
a5f0: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c FromObj(list[i],
a600: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 &len);.. if
a610: 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 (len > 255) {...
a620: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
a630: 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 (interp, "ALPN p
a640: 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f 6f rotocol name too
a650: 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 long", (char *)
a660: 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 NULL);...Tls_Fr
a670: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
a680: 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 ePtr);...return
a690: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
a6a0: 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 }.. protos_le
a6b0: 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e 3b 0a 09 7d n += 1 + len;..}
a6c0: 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 .../* Build the
a6d0: 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f complete protoco
a6e0: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f l-list */..proto
a6f0: 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 s = ckalloc(prot
a700: 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f os_len);../* pro
a710: 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 tocol-lists cons
a720: 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e ist of 8-bit len
a730: 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79 gth-prefixed, by
a740: 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 te strings */..f
a750: 6f 72 20 28 69 20 3d 20 30 2c 20 70 20 3d 20 70 or (i = 0, p = p
a760: 72 6f 74 6f 73 3b 20 69 20 3c 20 63 6e 74 3b 20 rotos; i < cnt;
a770: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 i++) {.. char
a780: 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 *str = Tcl_GetS
a790: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 tringFromObj(lis
a7a0: 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 t[i], &len);..
a7b0: 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 20 *p++ = len;..
a7c0: 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 memcpy(p, str
a7d0: 2c 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b , len);.. p +
a7e0: 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 = len;..}.../* S
a7f0: 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 SL_set_alpn_prot
a800: 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 os makes a copy
a810: 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d of the protocol-
a820: 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 list */../* Note
a830: 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 : This functions
a840: 20 72 65 76 65 72 73 65 73 20 74 68 65 20 72 65 reverses the re
a850: 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 turn value conve
a860: 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 ntion */..if (SS
a870: 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f L_set_alpn_proto
a880: 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c s(statePtr->ssl,
a890: 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f protos, protos_
a8a0: 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c len)) {.. Tcl
a8b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
a8c0: 74 65 72 70 2c 20 22 66 61 69 6c 65 64 20 74 6f terp, "failed to
a8d0: 20 73 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 set ALPN protoc
a8e0: 6f 6c 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ols", (char *) N
a8f0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
a900: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
a910: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 tePtr);.. ckf
a920: 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 ree(protos);..
a930: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
a940: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 OR;..}.../* Stor
a950: 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 e protocols list
a960: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 */..statePtr->p
a970: 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a rotos = protos;.
a980: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
a990: 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c s_len = protos_l
a9a0: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b en;. } else {
a9b0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
a9c0: 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 os = NULL;..stat
a9d0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e ePtr->protos_len
a9e0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 = 0;. }..
a9f0: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 /*. * SSL C
aa00: 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f allbacks. */
aa10: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 . SSL_set_app
aa20: 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e _data(statePtr->
aa30: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ssl, (void *)sta
aa40: 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 tePtr);./* point
aa50: 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 back to us */.
aa60: 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 SSL_set_verif
aa70: 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c y(statePtr->ssl,
aa80: 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 verify, VerifyC
aa90: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 allback);. SS
aaa0: 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 L_set_info_callb
aab0: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ack(statePtr->ss
aac0: 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 l, InfoCallback)
aad0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 ;.. /* Create
aae0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f Tcl_Channel BIO
aaf0: 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 Handler */.
ab00: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 statePtr->p_bio.
ab10: 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 = BIO_new_tcl(st
ab20: 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c atePtr, BIO_NOCL
ab30: 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 OSE);. stateP
ab40: 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 tr->bio.= BIO_ne
ab50: 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a w(BIO_f_ssl());.
ab60: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 29 . if (server)
ab70: 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 {../* Server ca
ab80: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f llbacks */..SSL_
ab90: 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 CTX_set_tlsext_s
aba0: 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 ervername_arg(st
abb0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f atePtr->ctx, (vo
abc0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
abd0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 .SSL_CTX_set_tls
abe0: 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 ext_servername_c
abf0: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 allback(statePtr
ac00: 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 ->ctx, SNICallba
ac10: 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 ck);..SSL_CTX_se
ac20: 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 t_client_hello_c
ac30: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c b(statePtr->ctx,
ac40: 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 HelloCallback,
ac50: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
ac60: 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 );..if (statePtr
ac70: 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c ->protos != NULL
ac80: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 ) {.. SSL_CTX
ac90: 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 _set_alpn_select
aca0: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
acb0: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c x, ALPNCallback,
acc0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
acd0: 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e r);.#ifdef USE_N
ace0: 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31 PN.. if (tls1
acf0: 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f _2 == 0 && tls1_
ad00: 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 3 == 0) {...SSL_
ad10: 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f CTX_set_next_pro
ad20: 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63 tos_advertised_c
ad30: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c b(statePtr->ctx,
ad40: 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 NPNCallback, (v
ad50: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
ad60: 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 .. }.#endif..
ad70: 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 }.../* Enable se
ad80: 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 rver to send cer
ad90: 74 20 72 65 71 75 65 73 74 20 61 66 74 65 72 20 t request after
ada0: 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 handshake (TLS 1
adb0: 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 .3 only) */../*
adc0: 41 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f A write operatio
add0: 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63 n must take plac
ade0: 65 20 66 6f 72 20 74 68 65 20 43 65 72 74 69 66 e for the Certif
adf0: 69 63 61 74 65 20 52 65 71 75 65 73 74 20 74 6f icate Request to
ae00: 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 be.. sent to
ae10: 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 the client, this
ae20: 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 can be done wit
ae30: 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 h SSL_do_handsha
ae40: 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 ke(). */..if (re
ae50: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 quest && post_ha
ae60: 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 ndshake) {..
ae70: 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e SSL_verify_clien
ae80: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 t_post_handshake
ae90: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
aea0: 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 ..}.../* Set ser
aeb0: 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 ver mode */..sta
aec0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 tePtr->flags |=
aed0: 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a TLS_TCL_SERVER;.
aee0: 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f .SSL_set_accept_
aef0: 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e state(statePtr->
af00: 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ssl);. } else
af10: 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 {../* Client ca
af20: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 llbacks */.#ifde
af30: 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 f USE_NPN..if (s
af40: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
af50: 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f != NULL && tls1_
af60: 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 2 == 0 && tls1_3
af70: 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 53 53 == 0) {.. SS
af80: 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 L_CTX_set_next_p
af90: 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 roto_select_cb(s
afa0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c tatePtr->ctx, AL
afb0: 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 PNCallback, (voi
afc0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 d *)statePtr);..
afd0: 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 }.#endif.../* Se
afe0: 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f ssion caching */
aff0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 ..SSL_CTX_set_se
b000: 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 ssion_cache_mode
b010: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
b020: 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 SSL_SESS_CACHE_C
b030: 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 LIENT | SSL_SESS
b040: 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e _CACHE_NO_INTERN
b050: 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f AL_STORE);..SSL_
b060: 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 CTX_sess_set_new
b070: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
b080: 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 x, SessionCallba
b090: 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 ck);.../* Enable
b0a0: 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 20 post handshake
b0b0: 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 Authentication e
b0c0: 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e xtension. TLS 1.
b0d0: 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 3 only, not http
b0e0: 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 /2. */..if (requ
b0f0: 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 est && post_hand
b100: 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 shake) {.. SS
b110: 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 L_set_post_hands
b120: 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74 65 50 hake_auth(stateP
b130: 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a tr->ssl, 1);..}.
b140: 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 ../* Set client
b150: 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 mode */..SSL_set
b160: 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 _connect_state(s
b170: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
b180: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 }. SSL_set
b190: 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 _bio(statePtr->s
b1a0: 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f sl, statePtr->p_
b1b0: 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 bio, statePtr->p
b1c0: 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 _bio);. BIO_s
b1d0: 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d et_ssl(statePtr-
b1e0: 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e >bio, statePtr->
b1f0: 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 ssl, BIO_NOCLOSE
b200: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 );.. /*.
b210: 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 * End of SSL Ini
b220: 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 t. */. dp
b230: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
b240: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 %s", Tcl_GetCha
b250: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
b260: 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 r->self));. T
b270: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
b280: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 erp, (char *) Tc
b290: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
b2a0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
b2b0: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b , TCL_VOLATILE);
b2c0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
b2d0: 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 _OK;..clientData
b2e0: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d = clientData;.}
b2f0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
b300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
b340: 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 * UnimportObjCmd
b350: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
b360: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
b370: 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 ked to remove th
b380: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
b390: 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 l filter.. *. *
b3a0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
b3b0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
b3c0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
b3d0: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f fects:. *.May mo
b3e0: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f dify the behavio
b3f0: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e r of an IO chann
b400: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d el.. *. *-------
b410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
b450: 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d .static int.Unim
b460: 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e portObjCmd(Clien
b470: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
b480: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
b490: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
b4a0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
b4b0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
b4c0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 _Channel chan;..
b4d0: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 /* The channel t
b4e0: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e o set a mode on.
b4f0: 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 */.. dprintf
b500: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
b510: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 if (objc != 2)
b520: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
b530: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
b540: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b bjv, "channel");
b550: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
b560: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 OR;. }.. c
b570: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
b580: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
b590: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
b5a0: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 1]), NULL);.
b5b0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
b5c0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
b5d0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
b5e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
b5f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
b600: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
b610: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
b620: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
b630: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
b640: 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 han);.. if (T
b650: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
b660: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
b670: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
b680: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
b690: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
b6a0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
b6b0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
b6c0: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 han),..."\": not
b6d0: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
b6e0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
b6f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
b700: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e .. if (Tcl_Un
b710: 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 stackChannel(int
b720: 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 erp, chan) == TC
b730: 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 L_ERROR) {..retu
b740: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
b750: 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 }.. return
b760: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 TCL_OK;..clientD
b770: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
b780: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
b790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
b7d0: 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d *. * CTX_Init --
b7e0: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c construct a SSL
b7f0: 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a _CTX instance. *
b800: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
b810: 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 A valid SSL_CTX
b820: 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c instance or NULL
b830: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
b840: 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 ects:. *.constru
b850: 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 cts SSL context
b860: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d (CTX). *. *-----
b870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
b8b0: 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 */.static SSL_CT
b8c0: 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 X *.CTX_Init(Sta
b8d0: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e te *statePtr, in
b8e0: 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 t isServer, int
b8f0: 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 proto, char *key
b900: 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74 file, char *cert
b910: 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e file,. unsign
b920: 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e ed char *key, un
b930: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 signed char *cer
b940: 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 t, int key_len,
b950: 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 int cert_len, ch
b960: 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 63 ar *CAdir,. c
b970: 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 har *CAfile, cha
b980: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 r *ciphers, char
b990: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 *ciphersuites,
b9a0: 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 int level, char
b9b0: 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 *DHparams) {.
b9c0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
b9d0: 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e erp = statePtr->
b9e0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f interp;. SSL_
b9f0: 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b CTX *ctx = NULL;
ba00: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
ba10: 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ds;. Tcl_DSt
ba20: 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e ring ds1;. in
ba30: 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 t off = 0;. i
ba40: 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f nt load_private_
ba50: 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 key;. const S
ba60: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f SL_METHOD *metho
ba70: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 d;.. dprintf(
ba80: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
ba90: 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 if (!proto) {..T
baa0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
bab0: 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 interp, "no vali
bac0: 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 d protocol selec
bad0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ted", NULL);..re
bae0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
baf0: 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 .. /* create
bb00: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 SSL context */.#
bb10: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
bb20: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 ON_NUMBER >= 0x1
bb30: 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 0100000L || defi
bb40: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 ned(NO_SSL2) ||
bb50: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
bb60: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 NO_SSL2). if
bb70: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
bb80: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 TLS_PROTO_SSL2))
bb90: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
bba0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 sult(interp, "SS
bbb0: 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 L2 protocol not
bbc0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
bbd0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
bbe0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 . }.#endif.#i
bbf0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c f defined(NO_SSL
bc00: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
bc10: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 ENSSL_NO_SSL3).
bc20: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
bc30: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
bc40: 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 SSL3)) {..Tcl_Ap
bc50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
bc60: 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f p, "SSL3 protoco
bc70: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
bc80: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
bc90: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
bca0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
bcb0: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 NO_TLS1) || defi
bcc0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
bcd0: 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 LS1). if (ENA
bce0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
bcf0: 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 PROTO_TLS1)) {..
bd00: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
bd10: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e (interp, "TLS 1.
bd20: 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 0 protocol not s
bd30: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
bd40: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
bd50: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
bd60: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
bd70: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
bd80: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
bd90: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
bda0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
bdb0: 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 TO_TLS1_1)) {..T
bdc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
bdd0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 interp, "TLS 1.1
bde0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
bdf0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
be00: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
be10: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
be20: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
be30: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
be40: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
be50: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
be60: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
be70: 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 O_TLS1_2)) {..Tc
be80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
be90: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 nterp, "TLS 1.2
bea0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
beb0: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
bec0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
bed0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 }.#endif.#if d
bee0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
bef0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
bf00: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
bf10: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 if (ENABLED(
bf20: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
bf30: 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c _TLS1_3)) {..Tcl
bf40: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
bf50: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 terp, "TLS 1.3 p
bf60: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
bf70: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
bf80: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
bf90: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 }.#endif.. s
bfa0: 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a witch (proto) {.
bfb0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
bfc0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
bfd0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
bfe0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
bff0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
c000: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 L_NO_SSL2). c
c010: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 ase TLS_PROTO_SS
c020: 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 L2:..method = is
c030: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 Server ? SSLv2_s
c040: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
c050: 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 SSLv2_client_me
c060: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
c070: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
c080: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 ned(NO_SSL3) &&
c090: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
c0a0: 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 _NO_SSL3) && !de
c0b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
c0c0: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 _SSL3_METHOD).
c0d0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
c0e0: 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d _SSL3:..method =
c0f0: 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 isServer ? SSLv
c100: 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 3_server_method(
c110: 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 ) : SSLv3_client
c120: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
c130: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
c140: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
c150: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
c160: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 SSL_NO_TLS1) &&
c170: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
c180: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 _NO_TLS1_METHOD)
c190: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
c1a0: 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f OTO_TLS1:..metho
c1b0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
c1c0: 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 LSv1_server_meth
c1d0: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 od() : TLSv1_cli
c1e0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
c1f0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
c200: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
c210: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
c220: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
c230: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
c240: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
c250: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 1_METHOD). ca
c260: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
c270: 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 1_1:..method = i
c280: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f sServer ? TLSv1_
c290: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 1_server_method(
c2a0: 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 ) : TLSv1_1_clie
c2b0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
c2c0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
c2d0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
c2e0: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
c2f0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
c300: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
c310: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
c320: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 _METHOD). cas
c330: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
c340: 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 _2:..method = is
c350: 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 Server ? TLSv1_2
c360: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
c370: 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e : TLSv1_2_clien
c380: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
c390: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
c3a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
c3b0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
c3c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
c3d0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
c3e0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a ROTO_TLS1_3:../*
c3f0: 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 69 63 Use the generic
c400: 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 method and cons
c410: 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74 traint range aft
c420: 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 er context is cr
c430: 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 eated */..method
c440: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c = isServer ? TL
c450: 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 S_server_method(
c460: 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d ) : TLS_client_m
c470: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
c480: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 .#endif. defa
c490: 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 ult:../* Negotia
c4a0: 74 65 20 68 69 67 68 65 73 74 20 61 76 61 69 6c te highest avail
c4b0: 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 able SSL/TLS ver
c4c0: 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 sion */..method
c4d0: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 = isServer ? TLS
c4e0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
c4f0: 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 : TLS_client_me
c500: 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e thod();.#if OPEN
c510: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
c520: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c ER < 0x10100000L
c530: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f && !defined(NO_
c540: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 SSL2) && !define
c550: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
c560: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 2)..off |= (ENAB
c570: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
c580: 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 ROTO_SSL2) ? 0
c590: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c : SSL_OP_NO_SSL
c5a0: 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 v2);.#endif.#if
c5b0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 !defined(NO_SSL3
c5c0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
c5d0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 ENSSL_NO_SSL3)..
c5e0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
c5f0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
c600: 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 _SSL3) ? 0 : S
c610: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b SL_OP_NO_SSLv3);
c620: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
c630: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 ined(NO_TLS1) &&
c640: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
c650: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 L_NO_TLS1)..off
c660: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
c670: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
c680: 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 1) ? 0 : SSL_O
c690: 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e P_NO_TLSv1);.#en
c6a0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
c6b0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 (NO_TLS1_1) && !
c6c0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
c6d0: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 NO_TLS1_1)..off
c6e0: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
c6f0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
c700: 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 1_1) ? 0 : SSL_O
c710: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 P_NO_TLSv1_1);.#
c720: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
c730: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 ed(NO_TLS1_2) &&
c740: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
c750: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 L_NO_TLS1_2)..of
c760: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
c770: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
c780: 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c LS1_2) ? 0 : SSL
c790: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b _OP_NO_TLSv1_2);
c7a0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
c7b0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
c7c0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
c7d0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 SSL_NO_TLS1_3)..
c7e0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
c7f0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
c800: 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 _TLS1_3) ? 0 : S
c810: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 SL_OP_NO_TLSv1_3
c820: 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b );.#endif..break
c830: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
c840: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
c850: 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 . ctx = SSL_C
c860: 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a TX_new(method);.
c870: 20 20 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a if (!ctx) {.
c880: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 .return(NULL);.
c890: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 }.. if (ge
c8a0: 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 tenv(SSLKEYLOGFI
c8b0: 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f LE)) {..SSL_CTX_
c8c0: 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 set_keylog_callb
c8d0: 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 ack(ctx, KeyLogC
c8e0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a allback);. }.
c8f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
c900: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 _TLS1_3) && !def
c910: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
c920: 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 TLS1_3). if (
c930: 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f proto == TLS_PRO
c940: 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 TO_TLS1_3) {..SS
c950: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 L_CTX_set_min_pr
c960: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
c970: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 TLS1_3_VERSION)
c980: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d ;..SSL_CTX_set_m
c990: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e ax_proto_version
c9a0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 (ctx, TLS1_3_VER
c9b0: 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e SION);. }.#en
c9c0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 dif.. /* Forc
c9d0: 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74 69 e cipher selecti
c9e0: 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72 76 on order by serv
c9f0: 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 er */. if (!i
ca00: 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f sServer) {..SSL_
ca10: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
ca20: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 ctx, SSL_OP_CIPH
ca30: 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52 ER_SERVER_PREFER
ca40: 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 ENCE);. }..
ca50: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 SSL_CTX_set_ap
ca60: 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 p_data(ctx, (voi
ca70: 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 d*)interp);./* r
ca80: 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 emember the inte
ca90: 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 rpreter */. S
caa0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
cab0: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 ns(ctx, SSL_OP_A
cac0: 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 LL);./* all SSL
cad0: 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 bug workarounds
cae0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
caf0: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
cb00: 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c off);../* disabl
cb10: 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 e protocol versi
cb20: 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 ons */.#if OPENS
cb30: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
cb40: 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a R < 0x10101000L.
cb50: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
cb60: 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f mode(ctx, SSL_MO
cb70: 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 DE_AUTO_RETRY);.
cb80: 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 /* handle new ha
cb90: 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b ndshakes in back
cba0: 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65 ground. On by de
cbb0: 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c fault in OpenSSL
cbc0: 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 1.1.1. */.#endi
cbd0: 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 f. SSL_CTX_se
cbe0: 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a ss_set_cache_siz
cbf0: 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 e(ctx, 128);..
cc00: 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 /* Set user de
cc10: 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 fined ciphers, c
cc20: 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e ipher suites, an
cc30: 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c d security level
cc40: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 */. if ((cip
cc50: 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 hers != NULL) &&
cc60: 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 !SSL_CTX_set_ci
cc70: 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 pher_list(ctx, c
cc80: 69 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f iphers)) {..Tcl_
cc90: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
cca0: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 erp, "Set cipher
ccb0: 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c s failed: No val
ccc0: 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 id ciphers", (ch
ccd0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 ar *) NULL);..SS
cce0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
ccf0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
cd00: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 }. if ((ci
cd10: 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 phersuites != NU
cd20: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f LL) && !SSL_CTX_
cd30: 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 set_ciphersuites
cd40: 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 (ctx, ciphersuit
cd50: 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 es)) {..Tcl_Appe
cd60: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
cd70: 20 22 53 65 74 20 63 69 70 68 65 72 20 73 75 69 "Set cipher sui
cd80: 74 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 tes failed: No v
cd90: 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 alid ciphers", (
cda0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
cdb0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
cdc0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
cdd0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
cde0: 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 et security leve
cdf0: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 l */. if (lev
ce00: 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c el > -1 && level
ce10: 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f < 6) {../* SSL_
ce20: 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 set_security_lev
ce30: 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 el */..SSL_CTX_s
ce40: 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 et_security_leve
ce50: 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 l(ctx, level);.
ce60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 }.. /* set
ce70: 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 some callbacks
ce80: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
ce90: 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 et_default_passw
cea0: 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f d_cb(ctx, Passwo
ceb0: 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 rdCallback);.
cec0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 SSL_CTX_set_def
ced0: 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 ault_passwd_cb_u
cee0: 73 65 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f serdata(ctx, (vo
cef0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
cf00: 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 . /* read a D
cf10: 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 iffie-Hellman pa
cf20: 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f rameters file, o
cf30: 72 20 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d r use the built-
cf40: 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 in one */.#ifdef
cf50: 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 OPENSSL_NO_DH.
cf60: 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 if (DHparams
cf70: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f != NULL) {..Tcl_
cf80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
cf90: 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74 erp, "DH paramet
cfa0: 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 er support not a
cfb0: 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 vailable", (char
cfc0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f *) NULL);..SSL_
cfd0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
cfe0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
cff0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 }.#else. {..
d000: 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 DH* dh;..if (DHp
d010: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b arams != NULL) {
d020: 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a .. BIO *bio;.
d030: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d040: 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20 Init(&ds);..
d050: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 bio = BIO_new_fi
d060: 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c le(F2N(DHparams,
d070: 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 &ds), "r");..
d080: 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 if (!bio) {...
d090: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
d0a0: 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 &ds);...Tcl_Appe
d0b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
d0c0: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 "Could not find
d0d0: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 DH parameters f
d0e0: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ile", (char *) N
d0f0: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
d100: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
d110: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
d120: 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f ... dh = PEM_
d130: 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d read_bio_DHparam
d140: 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c s(bio, NULL, NUL
d150: 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 L, NULL);.. B
d160: 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 IO_free(bio);..
d170: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
d180: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 ee(&ds);.. if
d190: 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 (!dh) {...Tcl_A
d1a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
d1b0: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 rp, "Could not r
d1c0: 65 61 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 ead DH parameter
d1d0: 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 s from file", (c
d1e0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
d1f0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
d200: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
d210: 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 ;.. }..} else
d220: 20 7b 0a 09 20 20 20 20 64 68 20 3d 20 67 65 74 {.. dh = get
d230: 5f 64 68 50 61 72 61 6d 73 28 29 3b 0a 09 7d 0a _dhParams();..}.
d240: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 .SSL_CTX_set_tmp
d250: 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 44 _dh(ctx, dh);..D
d260: 48 5f 66 72 65 65 28 64 68 29 3b 0a 20 20 20 20 H_free(dh);.
d270: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a }.#endif.. /*
d280: 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 set our certifi
d290: 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 cate */. load
d2a0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 _private_key = 0
d2b0: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 ;. if (certfi
d2c0: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c le != NULL) {..l
d2d0: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 oad_private_key
d2e0: 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 = 1;...Tcl_DStri
d2f0: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 ngInit(&ds);...i
d300: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
d310: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 ertificate_file(
d320: 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c ctx, F2N(certfil
d330: 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c e, &ds), SSL_FIL
d340: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 ETYPE_PEM) <= 0)
d350: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 {.. Tcl_DStr
d360: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
d370: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
d380: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
d390: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 ble to set certi
d3a0: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 ficate file ", c
d3b0: 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 ertfile, ": ",..
d3c0: 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c .. REASON(),
d3d0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d3e0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
d3f0: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
d400: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 turn NULL;..}.
d410: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 } else if (cer
d420: 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f t != NULL) {..lo
d430: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d ad_private_key =
d440: 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 1;..if (SSL_CTX
d450: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
d460: 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 72 74 5f _ASN1(ctx, cert_
d470: 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 len, cert) <= 0)
d480: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 {.. Tcl_DStr
d490: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
d4a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
d4b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
d4c0: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 ble to set certi
d4d0: 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 09 20 20 ficate: ",....
d4e0: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 REASON(), (ch
d4f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
d500: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
d510: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
d520: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 NULL;..}. }
d530: 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 else {..certfile
d540: 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 = (char*)X509_g
d550: 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f et_default_cert_
d560: 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 file();...if (SS
d570: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 L_CTX_use_certif
d580: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 icate_file(ctx,
d590: 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 certfile, SSL_FI
d5a0: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 LETYPE_PEM) <= 0
d5b0: 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 ) {.#if 0.. T
d5c0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
d5d0: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 ds);.. Tcl_Ap
d5e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
d5f0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 p, "unable to us
d600: 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 e default certif
d610: 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 icate file ", ce
d620: 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 rtfile, ": ",...
d630: 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 . REASON(),
d640: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
d650: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 . SSL_CTX_fre
d660: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 e(ctx);.. ret
d670: 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 urn NULL;.#endif
d680: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
d690: 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 * set our privat
d6a0: 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 e key */. if
d6b0: 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 (load_private_ke
d6c0: 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c y) {..if (keyfil
d6d0: 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 e == NULL && key
d6e0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 == NULL) {..
d6f0: 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 keyfile = certf
d700: 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 ile;..}...if (ke
d710: 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b yfile != NULL) {
d720: 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 .. /* get the
d730: 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 private key ass
d740: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 ociated with thi
d750: 73 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f s certificate */
d760: 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c .. if (keyfil
d770: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b e == NULL) {...k
d780: 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c eyfile = certfil
d790: 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 e;.. }...
d7a0: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
d7b0: 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 PrivateKey_file(
d7c0: 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 ctx, F2N(keyfile
d7d0: 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 , &ds), SSL_FILE
d7e0: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 TYPE_PEM) <= 0)
d7f0: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 {...Tcl_DStringF
d800: 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 ree(&ds);.../* f
d810: 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 lush the passphr
d820: 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 ase which might
d830: 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 be left in the r
d840: 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 esult */...Tcl_S
d850: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
d860: 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 NULL, TCL_STATI
d870: 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 C);...Tcl_Append
d880: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d890: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 unable to set pu
d8a0: 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c blic key file ",
d8b0: 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 keyfile, " ",..
d8c0: 09 09 20 20 20 20 20 20 20 20 20 52 45 41 53 4f .. REASO
d8d0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
d8e0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
d8f0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
d900: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a rn NULL;.. }.
d910: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d920: 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 Free(&ds);...} e
d930: 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e lse if (key != N
d940: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 ULL) {.. if (
d950: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 SSL_CTX_use_Priv
d960: 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f ateKey_ASN1(EVP_
d970: 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b PKEY_RSA, ctx, k
d980: 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 ey,key_len) <= 0
d990: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
d9a0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a gFree(&ds);.../*
d9b0: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
d9c0: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
d9d0: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
d9e0: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
d9f0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
da00: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
da10: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
da20: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
da30: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
da40: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 public key: ", R
da50: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
da60: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
da70: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
da80: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 return NULL;..
da90: 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 }..}../* Now w
daa0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 e know that a ke
dab0: 79 20 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 y and cert have
dac0: 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 been set against
dad0: 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e .. * the SSL con
dae0: 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 text */..if (!SS
daf0: 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 L_CTX_check_priv
db00: 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a ate_key(ctx)) {.
db10: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
db20: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 esult(interp, "p
db30: 72 69 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 rivate key does
db40: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 not match the ce
db50: 72 74 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 rtificate public
db60: 20 6b 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 key",.... (
db70: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
db80: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
db90: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 (ctx);.. retu
dba0: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 rn NULL;..}.
dbb0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 76 65 }.. /* Set ve
dbc0: 72 69 66 69 63 61 74 69 6f 6e 20 43 41 73 20 2a rification CAs *
dbd0: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e /. Tcl_DStrin
dbe0: 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20 gInit(&ds);.
dbf0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
dc00: 26 64 73 31 29 3b 0a 20 20 20 20 69 66 20 28 21 &ds1);. if (!
dc10: 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 SSL_CTX_load_ver
dc20: 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 ify_locations(ct
dc30: 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 x, F2N(CAfile, &
dc40: 64 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 ds), F2N(CAdir,
dc50: 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f &ds1)) ||..!SSL_
dc60: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
dc70: 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 verify_paths(ctx
dc80: 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f )) {.#if 0..Tcl_
dc90: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
dca0: 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ;..Tcl_DStringFr
dcb0: 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f ee(&ds1);../* Do
dcc0: 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63 61 n't currently ca
dcd0: 72 65 20 69 66 20 74 68 69 73 20 66 61 69 6c 73 re if this fails
dce0: 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 */..Tcl_AppendR
dcf0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
dd00: 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69 66 SL default verif
dd10: 79 20 70 61 74 68 73 3a 20 22 2c 20 52 45 41 53 y paths: ", REAS
dd20: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
dd30: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
dd40: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
dd50: 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 n NULL;.#endif.
dd60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 }.. /* htt
dd70: 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 ps://sourceforge
dd80: 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f .net/p/tls/bugs/
dd90: 35 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 57/ */. /* XX
dda0: 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 X:TODO: Let the
ddb0: 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 user supply valu
ddc0: 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 es here instead
ddd0: 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 of something tha
dde0: 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 t exists on the
ddf0: 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 filesystem */.
de00: 20 20 69 66 20 28 43 41 66 69 6c 65 20 21 3d 20 if (CAfile !=
de10: 4e 55 4c 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f NULL) {..STACK_O
de20: 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 F(X509_NAME) *ce
de30: 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f rtNames = SSL_lo
de40: 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c ad_client_CA_fil
de50: 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 e(F2N(CAfile, &d
de60: 73 29 29 3b 0a 09 69 66 20 28 63 65 72 74 4e 61 s));..if (certNa
de70: 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 mes != NULL) {..
de80: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
de90: 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 client_CA_list(c
dea0: 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a tx, certNames);.
deb0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 .}. }.. Tc
dec0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
ded0: 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 s);. Tcl_DStr
dee0: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 20 ingFree(&ds1);.
def0: 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d return ctx;.}
df00: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
df10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
df20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
df30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
df40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
df50: 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d * StatusObjCmd -
df60: 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 - return certifi
df70: 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 cate for connect
df80: 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 ed peer.. *. * R
df90: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
dfa0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
dfb0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
dfc0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
dfd0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
dfe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e010: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
e020: 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a ic int.StatusObj
e030: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
e040: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
e050: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
e060: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
e070: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
e080: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
e090: 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 tePtr;. X509
e0a0: 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f *peer;. Tcl_O
e0b0: 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 bj *objPtr;.
e0c0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
e0d0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e ;. char *chan
e0e0: 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 nelName, *cipher
e0f0: 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b s;. int mode;
e100: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
e110: 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b ned char *proto;
e120: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e . unsigned in
e130: 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e t len;. int n
e140: 69 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 id;.. dprintf
e150: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
e160: 20 73 77 69 74 63 68 20 28 6f 62 6a 63 29 20 7b switch (objc) {
e170: 0a 09 63 61 73 65 20 32 3a 0a 09 20 20 20 20 63 ..case 2:.. c
e180: 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c hannelName = Tcl
e190: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
e1a0: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 j(objv[1], NULL)
e1b0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ;.. break;...
e1c0: 63 61 73 65 20 33 3a 0a 09 20 20 20 20 69 66 20 case 3:.. if
e1d0: 28 21 73 74 72 63 6d 70 20 28 54 63 6c 5f 47 65 (!strcmp (Tcl_Ge
e1e0: 74 53 74 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d tString (objv[1]
e1f0: 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a ), "-local")) {.
e200: 09 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 ..channelName =
e210: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
e220: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 mObj(objv[2], NU
e230: 4c 4c 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 LL);...break;..
e240: 20 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73 }.. /* els
e250: 65 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2e e fall-through .
e260: 2e 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 .. */.#if define
e270: 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 20 20 20 d(__GNUC__)..
e280: 20 5f 5f 61 74 74 72 69 62 75 74 65 5f 5f 28 28 __attribute__((
e290: 66 61 6c 6c 74 68 72 6f 75 67 68 29 29 3b 0a 23 fallthrough));.#
e2a0: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a endif..default:.
e2b0: 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 . Tcl_WrongNu
e2c0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
e2d0: 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f objv, "?-local?
e2e0: 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 channel");..
e2f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
e300: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 R;. }.. ch
e310: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
e320: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e nel(interp, chan
e330: 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b nelName, &mode);
e340: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
e350: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
e360: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
e370: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
e380: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
e390: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
e3a0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
e3b0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
e3c0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
e3d0: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 el(chan);. if
e3e0: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
e3f0: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
e400: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
e410: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
e420: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
e430: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
e440: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
e450: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 e(chan),..."\":
e460: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
e470: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 l", NULL);..retu
e480: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
e490: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 }. statePtr
e4a0: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c = (State *) Tcl
e4b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
e4c0: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a nceData(chan);..
e4d0: 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 /* Get certi
e4e0: 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 ficate for peer
e4f0: 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 or self */. i
e500: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a f (objc == 2) {.
e510: 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f .peer = SSL_get_
e520: 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 peer_certificate
e530: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
e540: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 . } else {..p
e550: 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 eer = SSL_get_ce
e560: 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 rtificate(stateP
e570: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a tr->ssl);. }.
e580: 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a if (peer) {.
e590: 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 .objPtr = Tls_Ne
e5a0: 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c wX509Obj(interp,
e5b0: 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a peer);..if (obj
e5c0: 63 20 3d 3d 20 32 29 20 7b 20 58 35 30 39 5f 66 c == 2) { X509_f
e5d0: 72 65 65 28 70 65 65 72 29 3b 20 7d 0a 20 20 20 ree(peer); }.
e5e0: 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 } else {..objPt
e5f0: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
e600: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 bj(0, NULL);.
e610: 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 }.. /* Peer
e620: 63 65 72 74 20 63 68 61 69 6e 20 28 63 6c 69 65 cert chain (clie
e630: 6e 74 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20 nt only) */.
e640: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20 STACK_OF(X509)*
e650: 73 73 6c 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f ssl_certs = SSL_
e660: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 5f 63 68 get_peer_cert_ch
e670: 61 69 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ain(statePtr->ss
e680: 6c 29 3b 0a 20 20 20 20 69 66 20 28 21 70 65 65 l);. if (!pee
e690: 72 20 26 26 20 28 73 73 6c 5f 63 65 72 74 73 20 r && (ssl_certs
e6a0: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35 == NULL || sk_X5
e6b0: 30 39 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 74 73 09_num(ssl_certs
e6c0: 29 20 3d 3d 20 30 29 29 20 7b 0a 09 72 65 74 75 ) == 0)) {..retu
e6d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
e6e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 }.. /* Peer
e6f0: 20 6e 61 6d 65 20 66 72 6f 6d 20 63 65 72 74 20 name from cert
e700: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f */. Tcl_ListO
e710: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e720: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e730: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e740: 28 22 70 65 65 72 6e 61 6d 65 22 2c 20 2d 31 29 ("peername", -1)
e750: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
e760: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e770: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e780: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e790: 28 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 (SSL_get0_peerna
e7a0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c me(statePtr->ssl
e7b0: 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 ), -1));.. Tc
e7c0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
e7d0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
e7e0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
e7f0: 72 69 6e 67 4f 62 6a 28 22 73 62 69 74 73 22 2c ringObj("sbits",
e800: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
e810: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
e820: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
e830: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
e840: 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 j(SSL_get_cipher
e850: 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e _bits(statePtr->
e860: 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 ssl, NULL)));..
e870: 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 ciphers = (ch
e880: 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 ar*)SSL_get_ciph
e890: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c er(statePtr->ssl
e8a0: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 );. if ((ciph
e8b0: 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 ers != NULL) &&
e8c0: 28 73 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c (strcmp(ciphers,
e8d0: 20 22 28 4e 4f 4e 45 29 22 29 20 21 3d 20 30 29 "(NONE)") != 0)
e8e0: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
e8f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
e900: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
e910: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
e920: 63 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 cipher", -1));..
e930: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e940: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e950: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
e960: 53 74 72 69 6e 67 4f 62 6a 28 63 69 70 68 65 72 StringObj(cipher
e970: 73 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a s, -1));. }..
e980: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 /* Verify th
e990: 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 e X509 certifica
e9a0: 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 te presented by
e9b0: 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 the peer */.
e9c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e9d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e9e0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
e9f0: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 StringObj("verif
ea00: 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a ication", -1));.
ea10: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
ea20: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
ea30: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 54 63 erp, objPtr,..Tc
ea40: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 58 l_NewStringObj(X
ea50: 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 509_verify_cert_
ea60: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c error_string(SSL
ea70: 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 _get_verify_resu
ea80: 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c lt(statePtr->ssl
ea90: 29 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f )), -1));.. /
eaa0: 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c * Report the sel
eab0: 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
eac0: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 s a result of th
ead0: 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f e negotiation */
eae0: 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c . SSL_get0_al
eaf0: 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 pn_selected(stat
eb00: 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 ePtr->ssl, &prot
eb10: 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 o, &len);. Tc
eb20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
eb30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
eb40: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
eb50: 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 ringObj("alpn",
eb60: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
eb70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
eb80: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
eb90: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
eba0: 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 Obj((char *)prot
ebb0: 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a o, (int) len));.
ebc0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
ebd0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
ebe0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
ebf0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 _NewStringObj("p
ec00: 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a rotocol", -1));.
ec10: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
ec20: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
ec30: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
ec40: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
ec50: 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 L_get_version(st
ec60: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 atePtr->ssl), -1
ec70: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 ));.. /* Vali
ec80: 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 d for non-RSA si
ec90: 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 gnature and TLS
eca0: 31 2e 33 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 1.3 */. Tcl_L
ecb0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
ecc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
ecd0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
ece0: 67 4f 62 6a 28 22 73 69 67 6e 61 74 75 72 65 48 gObj("signatureH
ecf0: 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 2d ashAlgorithm", -
ed00: 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 1));. if (obj
ed10: 63 20 3d 3d 20 32 20 3f 20 53 53 4c 5f 67 65 74 c == 2 ? SSL_get
ed20: 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f _peer_signature_
ed30: 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
ed40: 6c 2c 20 26 6e 69 64 29 20 3a 20 53 53 4c 5f 67 l, &nid) : SSL_g
ed50: 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 et_signature_nid
ed60: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
ed70: 26 6e 69 64 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 &nid)) {..Tcl_Li
ed80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
ed90: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
eda0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
edb0: 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e Obj(OBJ_nid2ln(n
edc0: 69 64 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d id), -1));. }
edd0: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 else {..Tcl_Lis
ede0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
edf0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
ee00: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
ee10: 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 20 20 20 bj("", -1));.
ee20: 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f }. Tcl_ListO
ee30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
ee40: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ee50: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
ee60: 28 22 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 ("signature_type
ee70: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 ", -1));. if
ee80: 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 53 53 4c (objc == 2 ? SSL
ee90: 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 _get_peer_signat
eea0: 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 ure_type_nid(sta
eeb0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
eec0: 29 20 3a 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e ) : SSL_get_sign
eed0: 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 ature_type_nid(s
eee0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e tatePtr->ssl, &n
eef0: 69 64 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 id)) {..Tcl_List
ef00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
ef10: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
ef20: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
ef30: 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 j(OBJ_nid2ln(nid
ef40: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 ), -1));. } e
ef50: 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f lse {..Tcl_ListO
ef60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
ef70: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ef80: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
ef90: 28 22 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d ("", -1));. }
efa0: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
efb0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
efc0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
efd0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
efe0: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
eff0: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
f000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f040: 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 -. *. * Connecti
f050: 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 onInfoObjCmd --
f060: 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f return connectio
f070: 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e n info from Open
f080: 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c SSL.. *. * Resul
f090: 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 ts:. *.A list of
f0a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f connection info
f0b0: 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *---------
f0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
f100: 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 static int Conne
f110: 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 ctionInfoObjCmd(
f120: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
f130: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
f140: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
f150: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
f160: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
f170: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
f180: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e an;../* The chan
f190: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
f1a0: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 e on. */. Sta
f1b0: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f te *statePtr;../
f1c0: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
f1d0: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
f1e0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
f1f0: 6a 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 jPtr;. const
f200: 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f SSL *ssl;. co
f210: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a nst SSL_CIPHER *
f220: 63 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 cipher;. cons
f230: 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 t SSL_SESSION *s
f240: 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 ession;. cons
f250: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
f260: 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 6c 6f 6e 67 *proto;. long
f270: 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 66 20 28 mode;.. if (
f280: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 objc != 2) {..Tc
f290: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
f2a0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
f2b0: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 "channel");..ret
f2c0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
f2d0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 }.. chan
f2e0: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
f2f0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 (interp, Tcl_Get
f300: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 StringFromObj(ob
f310: 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 jv[1], NULL), NU
f320: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
f330: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
f340: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
f350: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
f360: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b }.. /* Mak
f370: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
f380: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
f390: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
f3a0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
f3b0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
f3c0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
f3d0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
f3e0: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
f3f0: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
f400: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f410: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
f420: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
f430: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22 nelName(chan), "
f440: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
f450: 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 annel", NULL);..
f460: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
f470: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 );. }.. ob
f480: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
f490: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
f4a0: 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 . /* Connecti
f4b0: 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 on info */. s
f4c0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
f4d0: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
f4e0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
f4f0: 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 an);. ssl = s
f500: 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 tatePtr->ssl;.
f510: 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c if (ssl != NUL
f520: 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 L) {../* connect
f530: 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 54 63 ion state */..Tc
f540: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
f550: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
f560: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
f570: 72 69 6e 67 4f 62 6a 28 22 73 74 61 74 65 22 2c ringObj("state",
f580: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
f590: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f5a0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f5b0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
f5c0: 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 j(SSL_state_stri
f5d0: 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 ng_long(ssl), -1
f5e0: 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 ));.../* Get SNI
f5f0: 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65 requested serve
f600: 72 20 6e 61 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c r name */..Tcl_L
f610: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f620: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f630: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
f640: 67 4f 62 6a 28 22 73 65 72 76 65 72 6e 61 6d 65 gObj("servername
f650: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
f660: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f670: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f680: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
f690: 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 72 76 Obj(SSL_get_serv
f6a0: 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 ername(ssl, TLSE
f6b0: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 XT_NAMETYPE_host
f6c0: 5f 6e 61 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 _name), -1));...
f6d0: 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 /* Get protocol
f6e0: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
f6f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f700: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f710: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 _NewStringObj("p
f720: 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a rotocol", -1));.
f730: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
f740: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f750: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f760: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 wStringObj(SSL_g
f770: 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c et_version(ssl),
f780: 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 -1));.../* Rene
f790: 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 gotiation allowe
f7a0: 64 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 d */..Tcl_ListOb
f7b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
f7c0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
f7d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
f7e0: 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c "renegotiation",
f7f0: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
f800: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f810: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f820: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
f830: 6a 28 0a 09 20 20 20 20 53 53 4c 5f 67 65 74 5f j(.. SSL_get_
f840: 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 secure_renegotia
f850: 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c tion_support(ssl
f860: 29 20 3f 20 22 73 75 70 70 6f 72 74 65 64 22 20 ) ? "supported"
f870: 3a 20 22 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 : "not supported
f880: 22 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 ", -1));.../* Ge
f890: 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c t security level
f8a0: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
f8b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
f8c0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
f8d0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
f8e0: 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 securitylevel",
f8f0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
f900: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f910: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f920: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 Tcl_NewIntObj(SS
f930: 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c L_get_security_l
f940: 65 76 65 6c 28 73 73 6c 29 29 29 3b 0a 0a 09 2f evel(ssl)));.../
f950: 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a * Session info *
f960: 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
f970: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
f980: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
f990: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 NewStringObj("se
f9a0: 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d ssion_reused", -
f9b0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
f9c0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
f9d0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
f9e0: 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a cl_NewBooleanObj
f9f0: 28 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 (SSL_session_reu
fa00: 73 65 64 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a sed(ssl)));.../*
fa10: 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 Is server info
fa20: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
fa30: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
fa40: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
fa50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 _NewStringObj("i
fa60: 73 5f 73 65 72 76 65 72 22 2c 20 2d 31 29 29 3b s_server", -1));
fa70: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
fa80: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
fa90: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
faa0: 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c ewBooleanObj(SSL
fab0: 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 _is_server(ssl))
fac0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
fad0: 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a Cipher info */.
fae0: 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c cipher = SSL
faf0: 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 _get_current_cip
fb00: 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 her(ssl);. if
fb10: 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c (cipher != NULL
fb20: 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 ) {..char buf[BU
fb30: 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e FSIZ] = {0};..in
fb40: 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 t bits, alg_bits
fb50: 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
fb60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
fb70: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
fb80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 _NewStringObj("c
fb90: 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 ipher", -1));..T
fba0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
fbb0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
fbc0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
fbd0: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 tringObj(SSL_CIP
fbe0: 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 HER_get_name(cip
fbf0: 68 65 72 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c her), -1));..Tcl
fc00: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fc10: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fc20: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
fc30: 69 6e 67 4f 62 6a 28 22 73 74 61 6e 64 61 72 64 ingObj("standard
fc40: 5f 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 _name", -1));..T
fc50: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
fc60: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
fc70: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
fc80: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 tringObj(SSL_CIP
fc90: 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d HER_standard_nam
fca0: 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b e(cipher), -1));
fcb0: 0a 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 ...bits = SSL_CI
fcc0: 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 PHER_get_bits(ci
fcd0: 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 pher, &alg_bits)
fce0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
fcf0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
fd00: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
fd10: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 62 69 NewStringObj("bi
fd20: 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f ts", -1));..Tcl_
fd30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
fd40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
fd50: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
fd60: 62 6a 28 62 69 74 73 29 29 3b 0a 09 54 63 6c 5f bj(bits));..Tcl_
fd70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
fd80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
fd90: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
fda0: 6e 67 4f 62 6a 28 22 73 65 63 72 65 74 5f 62 69 ngObj("secret_bi
fdb0: 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f ts", -1));..Tcl_
fdc0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
fdd0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
fde0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
fdf0: 62 6a 28 61 6c 67 5f 62 69 74 73 29 29 3b 0a 09 bj(alg_bits));..
fe00: 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 /* alg_bits is a
fe10: 63 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 ctual key secret
fe20: 20 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 bits. If use bi
fe30: 74 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 ts and secret (a
fe40: 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 lgorithm) bits d
fe50: 69 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 iffer,.. the r
fe60: 65 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 est of the bits
fe70: 61 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 are fixed, i.e.
fe80: 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f for limited expo
fe90: 72 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73 rt ciphers (bits
fea0: 20 3c 20 35 36 29 20 2a 2f 0a 09 54 63 6c 5f 4c < 56) */..Tcl_L
feb0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
fec0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
fed0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
fee0: 67 4f 62 6a 28 22 6d 69 6e 5f 76 65 72 73 69 6f gObj("min_versio
fef0: 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c n", -1));..Tcl_L
ff00: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
ff10: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
ff20: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
ff30: 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f gObj(SSL_CIPHER_
ff40: 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 get_version(ciph
ff50: 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 er), -1));.../*
ff60: 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 Get OpenSSL-spec
ff70: 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e ific ID, not IAN
ff80: 41 20 49 44 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 A ID */..Tcl_Lis
ff90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
ffa0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
ffb0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
ffc0: 62 6a 28 22 69 64 22 2c 20 2d 31 29 29 3b 0a 09 bj("id", -1));..
ffd0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
ffe0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
fff0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
10000 49 6e 74 4f 62 6a 28 28 69 6e 74 29 20 53 53 4c IntObj((int) SSL
10010 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63 _CIPHER_get_id(c
10020 69 70 68 65 72 29 29 29 3b 0a 0a 09 69 66 20 28 ipher)));...if (
10030 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 SSL_CIPHER_descr
10040 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 iption(cipher, b
10050 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 uf, sizeof(buf))
10060 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
10070 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
10080 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10090 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
100a0 77 53 74 72 69 6e 67 4f 62 6a 28 22 64 65 73 63 wStringObj("desc
100b0 72 69 70 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a ription", -1));.
100c0 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
100d0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
100e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
100f0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 l_NewStringObj(b
10100 75 66 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 uf, -1));..}.
10110 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 }.. /* Sessi
10120 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 on info */. s
10130 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 ession = SSL_get
10140 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 _session(ssl);.
10150 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 if (session !
10160 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 = NULL) {..const
10170 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
10180 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 ticket;..size_t
10190 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 len2;..unsigned
101a0 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 int ulen;..const
101b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
101c0 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 09 63 68 61 session_id;..cha
101d0 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 r buffer[SSL_MAX
101e0 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 _MASTER_KEY_LENG
101f0 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 TH];.../* Report
10200 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 the selected pr
10210 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 otocol as a resu
10220 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e lt of the ALPN n
10230 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 egotiation */..S
10240 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
10250 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 alpn_selected(se
10260 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 ssion, &proto, &
10270 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 len2);..Tcl_List
10280 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
10290 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
102a0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
102b0 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a j("alpn", -1));.
102c0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
102d0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
102e0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
102f0 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 wStringObj((char
10300 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 *)proto, (int)
10310 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 52 65 70 len2));.../* Rep
10320 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 ort the selected
10330 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 protocol as a r
10340 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e esult of the NPN
10350 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a negotiation */.
10360 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 #ifdef USE_NPN..
10370 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 SSL_get0_next_pr
10380 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 oto_negotiated(s
10390 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 sl, &proto, &ule
103a0 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a n);..Tcl_ListObj
103b0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
103c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
103d0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
103e0 6e 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c npn", -1));..Tcl
103f0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
10400 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
10410 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
10420 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 ingObj((char *)p
10430 72 6f 74 6f 2c 20 28 69 6e 74 29 20 75 6c 65 6e roto, (int) ulen
10440 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 ));.#endif.../*
10450 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f Resumable sessio
10460 6e 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 n */..Tcl_ListOb
10470 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10480 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
10490 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
104a0 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 2d 31 29 "resumable", -1)
104b0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
104c0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
104d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
104e0 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 53 _NewIntObj(SSL_S
104f0 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 ESSION_is_resuma
10500 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a ble(session)));.
10510 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 ../* Session sta
10520 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 rt time (seconds
10530 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f since epoch) */
10540 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
10550 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10560 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
10570 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 ewStringObj("sta
10580 72 74 5f 74 69 6d 65 22 2c 20 2d 31 29 29 3b 0a rt_time", -1));.
10590 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
105a0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
105b0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
105c0 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 wLongObj(SSL_SES
105d0 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 SION_get_time(se
105e0 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 54 ssion)));.../* T
105f0 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 imeout value - S
10600 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f SL_CTX_get_timeo
10610 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 ut (in seconds)
10620 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
10630 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
10640 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
10650 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 _NewStringObj("t
10660 69 6d 65 6f 75 74 22 2c 20 2d 31 29 29 3b 0a 09 imeout", -1));..
10670 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
10680 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
10690 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
106a0 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 LongObj(SSL_SESS
106b0 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 ION_get_timeout(
106c0 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a session)));.../*
106d0 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 Session ticket
106e0 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69 lifetime hint (i
106f0 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 n seconds) */..T
10700 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10710 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10720 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
10730 74 72 69 6e 67 4f 62 6a 28 22 6c 69 66 65 74 69 tringObj("lifeti
10740 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f me", -1));..Tcl_
10750 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10760 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
10770 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 Ptr, Tcl_NewLong
10780 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f Obj(SSL_SESSION_
10790 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 get_ticket_lifet
107a0 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e ime_hint(session
107b0 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f )));.../* Sessio
107c0 6e 20 69 64 20 2a 2f 0a 09 73 65 73 73 69 6f 6e n id */..session
107d0 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f _id = SSL_SESSIO
107e0 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e N_get_id(session
107f0 2c 20 26 75 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c , &ulen);..Tcl_L
10800 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10810 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
10820 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
10830 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 69 64 gObj("session_id
10840 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
10850 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
10860 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
10870 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 r, Tcl_NewByteAr
10880 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 rayObj(session_i
10890 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b d, (int) ulen));
108a0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 .../* Session ti
108b0 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e cket - client on
108c0 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 ly */..SSL_SESSI
108d0 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 ON_get0_ticket(s
108e0 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c ession, &ticket,
108f0 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 &len2);..Tcl_Li
10900 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
10910 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
10920 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
10930 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 74 69 63 Obj("session_tic
10940 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ket", -1));..Tcl
10950 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
10960 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
10970 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 jPtr, Tcl_NewByt
10980 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 eArrayObj(ticket
10990 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a , (int) len2));.
109a0 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 ../* Ticket app
109b0 64 61 74 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 data */..SSL_SES
109c0 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
109d0 5f 61 70 70 64 61 74 61 28 73 65 73 73 69 6f 6e _appdata(session
109e0 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 , &ticket, &len2
109f0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
10a00 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
10a10 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
10a20 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 _NewStringObj("t
10a30 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c icket_app_data",
10a40 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
10a50 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
10a60 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10a70 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 Tcl_NewByteArra
10a80 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e yObj(ticket, (in
10a90 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 t) len2));.../*
10aa0 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a Get master key *
10ab0 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 /..len2 = SSL_SE
10ac0 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 SSION_get_master
10ad0 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 _key(session, bu
10ae0 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 ffer, SSL_MAX_MA
10af0 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 STER_KEY_LENGTH)
10b00 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
10b10 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10b20 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
10b30 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61 NewStringObj("ma
10b40 73 74 65 72 5f 6b 65 79 22 2c 20 2d 31 29 29 3b ster_key", -1));
10b50 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
10b60 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10b70 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
10b80 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 62 ewByteArrayObj(b
10b90 75 66 66 65 72 2c 20 28 69 6e 74 29 20 6c 65 6e uffer, (int) len
10ba0 32 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2));. }..
10bb0 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 /* Compression i
10bc0 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 nfo */. if (s
10bd0 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 sl != NULL) {.#i
10be0 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f fdef HAVE_SSL_CO
10bf0 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 MPRESSION..const
10c00 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f COMP_METHOD *co
10c10 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 mp, *expn;..comp
10c20 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 = SSL_get_curre
10c30 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 nt_compression(s
10c40 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c sl);..expn = SSL
10c50 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 _get_current_exp
10c60 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 54 ansion(ssl);...T
10c70 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10c80 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10c90 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
10ca0 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 tringObj("compre
10cb0 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 ssion", -1));..T
10cc0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10cd0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10ce0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
10cf0 74 72 69 6e 67 4f 62 6a 28 63 6f 6d 70 20 3f 20 tringObj(comp ?
10d00 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d SSL_COMP_get_nam
10d10 65 28 63 6f 6d 70 29 20 3a 20 22 4e 4f 4e 45 22 e(comp) : "NONE"
10d20 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
10d30 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10d40 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10d50 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10d60 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 bj("expansion",
10d70 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
10d80 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10d90 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10da0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10db0 28 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 (expn ? SSL_COMP
10dc0 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 _get_name(expn)
10dd0 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a : "NONE", -1));.
10de0 23 65 6c 73 65 0a 09 54 63 6c 5f 4c 69 73 74 4f #else..Tcl_ListO
10df0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10e00 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10e10 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10e20 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 ("compression",
10e30 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
10e40 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10e50 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10e60 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10e70 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 ("NONE", -1));..
10e80 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
10e90 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
10ea0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
10eb0 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e StringObj("expan
10ec0 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 sion", -1));..Tc
10ed0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10ee0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
10ef0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
10f00 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 ringObj("NONE",
10f10 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 -1));.#endif.
10f20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 }.. /* Serve
10f30 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 6d 6f r info */. mo
10f40 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 de = SSL_CTX_get
10f50 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d _session_cache_m
10f60 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ode(statePtr->ct
10f70 78 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 x);. if (mode
10f80 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
10f90 45 5f 4f 46 46 29 20 7b 0a 09 70 72 6f 74 6f 20 E_OFF) {..proto
10fa0 3d 20 22 6f 66 66 22 3b 0a 20 20 20 20 7d 20 65 = "off";. } e
10fb0 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 lse if (mode & S
10fc0 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c SL_SESS_CACHE_CL
10fd0 49 45 4e 54 29 20 7b 0a 09 70 72 6f 74 6f 20 3d IENT) {..proto =
10fe0 20 22 63 6c 69 65 6e 74 22 3b 0a 20 20 20 20 7d "client";. }
10ff0 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 else if (mode &
11000 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
11010 53 45 52 56 45 52 29 20 7b 0a 09 70 72 6f 74 6f SERVER) {..proto
11020 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 20 20 20 = "server";.
11030 20 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 } else if (mode
11040 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
11050 45 5f 42 4f 54 48 29 20 7b 0a 09 70 72 6f 74 6f E_BOTH) {..proto
11060 20 3d 20 22 62 6f 74 68 22 3b 0a 20 20 20 20 7d = "both";. }
11070 20 65 6c 73 65 20 7b 0a 09 70 72 6f 74 6f 20 3d else {..proto =
11080 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 "unknown";.
11090 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 }. Tcl_ListOb
110a0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
110b0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
110c0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
110d0 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d "session_cache_m
110e0 6f 64 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ode", -1));.
110f0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
11100 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
11110 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
11120 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 2c StringObj(proto,
11130 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f -1));.. Tcl_
11140 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
11150 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
11160 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
11170 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
11180 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
11190 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
111a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
111b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
111c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
111d0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 -------. *. * Ve
111e0 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 rsionObjCmd -- r
111f0 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 eturn version st
11200 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 ring from OpenSS
11210 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 L.. *. * Results
11220 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
11230 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
11240 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
11250 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
11260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
112a0 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
112b0 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 .VersionObjCmd(C
112c0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
112d0 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
112e0 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
112f0 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
11300 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
11310 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
11320 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
11330 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f Called");.. o
11340 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 bjPtr = Tcl_NewS
11350 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c tringObj(OPENSSL
11360 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d _VERSION_TEXT, -
11370 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 1);. Tcl_SetO
11380 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
11390 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 objPtr);.. r
113a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
113b0 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
113c0 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 ntData;..objc =
113d0 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 objc;..objv = ob
113e0 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d jv;.}.../*. *---
113f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11430 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d . *. * MiscObjCm
11440 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e d -- misc comman
11450 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 ds. *. * Results
11460 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
11470 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
11480 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
11490 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
114a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114e0 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
114f0 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 .MiscObjCmd(Clie
11500 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
11510 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
11520 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
11530 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
11540 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 objv[]) {. st
11550 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
11560 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b *commands [] = {
11570 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 "req", "strreq"
11580 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e , NULL };. en
11590 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 um command { C_R
115a0 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f EQ, C_STRREQ, C_
115b0 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 DUMMY };. int
115c0 20 63 6d 64 2c 20 69 73 53 74 72 3b 0a 20 20 20 cmd, isStr;.
115d0 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 char buffer[163
115e0 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 84];.. dprint
115f0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
11600 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 if (objc < 2)
11610 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
11620 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
11630 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 bjv, "subcommand
11640 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 ?args?");..retu
11650 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
11660 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f }. if (Tcl_
11670 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 GetIndexFromObj(
11680 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c interp, objv[1],
11690 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d commands, "comm
116a0 61 6e 64 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d and", 0,&cmd) !=
116b0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
116c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
116d0 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
116e0 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
116f0 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d isStr = (cmd ==
11700 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 C_STRREQ);.
11710 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f switch ((enum co
11720 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 mmand) cmd) {..c
11730 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 ase C_REQ:..case
11740 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 C_STRREQ: {..
11750 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 EVP_PKEY *pkey
11760 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 =NULL;.. X509
11770 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 *cert=NULL;..
11780 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d X509_NAME *nam
11790 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c e=NULL;.. Tcl
117a0 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 _Obj **listv;..
117b0 20 20 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a int listc,i;.
117c0 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e .. BIO *out=N
117d0 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 ULL;... char
117e0 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 *k_C="",*k_ST=""
117f0 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 ,*k_L="",*k_O=""
11800 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d ,*k_OU="",*k_CN=
11810 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a "",*k_Email="";.
11820 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 . char *keyou
11830 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a t,*pemout,*str;.
11840 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 . int keysize
11850 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 ,serial=0,days=3
11860 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 65;..#if OPENSSL
11870 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
11880 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 < 0x30000000L..
11890 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d BIGNUM *bne =
118a0 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 NULL;.. RSA
118b0 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c *rsa = NULL;.#el
118c0 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 se.. EVP_PKEY
118d0 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
118e0 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 ;.#endif... i
118f0 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 f ((objc<5) || (
11900 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c objc>6)) {...Tcl
11910 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
11920 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 terp, 2, objv, "
11930 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 keysize keyfile
11940 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 certfile ?info?"
11950 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
11960 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 ERROR;.. }...
11970 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 if (Tcl_GetI
11980 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
11990 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 , objv[2], &keys
119a0 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ize) != TCL_OK)
119b0 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {...return TCL_E
119c0 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 RROR;.. }..
119d0 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 keyout=Tcl_Get
119e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b String(objv[3]);
119f0 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c .. pemout=Tcl
11a00 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
11a10 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 4]);.. if (is
11a20 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 Str) {...Tcl_Set
11a30 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
11a40 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 t,"",0);...Tcl_S
11a50 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d etVar(interp,pem
11a60 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 out,"",0);..
11a70 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 }... if (objc
11a80 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c >=6) {...if (Tcl
11a90 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 _ListObjGetEleme
11aa0 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 nts(interp, objv
11ab0 5b 35 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 [5],....&listc,
11ac0 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f &listv) != TCL_O
11ad0 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 K) {... retur
11ae0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
11af0 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 ....if ((listc%2
11b00 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 ) != 0) {...
11b10 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
11b20 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f terp,"Informatio
11b30 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 n list must have
11b40 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 even number of
11b50 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 arguments",NULL)
11b60 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
11b70 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 CL_ERROR;...}...
11b80 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 for (i=0; i<list
11b90 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 c; i+=2) {...
11ba0 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 str=Tcl_GetStri
11bb0 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 ng(listv[i]);...
11bc0 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 if (strcmp(s
11bd0 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b tr,"days")==0) {
11be0 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
11bf0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
11c00 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 ,listv[i+1],&day
11c10 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 s)!=TCL_OK)....
11c20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
11c30 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 ROR;... } els
11c40 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
11c50 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b ,"serial")==0) {
11c60 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
11c70 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
11c80 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 ,listv[i+1],&ser
11c90 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 ial)!=TCL_OK)...
11ca0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
11cb0 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 ERROR;... } e
11cc0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
11cd0 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 tr,"C")==0) {...
11ce0 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 .k_C=Tcl_GetStri
11cf0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
11d00 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
11d10 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 (strcmp(str,"ST"
11d20 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d )==0) {....k_ST=
11d30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
11d40 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
11d50 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
11d60 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 mp(str,"L")==0)
11d70 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 {....k_L=Tcl_Get
11d80 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
11d90 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
11da0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
11db0 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "O")==0) {....k_
11dc0 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 O=Tcl_GetString(
11dd0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
11de0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
11df0 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d rcmp(str,"OU")==
11e00 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 0) {....k_OU=Tcl
11e10 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
11e20 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
11e30 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
11e40 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a str,"CN")==0) {.
11e50 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 ...k_CN=Tcl_GetS
11e60 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
11e70 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
11e80 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
11e90 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 Email")==0) {...
11ea0 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 .k_Email=Tcl_Get
11eb0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
11ec0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
11ed0 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 {....Tcl_SetRes
11ee0 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e ult(interp,"Unkn
11ef0 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e own parameter",N
11f00 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 ULL);....return
11f10 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
11f20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 }...}.. }..#
11f30 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
11f40 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
11f50 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 000000L.. bne
11f60 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 = BN_new();..
11f70 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 rsa = RSA_new(
11f80 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 );.. pkey = E
11f90 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 VP_PKEY_new();..
11fa0 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e if (bne == N
11fb0 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 ULL || rsa == NU
11fc0 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 LL || pkey == NU
11fd0 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f LL || !BN_set_wo
11fe0 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c rd(bne,RSA_F4) |
11ff0 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 |...!RSA_generat
12000 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 e_key_ex(rsa, ke
12010 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c ysize, bne, NULL
12020 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 ) || !EVP_PKEY_a
12030 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 ssign_RSA(pkey,
12040 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b rsa)) {...EVP_PK
12050 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 EY_free(pkey);..
12060 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 ./* RSA_free(rsa
12070 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f ); freed by EVP_
12080 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 PKEY_free */...B
12090 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c N_free(bne);.#el
120a0 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 se.. pkey = E
120b0 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 VP_RSA_gen((unsi
120c0 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a gned int) keysiz
120d0 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 e);.. ctx = E
120e0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 VP_PKEY_CTX_new(
120f0 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 pkey,NULL);..
12100 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c if (pkey == NUL
12110 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c L || ctx == NULL
12120 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 || !EVP_PKEY_ke
12130 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c ygen_init(ctx) |
12140 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 |...!EVP_PKEY_CT
12150 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e X_set_rsa_keygen
12160 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 _bits(ctx, keysi
12170 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 ze) || !EVP_PKEY
12180 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b _keygen(ctx, &pk
12190 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 ey)) {...EVP_PKE
121a0 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 Y_free(pkey);...
121b0 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 EVP_PKEY_CTX_fre
121c0 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 e(ctx);.#endif..
121d0 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
121e0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e nterp,"Error gen
121f0 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 erating private
12200 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 key",NULL);...re
12210 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
12220 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
12230 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
12240 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
12250 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
12260 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
12270 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c _PrivateKey(out,
12280 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 pkey,NULL,NULL,0
12290 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ,NULL,NULL);...
122a0 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 i=BIO_read(ou
122b0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 t,buffer,sizeof(
122c0 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 buffer)-1);...
122d0 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 i=(i<0) ? 0 :
122e0 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b i;... buffer[
122f0 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 i]='\0';... T
12300 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
12310 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 ,keyout,buffer,0
12320 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 );... BIO_flu
12330 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 sh(out);... B
12340 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 IO_free(out);...
12350 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f } else {... o
12360 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
12370 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 _file());...
12380 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
12390 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a me(out,keyout);.
123a0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
123b0 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f bio_PrivateKey(o
123c0 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c ut,pkey,NULL,NUL
123d0 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a L,0,NULL,NULL);.
123e0 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 .. /* PEM_wri
123f0 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 te_bio_RSAPrivat
12400 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e eKey(out, rsa, N
12410 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 ULL, NULL, 0, NU
12420 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 LL, NULL); */...
12430 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c BIO_free_all
12440 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 (out);.. .}....i
12450 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 f ((cert=X509_ne
12460 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 w())==NULL) {...
12470 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
12480 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
12490 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 generating certi
124a0 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c ficate request",
124b0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 NULL);... EVP
124c0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
124d0 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
124e0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
124f0 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 x30000000L...
12500 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 BN_free(bne);.#
12510 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 endif... retu
12520 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 rn(TCL_ERROR);..
12530 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 .}....X509_set_v
12540 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a ersion(cert,2);.
12550 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 ..ASN1_INTEGER_s
12560 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 et(X509_get_seri
12570 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 alNumber(cert),s
12580 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 erial);...X509_g
12590 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
125a0 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 etm_notBefore(ce
125b0 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 rt),0);...X509_g
125c0 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
125d0 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 etm_notAfter(cer
125e0 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 t),(long)60*60*2
125f0 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 4*days);...X509_
12600 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c set_pubkey(cert,
12610 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 pkey);....name=X
12620 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 509_get_subject_
12630 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 name(cert);....X
12640 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
12650 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
12660 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 C", MBSTRING_ASC
12670 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
12680 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d d char *) k_C, -
12690 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
126a0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
126b0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 _by_txt(name,"ST
126c0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
126d0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
126e0 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d char *) k_ST, -
126f0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
12700 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
12710 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 _by_txt(name,"L"
12720 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
12730 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
12740 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c char *) k_L, -1,
12750 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
12760 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
12770 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 y_txt(name,"O",
12780 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
12790 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
127a0 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d ar *) k_O, -1, -
127b0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
127c0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
127d0 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d txt(name,"OU", M
127e0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
127f0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
12800 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d r *) k_OU, -1, -
12810 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
12820 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
12830 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d txt(name,"CN", M
12840 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
12850 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
12860 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d r *) k_CN, -1, -
12870 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
12880 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
12890 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 txt(name,"Email"
128a0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
128b0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
128c0 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c char *) k_Email,
128d0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 -1, -1, 0);....
128e0 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 X509_set_subject
128f0 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 _name(cert,name)
12900 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 ;....if (!X509_s
12910 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 ign(cert,pkey,EV
12920 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 P_sha256())) {..
12930 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 . X509_free(c
12940 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f ert);... EVP_
12950 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
12960 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
12970 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
12980 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 30000000L...
12990 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
129a0 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 ndif... Tcl_S
129b0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
129c0 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 "Error signing c
129d0 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c ertificate",NULL
129e0 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 );... return
129f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a TCL_ERROR;...}..
12a00 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 ..if (isStr) {..
12a10 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
12a20 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 (BIO_s_mem());..
12a30 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
12a40 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
12a50 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 );... i=BIO_r
12a60 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 ead(out,buffer,s
12a70 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 izeof(buffer)-1)
12a80 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 ;... i=(i<0)
12a90 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 ? 0 : i;... b
12aa0 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 uffer[i]='\0';..
12ab0 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 . Tcl_SetVar(
12ac0 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 interp,pemout,bu
12ad0 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 ffer,0);... B
12ae0 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 IO_flush(out);..
12af0 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 . BIO_free(ou
12b00 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 t);...} else {..
12b10 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
12b20 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a (BIO_s_file());.
12b30 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f .. BIO_write_
12b40 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d filename(out,pem
12b50 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f out);... PEM_
12b60 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f write_bio_X509(o
12b70 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ut,cert);...
12b80 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 BIO_free_all(out
12b90 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 );...}....X509_f
12ba0 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 ree(cert);...EVP
12bb0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
12bc0 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
12bd0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
12be0 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f x30000000L...BN_
12bf0 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 free(bne);.#endi
12c00 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 f.. }..}..bre
12c10 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a ak;. default:
12c20 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 ..break;. }.
12c30 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
12c40 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
12c50 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
12c60 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
12c70 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 *****/./* Init
12c80 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a */./*
12c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12ca0 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ***/../*. *-----
12cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
12cf0 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d *. * Tls_Free --
12d00 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
12d10 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 edure cleans up
12d20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
12d30 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
12d40 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 *.is closed and
12d50 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 its reference c
12d60 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 ount falls below
12d70 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 1. *. * Results
12d80 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.none. *. *
12d90 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
12da0 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 .Frees all the s
12db0 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d tate. *. *------
12dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
12e00 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 /.void.Tls_Free(
12e10 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 char *blockPtr)
12e20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
12e30 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
12e40 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 )blockPtr;..
12e50 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
12e60 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 );.. Tls_Clea
12e70 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 n(statePtr);.
12e80 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 ckfree(blockPtr
12e90 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
12ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
12ee0 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 *. * Tls_Clean
12ef0 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
12f00 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 ocedure cleans u
12f10 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 p when a SSL soc
12f20 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
12f30 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 l. *.is closed a
12f40 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 nd its reference
12f50 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c count falls bel
12f60 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 ow 1. This shou
12f70 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 ld. *.be called
12f80 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 synchronously by
12f90 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 the CloseProc,
12fa0 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 not in the. *.Ev
12fb0 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c entuallyFree cal
12fc0 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
12fd0 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ults:. *.none. *
12fe0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
12ff0 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 :. *.Frees all t
13000 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d he state. *. *--
13010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13050 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 -. */.void Tls_C
13060 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 lean(State *stat
13070 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 ePtr) {. dpri
13080 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
13090 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 /*. * we
130a0 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 're assuming her
130b0 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e e that we're sin
130c0 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 gle-threaded.
130d0 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 */. if (sta
130e0 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 tePtr->timer !=
130f0 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
13100 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 NULL) {..Tcl_De
13110 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 leteTimerHandler
13120 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
13130 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 );..statePtr->ti
13140 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 mer = NULL;.
13150 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
13160 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 Ptr->protos) {..
13170 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d ckfree(statePtr-
13180 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 >protos);..state
13190 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 Ptr->protos = NU
131a0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
131b0 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 (statePtr->bio)
131c0 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c {../* This will
131d0 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f call SSL_shutdo
131e0 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 wn. Bug 1414045
131f0 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f */..dprintf("BIO
13200 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 _free_all(%p)",
13210 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a statePtr->bio);.
13220 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 .BIO_free_all(st
13230 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 atePtr->bio);..s
13240 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e tatePtr->bio = N
13250 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
13260 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c f (statePtr->ssl
13270 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 ) {..dprintf("SS
13280 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 L_free(%p)", sta
13290 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 tePtr->ssl);..SS
132a0 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d L_free(statePtr-
132b0 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 >ssl);..statePtr
132c0 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->ssl = NULL;.
132d0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
132e0 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 ePtr->ctx) {..SS
132f0 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 L_CTX_free(state
13300 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 Ptr->ctx);..stat
13310 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c ePtr->ctx = NULL
13320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
13330 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
13340 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 ck) {..Tcl_DecrR
13350 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
13360 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 ->callback);..st
13370 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
13380 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
13390 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
133a0 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 >password) {..Tc
133b0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
133c0 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
133d0 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 d);..statePtr->p
133e0 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a assword = NULL;.
133f0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
13400 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a atePtr->vcmd) {.
13410 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
13420 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 t(statePtr->vcmd
13430 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63 );..statePtr->vc
13440 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d md = NULL;. }
13450 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
13460 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a eturning");.}...
13470 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
13480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
134a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
134b0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
134c0 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a ls_Init --. *. *
134d0 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 .This is a packa
134e0 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f ge initializatio
134f0 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 n procedure, whi
13500 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 ch is called. *.
13510 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 by Tcl when this
13520 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 package is to b
13530 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e e added to an in
13540 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a terpreter.. *. *
13550 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 Results: Ssl c
13560 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f onfigured and lo
13570 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 aded. *. * Side
13580 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 effects:. *. cre
13590 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d ate the ssl comm
135a0 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 and, initialize
135b0 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 ssl context. *.
135c0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
135d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
135e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
135f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13600 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f ----. */.DLLEXPO
13610 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 RT int Tls_Init(
13620 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
13630 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 rp) {. const
13640 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 char tlsTclInitS
13650 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 cript[] = {.#inc
13660 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 lude "tls.tcl.h"
13670 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 ..0x00. };..
13680 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
13690 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ed");.. /*.
136a0 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 * We only sup
136b0 70 6f 72 74 20 54 63 6c 20 38 2e 34 20 6f 72 20 port Tcl 8.4 or
136c0 6e 65 77 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20 newer. */.
136d0 20 20 69 66 20 28 0a 23 69 66 64 65 66 20 55 53 if (.#ifdef US
136e0 45 5f 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c E_TCL_STUBS..Tcl
136f0 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 _InitStubs(inter
13700 70 2c 20 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c p, "8.4", 0).#el
13710 73 65 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 se..Tcl_PkgRequi
13720 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 re(interp, "Tcl"
13730 2c 20 22 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e , "8.4-", 0).#en
13740 64 69 66 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b dif.. == NULL) {
13750 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
13760 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
13770 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 f (TlsLibInit(0)
13780 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 != TCL_OK) {..T
13790 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
137a0 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e interp, "could n
137b0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 ot initialize SS
137c0 4c 20 6c 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c L library", NULL
137d0 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
137e0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
137f0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
13800 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
13810 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 ls::ciphers", Ci
13820 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c phersObjCmd, (Cl
13830 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
13840 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
13850 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
13860 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
13870 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
13880 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f :connection", Co
13890 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 nnectionInfoObjC
138a0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
138b0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
138c0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
138d0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
138e0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
138f0 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b , "tls::handshak
13900 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a e", HandshakeObj
13910 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
13920 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
13930 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
13940 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
13950 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
13960 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 p, "tls::import"
13970 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 , ImportObjCmd,
13980 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
13990 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
139a0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
139b0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
139c0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
139d0 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 ls::unimport", U
139e0 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 nimportObjCmd, (
139f0 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
13a00 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
13a10 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
13a20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
13a30 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
13a40 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 s::status", Stat
13a50 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e usObjCmd, (Clien
13a60 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
13a70 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
13a80 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
13a90 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
13aa0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 interp, "tls::ve
13ab0 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f rsion", VersionO
13ac0 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
13ad0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
13ae0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
13af0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
13b00 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
13b10 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 erp, "tls::misc"
13b20 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 , MiscObjCmd, (C
13b30 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
13b40 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
13b50 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
13b60 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
13b70 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
13b80 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 ::protocols", Pr
13b90 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 otocolsObjCmd, (
13ba0 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
13bb0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
13bc0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 c *) NULL);..
13bd0 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 if (interp) {..
13be0 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c Tcl_Eval(interp,
13bf0 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 tlsTclInitScrip
13c00 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 t);. }.. r
13c10 65 74 75 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f eturn(Tcl_PkgPro
13c20 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 74 6c vide(interp, "tl
13c30 73 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 s", PACKAGE_VERS
13c40 49 4f 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d ION));.}../*. *-
13c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c80 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 -----*. *. *.Tls
13c90 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a _SafeInit --. *.
13ca0 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.-------------
13cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13cd0 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 ---*. *.Standard
13ce0 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 procedure requi
13cf0 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 red by 'load'..
13d00 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 *.Initializes th
13d10 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 is extension for
13d20 20 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 a safe interpre
13d30 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d ter.. *.--------
13d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d60 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
13d70 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
13d80 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 ..As of 'Tls_Ini
13d90 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a t'. *. *.Result:
13da0 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 . *..A standard
13db0 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a Tcl error code..
13dc0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
13dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f -----------*. */
13e00 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 .DLLEXPORT int T
13e10 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f ls_SafeInit(Tcl_
13e20 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 Interp *interp)
13e30 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 {. dprintf("C
13e40 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 alled");. ret
13e50 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 urn(Tls_Init(int
13e60 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d erp));.}../*. *-
13e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ea0 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 -----*. *. *.Tls
13eb0 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a LibInit --. *. *
13ec0 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
13ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ef0 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 -*. *.Initialize
13f00 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e s SSL library on
13f10 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 ce per applicati
13f20 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d on. *.----------
13f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f50 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 ------*. *. *.Si
13f60 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 de effects:. *..
13f70 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 initializes SSL
13f80 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 library. *. *.Re
13f90 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 sult:. *..none.
13fa0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
13fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a ----------*. */.
13fe0 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 static int TlsLi
13ff0 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 bInit(int uninit
14000 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 ialize) {. st
14010 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c atic int initial
14020 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e ized = 0;. in
14030 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f t status = TCL_O
14040 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f K;.#if defined(O
14050 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
14060 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
14070 48 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 HREADS). size
14080 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 _t num_locks;.#e
14090 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e ndif.. if (un
140a0 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 initialize) {..i
140b0 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 f (!initialized)
140c0 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
140d0 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 "Asked to uninit
140e0 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 ialize, but we a
140f0 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a re not initializ
14100 65 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 ed");... retu
14110 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a rn(TCL_OK);..}..
14120 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 .dprintf("Asked
14130 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 to uninitialize"
14140 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 );..#if defined(
14150 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
14160 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
14170 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 THREADS)..Tcl_Mu
14180 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 texLock(&init_mx
14190 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 );...if (locks)
141a0 7b 0a 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b {.. free(lock
141b0 73 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d s);.. locks =
141c0 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b NULL;.. lock
141d0 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 sCount = 0;..}.#
141e0 65 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a endif..initializ
141f0 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 ed = 0;..#if def
14200 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
14210 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
14220 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 (TCL_THREADS)..T
14230 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 cl_MutexUnlock(&
14240 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 init_mx);.#endif
14250 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b ...return(TCL_OK
14260 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
14270 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b (initialized) {
14280 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 ..dprintf("Calle
14290 64 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 d, but using cac
142a0 68 65 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 hed value");..re
142b0 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 turn(status);.
142c0 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
142d0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 ("Called");..#if
142e0 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
142f0 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
14300 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
14310 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c ). Tcl_MutexL
14320 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 ock(&init_mx);.#
14330 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 endif. initia
14340 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 lized = 1;..#if
14350 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
14360 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
14370 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
14380 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d . num_locks =
14390 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 1;. locksCou
143a0 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c nt = (int) num_l
143b0 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 ocks;. locks
143c0 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 = malloc(sizeof(
143d0 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f *locks) * num_lo
143e0 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 cks);. memset
143f0 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f (locks, 0, sizeo
14400 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f f(*locks) * num_
14410 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a locks);.#endif..
14420 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a /* Initializ
14430 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f e BOTH libcrypto
14440 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a and libssl. */.
14450 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 OPENSSL_init
14460 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 _ssl(OPENSSL_INI
14470 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e T_LOAD_SSL_STRIN
14480 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 GS | OPENSSL_INI
14490 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 T_LOAD_CRYPTO_ST
144a0 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c RINGS..| OPENSSL
144b0 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 _INIT_ADD_ALL_CI
144c0 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f PHERS | OPENSSL_
144d0 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 INIT_ADD_ALL_DIG
144e0 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 ESTS, NULL);..
144f0 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 BIO_new_tcl(NU
14500 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 LL, 0);..#if 0.
14510 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 /*. * XXX
14520 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 :TODO: Remove th
14530 69 73 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c is code and repl
14540 61 63 65 20 69 74 20 77 69 74 68 20 61 20 63 68 ace it with a ch
14550 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 eck. * for e
14560 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e nough entropy an
14570 64 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 d do not try to
14580 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 create our own.
14590 20 20 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 * terrible e
145a0 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 ntropy. */.
145b0 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 /*. * See
145c0 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d d the random num
145d0 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e ber generator in
145e0 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 the SSL library
145f0 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 ,. * using t
14600 68 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 he do/while cons
14610 74 72 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 truct because of
14620 20 74 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e the bug note in
14630 20 74 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e the. * Open
14640 53 53 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a SSL FAQ at http:
14650 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 //www.openssl.or
14660 67 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 g/support/faq.ht
14670 6d 6c 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a ml#USER1. *.
14680 20 20 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 * The crux
14690 6f 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 of the problem i
146a0 73 20 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 s that Solaris 7
146b0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 does not have a
146c0 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e . * /dev/ran
146d0 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e dom or /dev/uran
146e0 64 6f 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 dom device so it
146f0 20 63 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 cannot gather e
14700 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 nough. * ent
14710 72 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 ropy from the RA
14720 4e 44 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 ND_seed() when T
14730 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 LS initializes a
14740 6e 64 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 nd refuses.
14750 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e * to go further.
14760 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e Earlier version
14770 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 s of OpenSSL car
14780 72 69 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 ried on regardle
14790 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 ss.. */.
147a0 73 72 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 srand((unsigned
147b0 69 6e 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f int) time((time_
147c0 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 t *) NULL));.
147d0 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 do {..for (i =
147e0 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 0; i < 16; i++)
147f0 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b {.. rnd_seed[
14800 69 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 i] = 1 + (char)
14810 28 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f (255.0 * rand()/
14820 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b (RAND_MAX+1.0));
14830 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 ..}..RAND_seed(r
14840 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 nd_seed, sizeof(
14850 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 rnd_seed));.
14860 7d 20 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 } while (RAND_st
14870 61 74 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 atus() != 1);.#e
14880 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 ndif..#if define
14890 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
148a0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
148b0 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f L_THREADS)..Tcl_
148c0 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 MutexUnlock(&ini
148d0 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 t_mx);.#endif...
148e0 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a return(status);.
148f0 7d 0a }.