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: 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f 20 77 /* Prevent I/O w
2160: 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 hile callback is
2170: 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f 0a in progress */.
2180: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d /* statePtr-
2190: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 >flags |= TLS_TC
21a0: 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f 0a 0a L_CALLBACK; */..
21b0: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
21c0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
21d0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
21e0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
21f0: 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c 6c 62 ok = EvalCallb
2200: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
2210: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 ePtr, cmdPtr);.
2220: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
2230: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 unt(cmdPtr);..
2240: 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 /* statePtr->f
2250: 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 lags &= ~(TLS_TC
2260: 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a L_CALLBACK); */.
2270: 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 3b 09 return(ok);.
2280: 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 6c /* By default, l
2290: 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69 6f eave verificatio
22a0: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a n unchanged. */.
22b0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
2300: 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a * Tls_Error --.
2310: 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c *. *.Calls call
2320: 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74 20 6f back with list o
2330: 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 f errors.. *. *
2340: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
2350: 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f .The err field o
2360: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 f the currently
2370: 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20 operative State
2380: 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 is set. *. to a
2390: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 string describi
23a0: 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 ng the SSL negot
23b0: 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 iation failure r
23c0: 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d eason. *. *-----
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2410: 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f */.void.Tls_Erro
2420: 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 r(State *statePt
2430: 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a r, char *msg) {.
2440: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
2450: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
2460: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
2470: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 cl_Obj *cmdPtr,
2480: 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 75 6e *listPtr;. un
2490: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b signed long err;
24a0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 . statePtr->e
24b0: 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 rr = msg;.. d
24c0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
24d0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
24e0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d Ptr->callback ==
24f0: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 (Tcl_Obj*)NULL)
2500: 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f ..return;.. /
2510: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 * Create command
2520: 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 to eval */.
2530: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
2540: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
2550: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 tr->callback);.
2560: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2570: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2580: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
2590: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 NewStringObj("er
25a0: 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ror", -1));.
25b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
25c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
25d0: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
25e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 l_NewStringObj(T
25f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
2600: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
2610: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 ), -1));. if
2620: 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (msg != NULL) {.
2630: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
2640: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2650: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
2660: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 wStringObj(msg,
2670: 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 -1));.. } els
2680: 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54 63 6c e if ((msg = Tcl
2690: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
26a0: 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 j(Tcl_GetObjResu
26b0: 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55 4c 4c lt(interp), NULL
26c0: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 )) != NULL) {..T
26d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
26e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
26f0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
2700: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 tringObj(msg, -1
2710: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 ));.. } else
2720: 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c {..listPtr = Tcl
2730: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
2740: 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65 ULL);..while ((e
2750: 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 rr = ERR_get_err
2760: 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20 or()) != 0) {..
2770: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2780: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2790: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c rp, listPtr, Tcl
27a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52 _NewStringObj(ER
27b0: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 R_reason_error_s
27c0: 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 tring(err), -1))
27d0: 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 ;..}..Tcl_ListOb
27e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
27f0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c nterp, cmdPtr, l
2800: 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a istPtr);. }..
2810: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
2820: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
2830: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
2840: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
2850: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 EvalCallback(i
2860: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
2870: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 cmdPtr);. Tc
2880: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
2890: 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 mdPtr);.}.../*.
28a0: 2a 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 2d 2d 2d ----------------
28e0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f ----. *. * KeyLo
28f0: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a gCallback --. *.
2900: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 *.Write receive
2910: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f d key data to lo
2920: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 g file.. *. * Si
2930: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
2940: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
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 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
2990: 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c .void KeyLogCall
29a0: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a back(const SSL *
29b0: 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 ssl, const char
29c0: 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 *line) {. cha
29d0: 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 r *str = getenv(
29e0: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a SSLKEYLOGFILE);.
29f0: 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 FILE *fd;..
2a00: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
2a10: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
2a20: 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 tr) {..fd = fope
2a30: 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 n(str, "a");..fp
2a40: 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 rintf(fd, "%s\n"
2a50: 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 ,line);..fclose(
2a60: 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f fd);. }.}.../
2a70: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ab0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 -------. *. * Pa
2ac0: 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 ssword Callback
2ad0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
2ae0: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 when a password
2af0: 69 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e 70 is needed to unp
2b00: 61 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d 20 ack RSA and PEM
2b10: 6b 65 79 73 2e 0a 20 2a 09 45 76 61 6c 73 20 61 keys.. *.Evals a
2b20: 6e 79 20 62 6f 75 6e 64 20 70 61 73 73 77 6f 72 ny bound passwor
2b30: 64 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 d script and ret
2b40: 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 urns the result
2b50: 61 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77 6f as. *.the passwo
2b60: 72 64 20 73 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a rd string.. *. *
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bb0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
2bc0: 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 nt.PasswordCallb
2bd0: 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 ack(char *buf, i
2be0: 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 72 nt size, int ver
2bf0: 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 ify, void *udata
2c00: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
2c10: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 tatePtr.= (State
2c20: 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 54 *) udata;. T
2c30: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
2c40: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
2c50: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
2c60: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
2c70: 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 nt code;.. dp
2c80: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
2c90: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 .. /* If no c
2ca0: 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64 65 66 allback, use def
2cb0: 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f ault callback */
2cc0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
2cd0: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e r->password == N
2ce0: 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f ULL) {..if (Tcl_
2cf0: 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 EvalEx(interp, "
2d00: 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 tls::password",
2d10: 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f -1, TCL_EVAL_GLO
2d20: 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 BAL) == TCL_OK)
2d30: 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65 74 {.. char *ret
2d40: 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f = (char *) Tcl_
2d50: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 GetStringResult(
2d60: 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 73 74 interp);.. st
2d70: 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 rncpy(buf, ret,
2d80: 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a (size_t) size);.
2d90: 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 . return (int
2da0: 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d )strlen(ret);..}
2db0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 else {.. ret
2dc0: 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d urn -1;..}. }
2dd0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
2de0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
2df0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
2e00: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
2e10: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
2e20: 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 ord);.. Tcl_P
2e30: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
2e40: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
2e50: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
2e60: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
2e70: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 ePtr);.. /* E
2e80: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 val callback and
2e90: 20 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b 2c success for ok,
2ea0: 20 61 62 6f 72 74 20 66 6f 72 20 65 72 72 6f 72 abort for error
2eb0: 2c 20 63 6f 6e 74 69 6e 75 65 20 66 6f 72 20 63 , continue for c
2ec0: 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20 54 ontinue */. T
2ed0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
2ee0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 cmdPtr);. cod
2ef0: 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 e = Tcl_EvalObjE
2f00: 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 x(interp, cmdPtr
2f10: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 , TCL_EVAL_GLOBA
2f20: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 L);. if (code
2f30: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 != TCL_OK) {.#i
2f40: 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 f (TCL_MAJOR_VER
2f50: 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 SION == 8) && (T
2f60: 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e CL_MINOR_VERSION
2f70: 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 < 6)..Tcl_Backg
2f80: 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 roundError(inter
2f90: 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 p);.#else..Tcl_B
2fa0: 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 ackgroundExcepti
2fb0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 on(interp, code)
2fc0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 ;.#endif. }.
2fd0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
2fe0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 unt(cmdPtr);..
2ff0: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 Tcl_Release((C
3000: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
3010: 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 63 Ptr);.. if (c
3020: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b ode == TCL_OK) {
3030: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 ..char *ret = (c
3040: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 har *) Tcl_GetSt
3050: 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 ringResult(inter
3060: 70 29 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e 28 p);..if (strlen(
3070: 72 65 74 29 20 3c 20 73 69 7a 65 20 2d 20 31 29 ret) < size - 1)
3080: 20 7b 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28 {.. strncpy(
3090: 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f buf, ret, (size_
30a0: 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 54 t) size);.. T
30b0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
30c0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
30d0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e .. return (in
30e0: 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 t)strlen(ret);..
30f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f }. }. Tcl_
3100: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
3110: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
3120: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76 65 return -1;..ve
3130: 72 69 66 79 20 3d 20 76 65 72 69 66 79 3b 0a 7d rify = verify;.}
3140: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
3190: 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 * Session Callba
31a0: 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d ck for Clients -
31b0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 -. *. *.Called w
31c0: 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f hen a new sessio
31d0: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 n is added to th
31e0: 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 e cache. In TLS
31f0: 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 1.3. *.this may
3200: 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 be received mult
3210: 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 iple times after
3220: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 the handshake.
3230: 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 For. *.earlier v
3240: 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 ersions, this wi
3250: 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 64 ll be received d
3260: 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 uring the handsh
3270: 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 ake.. *.This is
3280: 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77 61 the preferred wa
3290: 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 y to obtain a re
32a0: 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e sumable session.
32b0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
32c0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
32d0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
32e0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
32f0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
3300: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
3310: 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 *.0 = error wher
3320: 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 e session will b
3330: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 e immediately re
3340: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 moved from the i
3350: 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 nternal cache..
3360: 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 *.1 = success wh
3370: 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 ere app retains
3380: 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 session in sessi
3390: 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 on cache, and mu
33a0: 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 st call SSL_SESS
33b0: 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 ION_free() when
33c0: 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d done.. *. *-----
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
3410: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 */.static int.Se
3420: 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 6f ssionCallback(co
3430: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53 53 nst SSL *ssl, SS
3440: 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 L_SESSION *sessi
3450: 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 on) {. State
3460: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
3470: 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f te*)SSL_get_app_
3480: 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 data((SSL *)ssl)
3490: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
34a0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
34b0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
34c0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
34d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 ;. const unsi
34e0: 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 gned char *ticke
34f0: 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 t;. const uns
3500: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 igned char *sess
3510: 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 ion_id;. size
3520: 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 _t len2;. uns
3530: 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a igned int ulen;.
3540: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
3550: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
3560: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
3570: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a ack == (Tcl_Obj*
3580: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
3590: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
35a0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 OK;. } else i
35b0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 f (ssl == NULL)
35c0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
35d0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
35e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
35f0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
3600: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
3610: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
3620: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
3630: 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 callback);. T
3640: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3650: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3660: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
3670: 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f tringObj("sessio
3680: 6e 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f n", -1));.. /
3690: 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a * Session id */.
36a0: 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 3d session_id =
36b0: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
36c0: 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c _id(session, &ul
36d0: 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 en);. Tcl_Lis
36e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
36f0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3700: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 , Tcl_NewByteArr
3710: 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 ayObj(session_id
3720: 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a , (int) ulen));.
3730: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 . /* Session
3740: 74 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 ticket */. SS
3750: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 L_SESSION_get0_t
3760: 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 icket(session, &
3770: 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a ticket, &len2);.
3780: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
3790: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
37a0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
37b0: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a _NewByteArrayObj
37c0: 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c (ticket, (int) l
37d0: 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c en2));.. /* L
37e0: 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 ifetime - number
37f0: 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 of seconds */.
3800: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3810: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3820: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c rp, cmdPtr,..Tcl
3830: 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e _NewLongObj((lon
3840: 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 g) SSL_SESSION_g
3850: 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 et_ticket_lifeti
3860: 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 me_hint(session)
3870: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c ));.. /* Eval
3880: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
3890: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
38a0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
38b0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 );. EvalCallb
38c0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
38d0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 ePtr, cmdPtr);.
38e0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
38f0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
3900: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f return 0;.}.../
3910: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c -------. *. * AL
3960: 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 PN Callback for
3970: 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 Servers and NPN
3980: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 Callback for Cli
3990: 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 ents --. *. *.Pe
39a0: 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 rform protocol (
39b0: 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 http/1.1, h2, h3
39c0: 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f , etc.) selectio
39d0: 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 n for the. *.inc
39e0: 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e oming connection
39f0: 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 . Called after H
3a00: 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 ello and server
3a10: 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 callbacks.. *.Wh
3a20: 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c ere 'out' is sel
3a30: 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
3a40: 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 70 nd 'in' is the p
3a50: 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20 6c eer advertised l
3a60: 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ist.. *. * Resul
3a70: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
3a80: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
3a90: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
3aa0: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
3ab0: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
3ac0: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s:. *.SSL_TLSEXT
3ad0: 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 _ERR_OK: ALPN pr
3ae0: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e otocol selected.
3af0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
3b00: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
3b10: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 L_TLSEXT_ERR_ALE
3b20: 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 RT_FATAL: There
3b30: 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 was no overlap b
3b40: 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e etween the clien
3b50: 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c t's. *. suppl
3b60: 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 ied list and the
3b70: 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 server configur
3b80: 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 ation. The conne
3b90: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 ction will be ab
3ba0: 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c orted.. *.SSL_TL
3bb0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 SEXT_ERR_NOACK:
3bc0: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f ALPN protocol no
3bd0: 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e t selected, e.g.
3be0: 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 , because no ALP
3bf0: 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f N. *. protoco
3c00: 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 ls are configure
3c10: 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 d for this conne
3c20: 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 ction. The conne
3c30: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
3c40: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
3c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
3c90: 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c atic int.ALPNCal
3ca0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
3cb0: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 *ssl, const unsi
3cc0: 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c gned char **out,
3cd0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
3ce0: 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 outlen,..const u
3cf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e nsigned char *in
3d00: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 , unsigned int i
3d10: 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 nlen, void *arg)
3d20: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
3d30: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a atePtr = (State*
3d40: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e )arg;. Tcl_In
3d50: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
3d60: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
3d70: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
3d80: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f dPtr;. int co
3d90: 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 de, res;.. dp
3da0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
3db0: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d .. if (ssl ==
3dc0: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 NULL || arg ==
3dd0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
3de0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
3df0: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 OACK;. }..
3e00: 20 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f /* Select proto
3e10: 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 col */. if (S
3e20: 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 SL_select_next_p
3e30: 72 6f 74 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e roto(out, outlen
3e40: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 , statePtr->prot
3e50: 6f 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 os, statePtr->pr
3e60: 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 otos_len,..in, i
3e70: 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c nlen) == OPENSSL
3e80: 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 _NPN_NEGOTIATED)
3e90: 20 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 {../* Match fou
3ea0: 6e 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c nd */..res = SSL
3eb0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
3ec0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a } else {../*
3ed0: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f OPENSSL_NPN_NO_
3ee0: 4f 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 OVERLAP = No ove
3ef0: 72 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 rlap, so use fir
3f00: 73 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 st item from cli
3f10: 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 ent protocol lis
3f20: 74 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f t */..res = SSL_
3f30: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
3f40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
3f50: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 (statePtr->vcmd
3f60: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
3f70: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 L) {..return res
3f80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
3f90: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
3fa0: 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d o eval */. cm
3fb0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
3fc0: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
3fd0: 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c ->vcmd);. Tcl
3fe0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3ff0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4000: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
4010: 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d ingObj("alpn", -
4020: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
4030: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4040: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4050: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
4060: 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a 0a bj(*out, -1));..
4070: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
4080: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
4090: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
40a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
40b0: 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 if ((code = Ev
40c0: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 alCallback(inter
40d0: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 p, statePtr, cmd
40e0: 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 Ptr)) > 1) {..re
40f0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
4100: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 RR_NOACK;. }
4110: 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d else if (code ==
4120: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 1) {..res = SSL
4130: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
4140: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 } else {..re
4150: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
4160: 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a RR_ALERT_FATAL;.
4170: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
4180: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
4190: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 r);. return r
41a0: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d es;.}.../*. *---
41b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41f0: 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 65 . *. * Advertise
4200: 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 Protocols Callb
4210: 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 6f ack for Next Pro
4220: 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f tocol Negotiatio
4230: 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 n (NPN) in Serve
4240: 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 rHello --. *. *.
4250: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 4c called when a TL
4260: 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 20 61 S server needs a
4270: 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f 72 74 list of support
4280: 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 ed protocols for
4290: 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f Next. *.Protoco
42a0: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 l Negotiation..
42b0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
42c0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
42d0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 effects:. *. *
42e0: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
42f0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
4300: 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c OK: NPN protocol
4310: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 selected. The c
4320: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
4330: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ues.. *.SSL_TLSE
4340: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 XT_ERR_NOACK: NP
4350: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 N protocol not s
4360: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e elected. The con
4370: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
4380: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d s.. *. *--------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
43d0: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 #ifdef USE_NPN.s
43e0: 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c tatic int.NPNCal
43f0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
4400: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 *ssl, const unsi
4410: 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c gned char **out,
4420: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f unsigned int *o
4430: 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 utlen, void *arg
4440: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
4450: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
4460: 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 *)arg;.. dpri
4470: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
4480: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e if (ssl == N
4490: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 ULL || arg == NU
44a0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
44b0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
44c0: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f CK;. }.. /
44d0: 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 * Set protocols
44e0: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 list */. if (
44f0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
4500: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 != NULL) {..*ou
4510: 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 t = statePtr->pr
4520: 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d otos;..*outlen =
4530: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
4540: 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 s_len;. } els
4550: 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c e {..*out = NULL
4560: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a ;..*outlen = 0;.
4570: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4580: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
4590: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 }. return S
45a0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
45b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a ;.}.#endif.../*.
45c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
45d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4600: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 -----. *. * SNI
4610: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 Callback for Ser
4620: 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 vers --. *. *.Pe
4630: 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 64 rform server-sid
4640: 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 e SNI hostname s
4650: 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 20 72 election after r
4660: 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 78 74 eceiving SNI ext
4670: 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 ension. *.in Cli
4680: 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 ent Hello. Calle
4690: 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 d after hello ca
46a0: 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 6f 72 llback but befor
46b0: 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e e ALPN callback.
46c0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
46d0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
46e0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
46f0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
4700: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
4710: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
4720: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
4730: 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d _OK: SNI hostnam
4740: 65 20 69 73 20 61 63 63 65 70 74 65 64 2e 20 54 e is accepted. T
4750: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
4760: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f ntinues.. *.SSL_
4770: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 TLSEXT_ERR_ALERT
4780: 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 _FATAL: SNI host
4790: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 name is not acce
47a0: 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 pted. The connec
47b0: 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 tion. *. is a
47c0: 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c 74 20 borted. Default
47d0: 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 53 4c for alert is SSL
47e0: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 _AD_UNRECOGNIZED
47f0: 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c _NAME.. *.SSL_TL
4800: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 SEXT_ERR_ALERT_W
4810: 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 ARNING: SNI host
4820: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 name is not acce
4830: 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c pted, warning al
4840: 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 ert. *. sent
4850: 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 (not supported i
4860: 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 n TLSv1.3). The
4870: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
4880: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
4890: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 EXT_ERR_NOACK: S
48a0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e NI hostname is n
48b0: 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 20 ot accepted and
48c0: 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 not acknowledged
48d0: 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 ,. *. e.g. if
48e0: 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65 SNI has not bee
48f0: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 n configured. Th
4900: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
4910: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d tinues.. *. *---
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4960: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
4970: 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 SNICallback(cons
4980: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 t SSL *ssl, int
4990: 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 *alert, void *ar
49a0: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a g) {. State *
49b0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
49c0: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f e*)arg;. Tcl_
49d0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d Interp *interp.=
49e0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
49f0: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
4a00: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 cmdPtr;. int
4a10: 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 code, res;. c
4a20: 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 20 har *servername
4a30: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 = NULL;.. dpr
4a40: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
4a50: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 . if (ssl ==
4a60: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e NULL || arg == N
4a70: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
4a80: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
4a90: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ACK;. }..
4aa0: 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f /* Only works fo
4ab0: 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 65 61 r TLS 1.2 and ea
4ac0: 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 65 72 rlier */. ser
4ad0: 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 vername = SSL_ge
4ae0: 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c t_servername(ssl
4af0: 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 , TLSEXT_NAMETYP
4b00: 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 E_host_name);.
4b10: 20 20 69 66 20 28 21 73 65 72 76 65 72 6e 61 6d if (!servernam
4b20: 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b e || servername[
4b30: 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72 0] == '\0') {..r
4b40: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
4b50: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
4b60: 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
4b70: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 Ptr->vcmd == (Tc
4b80: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
4b90: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
4ba0: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a T_ERR_OK;. }.
4bb0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
4bc0: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a ommand to eval *
4bd0: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
4be0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
4bf0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
4c00: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4c10: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4c20: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
4c30: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
4c40: 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 sni", -1));.
4c50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
4c60: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
4c70: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
4c80: 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 StringObj(server
4c90: 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 name , -1));..
4ca0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
4cb0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
4cc0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
4cd0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
4ce0: 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c if ((code = Eval
4cf0: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c Callback(interp,
4d00: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 statePtr, cmdPt
4d10: 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 r)) > 1) {..res
4d20: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 = SSL_TLSEXT_ERR
4d30: 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3b 0a _ALERT_WARNING;.
4d40: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 .*alert = SSL_AD
4d50: 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 _UNRECOGNIZED_NA
4d60: 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f ME; /* Not suppo
4d70: 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33 20 rted by TLS 1.3
4d80: 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 */. } else if
4d90: 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 (code == 1) {..
4da0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
4db0: 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 _ERR_OK;. } e
4dc0: 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c lse {..res = SSL
4dd0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 _TLSEXT_ERR_ALER
4de0: 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 72 74 T_FATAL;..*alert
4df0: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f = SSL_AD_UNRECO
4e00: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 GNIZED_NAME; /*
4e10: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 Not supported by
4e20: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 TLS 1.3 */.
4e30: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 }. Tcl_DecrRe
4e40: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
4e50: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a return res;.
4e60: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
4e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
4eb0: 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 48 * ClientHello H
4ec0: 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 61 63 andshake Callbac
4ed0: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d k for Servers --
4ee0: 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 73 . *. *.Used by s
4ef0: 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 6e 65 erver to examine
4f00: 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 the server name
4f10: 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 indication (SNI
4f20: 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 ) extension. *.p
4f30: 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 63 rovided by the c
4f40: 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 lient in order t
4f50: 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 70 72 o select an appr
4f60: 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 69 63 opriate certific
4f70: 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e ate to. *.presen
4f80: 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65 t, and make othe
4f90: 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 r configuration
4fa0: 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c 65 adjustments rele
4fb0: 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 65 72 vant to that ser
4fc0: 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20 ver. *.name and
4fd0: 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f its configuratio
4fe0: 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 n. This includes
4ff0: 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 74 68 swapping out th
5000: 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 e associated. *.
5010: 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c SSL_CTX pointer,
5020: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 modifying the s
5030: 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f 66 20 erver's list of
5040: 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 76 65 permitted TLS ve
5050: 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 rsions,. *.chang
5060: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 ing the server's
5070: 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 6e 20 cipher list in
5080: 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 response to the
5090: 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 72 20 client's cipher
50a0: 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09 43 61 list, etc.. *.Ca
50b0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e 49 20 lled before SNI
50c0: 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 and ALPN callbac
50d0: 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ks.. *. * Result
50e0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
50f0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
5100: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
5110: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
5120: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 . * Return codes
5130: 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f :. *.SSL_CLIENT_
5140: 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 75 73 HELLO_RETRY: sus
5150: 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 pend the handsha
5160: 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61 6e 64 ke, and the hand
5170: 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 shake function w
5180: 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 ill return immed
5190: 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c iately. *.SSL_CL
51a0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
51b0: 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 : failure, termi
51c0: 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e nate connection.
51d0: 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20 65 72 Set alert to er
51e0: 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c ror code.. *.SSL
51f0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 _CLIENT_HELLO_SU
5200: 43 43 45 53 53 3a 20 73 75 63 63 65 73 73 0a 20 CCESS: success.
5210: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
5260: 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c ic int.HelloCall
5270: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a back(const SSL *
5280: 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c ssl, int *alert,
5290: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 void *arg) {.
52a0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
52b0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b r = (State*)arg;
52c0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
52d0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
52e0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
52f0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
5300: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 . int code, r
5310: 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 es;. const ch
5320: 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a ar *servername;.
5330: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
5340: 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 ed char *p;.
5350: 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 size_t len, rema
5360: 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 ining;.. dpri
5370: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
5380: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
5390: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f ->vcmd == (Tcl_O
53a0: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 bj*)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 53 55 43 43 45 53 53 3b 0a 20 20 ELLO_SUCCESS;.
53d0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c } else if (ssl
53e0: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 == NULL || arg
53f0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
5400: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
5410: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
5420: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d .. /* Get nam
5430: 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 es */. if (!S
5440: 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f SL_client_hello_
5450: 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c get0_ext(ssl, TL
5460: 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65 72 SEXT_TYPE_server
5470: 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61 _name, &p, &rema
5480: 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e ining) || remain
5490: 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c ing <= 2) {..*al
54a0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 ert = SSL_R_SSLV
54b0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 3_ALERT_ILLEGAL_
54c0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 PARAMETER;..retu
54d0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
54e0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
54f0: 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 .. /* Extract
5500: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 the length of t
5510: 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 he supplied list
5520: 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 of names. */.
5530: 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 len = (*(p++)
5540: 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b << 8);. len +
5550: 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 = *(p++);. if
5560: 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d (len + 2 != rem
5570: 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 aining) {..*aler
5580: 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f t = SSL_R_SSLV3_
5590: 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 ALERT_ILLEGAL_PA
55a0: 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e RAMETER;..return
55b0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
55c0: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 O_ERROR;. }.
55d0: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c remaining = l
55e0: 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 en;.. /* The
55f0: 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63 65 list in practice
5600: 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e 67 only has a sing
5610: 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 le element, so w
5620: 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20 e only consider
5630: 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a the first one. *
5640: 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e /. if (remain
5650: 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b ing == 0 || *p++
5660: 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 != TLSEXT_NAMET
5670: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b YPE_host_name) {
5680: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 ..*alert = SSL_R
5690: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 _TLSV1_ALERT_INT
56a0: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 ERNAL_ERROR;..re
56b0: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
56c0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
56d0: 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 }. remaining
56e0: 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 --;.. /* Now
56f0: 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70 we can finally p
5700: 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 65 ull out the byte
5710: 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20 array with the
5720: 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e actual hostname.
5730: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 */. if (rema
5740: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a ining <= 2) {..*
5750: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c alert = SSL_R_TL
5760: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e SV1_ALERT_INTERN
5770: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 AL_ERROR;..retur
5780: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
5790: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
57a0: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b len = (*(p++
57b0: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e ) << 8);. len
57c0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 += *(p++);.
57d0: 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 if (len + 2 > re
57e0: 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 maining) {..*ale
57f0: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 rt = SSL_R_TLSV1
5800: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f _ALERT_INTERNAL_
5810: 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 ERROR;..return S
5820: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
5830: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
5840: 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e remaining = len
5850: 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 ;. servername
5860: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a = (const char *
5870: 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 )p;.. /* Crea
5880: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
5890: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 al */. cmdPtr
58a0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
58b0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 Obj(statePtr->vc
58c0: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 md);. Tcl_Lis
58d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
58e0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
58f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
5900: 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 bj("hello", -1))
5910: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
5920: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5930: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
5940: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
5950: 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 69 6e 74 servername, (int
5960: 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a ) len));.. /*
5970: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 Eval callback c
5980: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 ommand */. Tc
5990: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
59a0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 mdPtr);. if (
59b0: 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c (code = EvalCall
59c0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
59d0: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 tePtr, cmdPtr))
59e0: 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 > 1) {..res = SS
59f0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 L_CLIENT_HELLO_R
5a00: 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 ETRY;..*alert =
5a10: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
5a20: 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 T_USER_CANCELLED
5a30: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
5a40: 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 (code == 1) {..r
5a50: 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f es = SSL_CLIENT_
5a60: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 HELLO_SUCCESS;.
5a70: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 } else {..res
5a80: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 = SSL_CLIENT_HE
5a90: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 LLO_ERROR;..*ale
5aa0: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 rt = SSL_R_TLSV1
5ab0: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f _ALERT_INTERNAL_
5ac0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
5ad0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
5ae0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 t(cmdPtr);. r
5af0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f eturn res;.}.../
5b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5b10: 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 ****/./* Command
5b20: 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a s */./**
5b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5b40: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d **/../*. *------
5b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
5b90: 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d . * CiphersObjCm
5ba0: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 d -- list availa
5bb0: 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 ble ciphers. *.
5bc0: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
5bd0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 is invoked to p
5be0: 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a rocess the "tls:
5bf0: 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e :ciphers" comman
5c00: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 d. *.to list ava
5c10: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 ilable ciphers,
5c20: 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f based upon proto
5c30: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a col selected.. *
5c40: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
5c50: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
5c60: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 esult list.. *.
5c70: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
5c80: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e *.constructs an
5c90: 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 d destroys SSL c
5ca0: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a ontext (CTX). *.
5cb0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5cf0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
5d00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f const char *pro
5d10: 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 tocols[] = {.."s
5d20: 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 sl2", "ssl3", "t
5d30: 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 ls1", "tls1.1",
5d40: 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e "tls1.2", "tls1.
5d50: 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 3", NULL.};.enum
5d60: 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 protocol {.
5d70: 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 TLS_SSL2, TLS_SS
5d80: 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c L3, TLS_TLS1, TL
5d90: 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c S_TLS1_1, TLS_TL
5da0: 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 S1_2, TLS_TLS1_3
5db0: 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 , TLS_NONE.};..s
5dc0: 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 tatic int.Cipher
5dd0: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 sObjCmd(ClientDa
5de0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
5df0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
5e00: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
5e10: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
5e20: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
5e30: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c j *objPtr = NULL
5e40: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 ;. SSL_CTX *c
5e50: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 tx = NULL;. S
5e60: 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a SL *ssl = NULL;.
5e70: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c STACK_OF(SSL
5e80: 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 _CIPHER) *sk;.
5e90: 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b char *cp, buf[
5ea0: 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 BUFSIZ];. int
5eb0: 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20 index, verbose
5ec0: 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 = 0, use_support
5ed0: 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 ed = 0;.. dpr
5ee0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
5ef0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c . if ((objc <
5f00: 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 2) || (objc > 4
5f10: 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e )) {..Tcl_WrongN
5f20: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
5f30: 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f , objv, "protoco
5f40: 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 l ?verbose? ?sup
5f50: 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 ported?");..retu
5f60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
5f70: 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f }. if (Tcl_
5f80: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 GetIndexFromObj(
5f90: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c interp, objv[1],
5fa0: 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f protocols, "pro
5fb0: 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 tocol", 0, &inde
5fc0: 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a x) != TCL_OK) {.
5fd0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
5fe0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
5ff0: 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 ((objc > 2) && T
6000: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f cl_GetBooleanFro
6010: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
6020: 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 v[2], &verbose)
6030: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 != TCL_OK) {..re
6040: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6050: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f }. if ((o
6060: 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f bjc > 3) && Tcl_
6070: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 GetBooleanFromOb
6080: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 j(interp, objv[3
6090: 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 ], &use_supporte
60a0: 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a d) != TCL_OK) {.
60b0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
60c0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 R;. }.. ER
60d0: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
60e0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 .. switch ((e
60f0: 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 num protocol)ind
6100: 65 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f ex) {..case TLS_
6110: 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 SSL2:.#if OPENSS
6120: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
6130: 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 >= 0x10100000L
6140: 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 || defined(NO_SS
6150: 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L2) || defined(O
6160: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
6170: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
6180: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
6190: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
61a0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
61b0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
61c0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
61d0: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
61e0: 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 . ctx = SSL_C
61f0: 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65 74 TX_new(SSLv2_met
6200: 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 hod()); break;.#
6210: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
6220: 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 SSL3:.#if define
6230: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 d(NO_SSL3) || de
6240: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
6250: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
6260: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
6270: 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 3_METHOD).. T
6280: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
6290: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
62a0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
62b0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
62c0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
62d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
62e0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 OR;.#else.. c
62f0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
6300: 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 29 (SSLv3_method())
6310: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
6320: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a .case TLS_TLS1:.
6330: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
6340: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
6350: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
6360: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
6370: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 SSL_NO_TLS1_METH
6380: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 OD).. Tcl_App
6390: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
63a0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
63b0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
63c0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
63d0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
63e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
63f0: 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 lse.. ctx = S
6400: 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 SL_CTX_new(TLSv1
6410: 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 _method()); brea
6420: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 k;.#endif..case
6430: 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 TLS_TLS1_1:.#if
6440: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
6450: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
6460: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
6470: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
6480: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 SSL_NO_TLS1_1_ME
6490: 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 THOD).. Tcl_A
64a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
64b0: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e rp, protocols[in
64c0: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f dex], ": protoco
64d0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
64e0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 , NULL);.. re
64f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6500: 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d #else.. ctx =
6510: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 SSL_CTX_new(TLS
6520: 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 v1_1_method());
6530: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
6540: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a ase TLS_TLS1_2:.
6550: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
6560: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
6570: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
6580: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
6590: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
65a0: 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 2_METHOD).. T
65b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
65c0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
65d0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
65e0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
65f0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
6600: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
6610: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 OR;.#else.. c
6620: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
6630: 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 (TLSv1_2_method(
6640: 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 )); break;.#endi
6650: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
6660: 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _3:.#if defined(
6670: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
6680: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
6690: 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 63 _TLS1_3).. Tc
66a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
66b0: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
66c0: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
66d0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
66e0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
66f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
6700: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 R;.#else.. ct
6710: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 x = SSL_CTX_new(
6720: 54 4c 53 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 09 TLS_method());..
6730: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
6740: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f min_proto_versio
6750: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
6760: 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c RSION);.. SSL
6770: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f _CTX_set_max_pro
6780: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 to_version(ctx,
6790: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b TLS1_3_VERSION);
67a0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e .. break;.#en
67b0: 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 dif..default:..
67c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
67d0: 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e if (ctx == N
67e0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
67f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
6800: 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 REASON(), NULL)
6810: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
6820: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
6830: 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 ssl = SSL_new(ct
6840: 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 x);. if (ssl
6850: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f == NULL) {..Tcl_
6860: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
6870: 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e erp, REASON(), N
6880: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
6890: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
68a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
68b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c }.. /* Use l
68c0: 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 ist and order as
68d0: 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 would be sent i
68e0: 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 n a ClientHello
68f0: 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 or all available
6900: 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 ciphers */.
6910: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 if (use_supporte
6920: 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 d) {..sk = SSL_g
6930: 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 et1_supported_ci
6940: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 phers(ssl);.
6950: 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 } else {..sk = S
6960: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 SL_get_ciphers(s
6970: 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 sl);. }..
6980: 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 if (sk != NULL)
6990: 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 {..if (!verbose)
69a0: 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d {.. objPtr =
69b0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
69c0: 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 0, NULL);.. f
69d0: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 or (int i = 0; i
69e0: 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 < sk_SSL_CIPHER
69f0: 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b _num(sk); i++) {
6a00: 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 ...const SSL_CIP
6a10: 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f HER *c = sk_SSL_
6a20: 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c CIPHER_value(sk,
6a30: 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 i);...if (c ==
6a40: 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a NULL) continue;.
6a50: 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d .../* cipher nam
6a60: 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 e or (NONE) */..
6a70: 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 .cp = SSL_CIPHER
6a80: 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 _get_name(c);...
6a90: 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 if (cp == NULL)
6aa0: 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 break;...Tcl_Lis
6ab0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
6ac0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
6ad0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
6ae0: 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 bj(cp, -1));..
6af0: 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 }...} else {..
6b00: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
6b10: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 _NewStringObj(""
6b20: 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 ,0);.. for (i
6b30: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b nt i = 0; i < sk
6b40: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 _SSL_CIPHER_num(
6b50: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f sk); i++) {...co
6b60: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a nst SSL_CIPHER *
6b70: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 c = sk_SSL_CIPHE
6b80: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a R_value(sk, i);.
6b90: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 ..if (c == NULL)
6ba0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a continue;..../*
6bb0: 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 textual descrip
6bc0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 tion of the ciph
6bd0: 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f er */...if (SSL_
6be0: 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 CIPHER_descripti
6bf0: 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f on(c, buf, sizeo
6c00: 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 f(buf)) != NULL)
6c10: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 {... Tcl_App
6c20: 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c endToObj(objPtr,
6c30: 20 62 75 66 2c 20 28 69 6e 74 29 20 73 74 72 6c buf, (int) strl
6c40: 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20 65 6c en(buf));...} el
6c50: 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 se {... Tcl_A
6c60: 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 ppendToObj(objPt
6c70: 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 r, "UNKNOWN\n",
6c80: 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 8);...}.. }..
6c90: 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 70 70 6f }..if (use_suppo
6ca0: 72 74 65 64 29 20 7b 0a 09 20 20 20 20 73 6b 5f rted) {.. sk_
6cb0: 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 65 65 28 SSL_CIPHER_free(
6cc0: 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 sk);..}. }.
6cd0: 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b SSL_free(ssl);
6ce0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 . SSL_CTX_fre
6cf0: 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c e(ctx);.. Tcl
6d00: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
6d10: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 terp, objPtr);.
6d20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
6d30: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
6d40: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
6d50: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 --------. *. * P
6da0: 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d rotocolsObjCmd -
6db0: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 - list available
6dc0: 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a protocols. *. *
6dd0: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
6de0: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 is invoked to pr
6df0: 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a ocess the "tls::
6e00: 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 protocols" comma
6e10: 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 nd. *.to list av
6e20: 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c ailable protocol
6e30: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 s.. *. * Results
6e40: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
6e50: 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e Tcl result list.
6e60: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
6e70: 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a cts:. *.none. *.
6e80: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ec0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
6ed0: 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 int.ProtocolsOb
6ee0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
6ef0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
6f00: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
6f10: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
6f20: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
6f30: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
6f40: 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 objPtr;.. dpr
6f50: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
6f60: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
6f70: 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 1) {..Tcl_Wrong
6f80: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
6f90: 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 1, objv, "");..r
6fa0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6fb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
6fc0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
6fd0: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
6fe0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
6ff0: 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 ULL);..#if OPENS
7000: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
7010: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 R < 0x10100000L
7020: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 && !defined(NO_S
7030: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL2) && !defined
7040: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
7050: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
7060: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
7070: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
7080: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
7090: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 protocols[TLS_SS
70a0: 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 L2], -1));.#endi
70b0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
70c0: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
70d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
70e0: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
70f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
7100: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c _METHOD). Tcl
7110: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
7120: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
7130: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
7140: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
7150: 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 [TLS_SSL3], -1))
7160: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
7170: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 fined(NO_TLS1) &
7180: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
7190: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 SL_NO_TLS1) && !
71a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
71b0: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
71c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
71d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
71e0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
71f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
7200: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
7210: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
7220: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
7230: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
7240: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
7250: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
7260: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7270: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_1_METHOD).
7280: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
7290: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
72a0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
72b0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
72c0: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d cols[TLS_TLS1_1]
72d0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
72e0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
72f0: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
7300: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7310: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
7320: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
7330: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_2_METHOD).
7340: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
7350: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
7360: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
7370: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 StringObj(protoc
7380: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c ols[TLS_TLS1_2],
7390: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 -1));.#endif.#i
73a0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
73b0: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
73c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
73d0: 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1_3). Tcl_Lis
73e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
73f0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
7400: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
7410: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
7420: 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a _TLS1_3], -1));.
7430: 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f #endif.. Tcl_
7440: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
7450: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
7460: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
7470: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
7480: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
7490: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
74a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
74b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
74c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
74d0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 -------. *. * Ha
74e0: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d ndshakeObjCmd --
74f0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d . *. *.This comm
7500: 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 and is used to v
7510: 65 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68 erify whether th
7520: 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 e handshake is c
7530: 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f omplete. *.or no
7540: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 t.. *. * Results
7550: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
7560: 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 Tcl result. 1 me
7570: 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f ans handshake co
7580: 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 mplete, 0 means
7590: 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 pending.. *. * S
75a0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
75b0: 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 May force SSL ne
75c0: 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b gotiation to tak
75d0: 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d e place.. *. *--
75e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7620: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
7630: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 HandshakeObjCmd
7640: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
7650: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
7660: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
7670: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
7680: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
7690: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
76a0: 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 han; /* T
76b0: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 he channel to se
76c0: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a t a mode on. */.
76d0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
76e0: 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 Ptr; /* c
76f0: 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 lient state for
7700: 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 ssl socket */.
7710: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 const char *er
7720: 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 rStr = NULL;.
7730: 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 int ret = 1;.
7740: 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a int err = 0;..
7750: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
7760: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
7770: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 objc != 2) {..Tc
7780: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
7790: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
77a0: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 "channel");..ret
77b0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
77c0: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 }.. ERR_c
77d0: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 lear_error();..
77e0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
77f0: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
7800: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
7810: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e omObj(objv[1], N
7820: 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 ULL), NULL);.
7830: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
7840: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
7850: 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 {..return(TCL_E
7860: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 RROR);. }..
7870: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 /* Make sure t
7880: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
7890: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
78a0: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 */. chan = T
78b0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
78c0: 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 (chan);. if (
78d0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
78e0: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
78f0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
7900: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
7910: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 lt(interp, "bad
7920: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c channel \"", Tcl
7930: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
7940: 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a chan),.. "\":
7950: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
7960: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c el", NULL);..Tcl
7970: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
7980: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 terp, "TLS", "HA
7990: 4e 44 53 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e NDSHAKE", "CHANN
79a0: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 EL", "INVALID",
79b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
79c0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
79d0: 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 R);. }. st
79e0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
79f0: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c *)Tcl_GetChannel
7a00: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
7a10: 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 n);.. dprintf
7a20: 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 ("Calling Tls_Wa
7a30: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a itForConnect");.
7a40: 20 20 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 ret = Tls_Wa
7a50: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 itForConnect(sta
7a60: 74 65 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b tePtr, &err, 1);
7a70: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c . dprintf("Tl
7a80: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
7a90: 20 72 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 returned: %i",
7aa0: 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 ret);.. if (r
7ab0: 65 74 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 et < 0 && ((stat
7ac0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c ePtr->flags & TL
7ad0: 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 S_TCL_ASYNC) &&
7ae0: 28 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 (err == EAGAIN))
7af0: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 ) {..dprintf("As
7b00: 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 ync set and err
7b10: 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 = EAGAIN");..ret
7b20: 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 = 0;. } else
7b30: 20 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a if (ret < 0) {.
7b40: 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 .errStr = stateP
7b50: 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 tr->err;..Tcl_Re
7b60: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 setResult(interp
7b70: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f );..Tcl_SetErrno
7b80: 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 (err);...if (!er
7b90: 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 rStr || (*errStr
7ba0: 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 65 == 0)) {.. e
7bb0: 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 rrStr = Tcl_Posi
7bc0: 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a xError(interp);.
7bd0: 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 .}...Tcl_AppendR
7be0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 esult(interp, "h
7bf0: 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a andshake failed:
7c00: 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68 61 ", errStr, (cha
7c10: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c r *) NULL);..Tcl
7c20: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
7c30: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 terp, "TLS", "HA
7c40: 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45 NDSHAKE", "FAILE
7c50: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
7c60: 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65 L);..dprintf("Re
7c70: 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f turning TCL_ERRO
7c80: 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 R with handshake
7c90: 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 failed: %s", er
7ca0: 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 54 rStr);..return(T
7cb0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
7cc0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72 else {..if (err
7cd0: 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 != 0) {.. dp
7ce0: 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 rintf("Got an er
7cf0: 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c ror with a compl
7d00: 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 eted handshake:
7d10: 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b err = %i", err);
7d20: 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 ..}..ret = 1;.
7d30: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
7d40: 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f ("Returning TCL_
7d50: 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 25 OK with data \"%
7d60: 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 i\"", ret);.
7d70: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
7d80: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
7d90: 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 IntObj(ret));.
7da0: 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 return(TCL_OK)
7db0: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
7dc0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f clientData;.}../
7dd0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
7de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e10: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d -------. *. * Im
7e20: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a portObjCmd --. *
7e30: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
7e40: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f re is invoked to
7e50: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 process the "ss
7e60: 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a l" command. *. *
7e70: 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 .The ssl command
7e80: 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 pushes SSL over
7e90: 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 a (newly connec
7ea0: 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a ted) tcp socket.
7eb0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
7ec0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
7ed0: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
7ee0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
7ef0: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 May modify the b
7f00: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f ehavior of an IO
7f10: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
7f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f60: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
7f70: 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 t.ImportObjCmd(C
7f80: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
7f90: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
7fa0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
7fb0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
7fc0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
7fd0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
7fe0: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
7ff0: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
8000: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 on. */. Stat
8010: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a e *statePtr;../*
8020: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f client state fo
8030: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a r ssl socket */.
8040: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 SSL_CTX *ctx
8050: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
8060: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 . Tcl_Obj *sc
8070: 72 69 70 74 09 20 20 20 20 20 20 20 20 3d 20 4e ript. = N
8080: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
8090: 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 20 20 *password.
80a0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 = NULL;. T
80b0: 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 20 20 20 cl_Obj *vcmd.
80c0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
80d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 Tcl_DString upp
80e0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
80f0: 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e tion, upperChann
8100: 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 elBlocking, uppe
8110: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
8120: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f , upperChannelEO
8130: 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 FChar;. int i
8140: 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 dx, len;. int
8150: 20 66 6c 61 67 73 09 09 20 20 20 20 20 20 20 20 flags..
8160: 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a = TLS_TCL_INIT;.
8170: 20 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 int server..
8180: 20 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 = 0;./*
8190: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e is connection in
81a0: 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 coming or outgoi
81b0: 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 ng? */. char
81c0: 2a 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 *keyfile.
81d0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
81e0: 72 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20 20 r *certfile.
81f0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
8200: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
8210: 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ey .= NULL;.
8220: 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20 20 int key_len
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 = 0
8240: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ;. unsigned c
8250: 68 61 72 20 2a 63 65 72 74 20 20 20 20 20 20 20 har *cert
8260: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e = NULL;. in
8270: 74 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 t cert_len
8280: 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 = 0;.
8290: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 char *ciphers
82a0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
82b0: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 . char *ciphe
82c0: 72 73 75 69 74 65 73 09 20 20 20 20 20 20 20 20 rsuites.
82d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
82e0: 20 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 *CAfile.
82f0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
8300: 72 20 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 r *CAdir..
8310: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 = NULL;. ch
8320: 61 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 ar *DHparams.
8330: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
8340: 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 char *model..
8350: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
8360: 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 char *serverna
8370: 6d 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c me. = NUL
8380: 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 L;./* hostname f
8390: 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 or Server Name I
83a0: 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 ndication */.
83b0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
83c0: 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 char *session_id
83d0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
83e0: 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 _Obj *alpn..= NU
83f0: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 LL;. int ssl2
8400: 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a = 0, ssl3 = 0;.
8410: 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 int tls1 = 1
8420: 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c , tls1_1 = 1, tl
8430: 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 s1_2 = 1, tls1_3
8440: 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 = 1;. int pr
8450: 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d oto = 0, level =
8460: 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 -1;. int ver
8470: 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 ify = 0, require
8480: 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 = 0, request =
8490: 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 1, post_handshak
84a0: 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 e = 0;.. dpri
84b0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
84c0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
84d0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
84e0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
84f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8500: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 SSL2) && !define
8510: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 d(NO_SSL2) && de
8520: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
8530: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 & defined(NO_TLS
8540: 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 1) && defined(NO
8550: 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66 69 _TLS1_1) && defi
8560: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 ned(NO_TLS1_2) &
8570: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 & defined(NO_TLS
8580: 31 5f 33 29 0a 20 20 20 20 73 73 6c 32 20 3d 20 1_3). ssl2 =
8590: 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 1;.#endif.#if !d
85a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
85b0: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
85c0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 ned(NO_SSL3) &&
85d0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
85e0: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 && defined(NO_T
85f0: 4c 53 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 LS1) && defined(
8600: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 NO_TLS1_1) && de
8610: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
8620: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 && defined(NO_T
8630: 4c 53 31 5f 33 29 0a 20 20 20 20 73 73 6c 33 20 LS1_3). ssl3
8640: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 1;.#endif.#if
8650: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
8660: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
8670: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 SSL_NO_TLS1).
8680: 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 tls1 = 0;.#endi
8690: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
86a0: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
86b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
86c0: 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f LS1_1). tls1_
86d0: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 1 = 0;.#endif.#i
86e0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
86f0: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
8700: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
8710: 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 2). tls1_2 =
8720: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
8730: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
8740: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
8750: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
8760: 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 tls1_3 = 0;.#
8770: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f endif.. if (o
8780: 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f bjc < 2) {..Tcl_
8790: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
87a0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
87b0: 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f hannel ?options?
87c0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
87d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
87e0: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
87f0: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d r();.. chan =
8800: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
8810: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
8820: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
8830: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c v[1], NULL), NUL
8840: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
8850: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
8860: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
8870: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
8880: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
8890: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
88a0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
88b0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
88c0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
88d0: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 hannel(chan);..
88e0: 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b for (idx = 2;
88f0: 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 idx < objc; idx
8900: 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 ++) {..char *opt
8910: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
8920: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 FromObj(objv[idx
8930: 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 ], NULL);...if (
8940: 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 opt[0] != '-')..
8950: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 break;...OPT
8960: 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 OBJ("-alpn", alp
8970: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 n);..OPTSTR("-ca
8980: 64 69 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f dir", CAdir);..O
8990: 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c PTSTR("-cafile",
89a0: 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42 59 CAfile);..OPTBY
89b0: 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 TE("-cert", cert
89c0: 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 , cert_len);..OP
89d0: 54 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 TSTR("-certfile"
89e0: 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 , certfile);..OP
89f0: 54 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 TSTR("-cipher",
8a00: 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 ciphers);..OPTST
8a10: 52 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 R("-ciphers", ci
8a20: 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 phers);..OPTSTR(
8a30: 22 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c "-ciphersuites",
8a40: 20 63 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a ciphersuites);.
8a50: 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e .OPTOBJ("-comman
8a60: 64 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 d", script);..OP
8a70: 54 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 TSTR("-dhparams"
8a80: 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 , DHparams);..OP
8a90: 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 TBYTE("-key", ke
8aa0: 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 y, key_len);..OP
8ab0: 54 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c TSTR("-keyfile",
8ac0: 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 keyfile);..OPTS
8ad0: 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 TR("-model", mod
8ae0: 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 el);..OPTOBJ("-p
8af0: 61 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f assword", passwo
8b00: 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d rd);..OPTBOOL("-
8b10: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c post_handshake",
8b20: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 post_handshake)
8b30: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 ;..OPTBOOL("-req
8b40: 75 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b uest", request);
8b50: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 ..OPTBOOL("-requ
8b60: 69 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a ire", require);.
8b70: 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 .OPTINT("-securi
8b80: 74 79 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 tylevel", level)
8b90: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 ;..OPTBOOL("-ser
8ba0: 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 ver", server);..
8bb0: 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e OPTSTR("-servern
8bc0: 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 ame", servername
8bd0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 );..OPTSTR("-ses
8be0: 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f sion_id", sessio
8bf0: 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 n_id);..OPTBOOL(
8c00: 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a "-ssl2", ssl2);.
8c10: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 .OPTBOOL("-ssl3"
8c20: 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f , ssl3);..OPTBOO
8c30: 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 L("-tls1", tls1)
8c40: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
8c50: 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 1.1", tls1_1);..
8c60: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 OPTBOOL("-tls1.2
8c70: 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 ", tls1_2);..OPT
8c80: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 BOOL("-tls1.3",
8c90: 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a tls1_3);..OPTOBJ
8ca0: 28 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 ("-validatecomma
8cb0: 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 nd", vcmd);..OPT
8cc0: 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d OBJ("-vcmd", vcm
8cd0: 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 d);...OPTBAD("op
8ce0: 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d tion", "-alpn, -
8cf0: 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 cadir, -cafile,
8d00: 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 -cert, -certfile
8d10: 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 , -cipher, -ciph
8d20: 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 ersuites, -comma
8d30: 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d nd, -dhparams, -
8d40: 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d key, -keyfile, -
8d50: 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 model, -password
8d60: 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b , -post_handshak
8d70: 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 e, -request, -re
8d80: 71 75 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79 quire, -security
8d90: 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 level, -server,
8da0: 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 -servername, -se
8db0: 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c ssion_id, -ssl2,
8dc0: 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d -ssl3, -tls1, -
8dd0: 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c tls1.1, -tls1.2,
8de0: 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 -tls1.3, or -va
8df0: 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b lidatecommand");
8e00: 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
8e10: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
8e20: 66 20 28 72 65 71 75 65 73 74 29 09 09 76 65 72 f (request)..ver
8e30: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
8e40: 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 Y_CLIENT_ONCE |
8e50: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b SSL_VERIFY_PEER;
8e60: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 . if (request
8e70: 20 26 26 20 72 65 71 75 69 72 65 29 09 76 65 72 && require).ver
8e80: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
8e90: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 Y_FAIL_IF_NO_PEE
8ea0: 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 R_CERT;. if (
8eb0: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f request && post_
8ec0: 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 handshake).verif
8ed0: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
8ee0: 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a POST_HANDSHAKE;.
8ef0: 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d if (verify =
8f00: 3d 20 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 = 0)..verify = S
8f10: 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a SL_VERIFY_NONE;.
8f20: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 . proto |= (s
8f30: 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f sl2 ? TLS_PROTO_
8f40: 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 SSL2 : 0);. p
8f50: 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 roto |= (ssl3 ?
8f60: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a TLS_PROTO_SSL3 :
8f70: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
8f80: 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 = (tls1 ? TLS_PR
8f90: 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 OTO_TLS1 : 0);.
8fa0: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 proto |= (tls
8fb0: 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 1_1 ? TLS_PROTO_
8fc0: 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 TLS1_1 : 0);.
8fd0: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f proto |= (tls1_
8fe0: 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 2 ? TLS_PROTO_TL
8ff0: 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 S1_2 : 0);. p
9000: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 roto |= (tls1_3
9010: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 ? TLS_PROTO_TLS1
9020: 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a _3 : 0);.. /*
9030: 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 reset to NULL i
9040: 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 f blank string p
9050: 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 rovided */. i
9060: 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 f (cert && !*cer
9070: 74 29 09 09 20 20 20 20 20 20 20 20 63 65 72 74 t).. cert
9080: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
9090: 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 . if (key &&
90a0: 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 !*key)..
90b0: 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 key. = NU
90c0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 LL;. if (cert
90d0: 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 file && !*certfi
90e0: 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 72 74 le) cert
90f0: 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 file.= NULL;.
9100: 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 if (keyfile &&
9110: 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 !*keyfile)..keyf
9120: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ile. = NU
9130: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 LL;. if (ciph
9140: 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 ers && !*ciphers
9150: 29 09 20 20 20 20 20 20 20 20 63 69 70 68 65 72 ). cipher
9160: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c s. = NULL
9170: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 ;. if (cipher
9180: 73 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 suites && !*ciph
9190: 65 72 73 75 69 74 65 73 29 20 63 69 70 68 65 72 ersuites) cipher
91a0: 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c suites = NULL
91b0: 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 ;. if (CAfile
91c0: 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 && !*CAfile).
91d0: 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 CAfile.
91e0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
91f0: 20 69 66 20 28 43 41 64 69 72 20 26 26 20 21 2a if (CAdir && !*
9200: 43 41 64 69 72 29 09 20 20 20 20 20 20 20 20 43 CAdir). C
9210: 41 64 69 72 09 20 20 20 20 20 20 20 20 3d 20 4e Adir. = N
9220: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 ULL;. if (DHp
9230: 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 arams && !*DHpar
9240: 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70 ams). DHp
9250: 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e arams = N
9260: 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 ULL;.. /* new
9270: 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 SSL state */.
9280: 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 statePtr..= (S
9290: 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 tate *) ckalloc(
92a0: 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f (unsigned) sizeo
92b0: 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d f(State));. m
92c0: 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 emset(statePtr,
92d0: 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 0, sizeof(State)
92e0: 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 );.. statePtr
92f0: 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b ->flags.= flags;
9300: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 . statePtr->i
9310: 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a nterp.= interp;.
9320: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 statePtr->vf
9330: 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 lags.= verify;.
9340: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 statePtr->err
9350: 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 .= "";.. /* a
9360: 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a llocate script *
9370: 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 /. if (script
9380: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f ) {..(void) Tcl_
9390: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
93a0: 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a (script, &len);.
93b0: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 .if (len) {..
93c0: 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 statePtr->callb
93d0: 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 ack = script;..
93e0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
93f0: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 unt(statePtr->ca
9400: 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 llback);..}.
9410: 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 }.. /* alloca
9420: 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 te password */.
9430: 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 if (password)
9440: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 {..(void) Tcl_G
9450: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
9460: 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b password, &len);
9470: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 ..if (len) {..
9480: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 statePtr->pass
9490: 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b word = password;
94a0: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
94b0: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
94c0: 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 >password);..}.
94d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
94e0: 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 ocate validate c
94f0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 ommand */. if
9500: 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 (vcmd) {..(void
9510: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
9520: 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 romObj(vcmd, &le
9530: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
9540: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 . statePtr->v
9550: 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 cmd = vcmd;..
9560: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
9570: 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 t(statePtr->vcmd
9580: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
9590: 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 if (model != NU
95a0: 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b LL) {..int mode;
95b0: 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f ../* Get the "mo
95c0: 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a del" context */.
95d0: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 .chan = Tcl_GetC
95e0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d hannel(interp, m
95f0: 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 odel, &mode);..i
9600: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
9610: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
9620: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
9630: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
9640: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
9650: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
9660: 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 *.. * Make sure
9670: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
9680: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
9690: 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 l.. */..chan = T
96a0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
96b0: 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c (chan);..if (Tcl
96c0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
96d0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
96e0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 nnelType()) {..
96f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
9700: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
9710: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
9720: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
9730: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e (chan),..."\": n
9740: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
9750: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 ", NULL);.. T
9760: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
9770: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
9780: 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 IMPORT", "CHANNE
9790: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 L", "INVALID", (
97a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
97b0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
97c0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
97d0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
97e0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 _ERROR;..}..ctx
97f0: 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f = ((State *)Tcl_
9800: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
9810: 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 ceData(chan))->c
9820: 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b tx;. } else {
9830: 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43 54 58 ..if ((ctx = CTX
9840: 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20 _Init(statePtr,
9850: 73 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b server, proto, k
9860: 65 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 eyfile, certfile
9870: 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 6b 65 79 , key, cert, key
9880: 5f 6c 65 6e 2c 0a 09 20 20 20 20 63 65 72 74 5f _len,.. cert_
9890: 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 69 len, CAdir, CAfi
98a0: 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 le, ciphers, cip
98b0: 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c hersuites, level
98c0: 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 , DHparams)) ==
98d0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 NULL) {.. Tls
98e0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
98f0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
9900: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
9910: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 ..}. }.. s
9920: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 tatePtr->ctx = c
9930: 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 tx;.. /*.
9940: 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 * We need to ma
9950: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 ke sure that the
9960: 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 channel works i
9970: 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 n binary (for th
9980: 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 e. * encrypt
9990: 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 ion not to get g
99a0: 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 oofed up)..
99b0: 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 * We only want t
99c0: 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 o adjust the buf
99d0: 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 fering in pre-v2
99e0: 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 channels, where
99f0: 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 . * each cha
9a00: 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 nnel in the stac
9a10: 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 k maintained its
9a20: 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 own buffers..
9a30: 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 */. Tcl_DS
9a40: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
9a50: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
9a60: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 on);. Tcl_DSt
9a70: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
9a80: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b hannelBlocking);
9a90: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
9aa0: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
9ab0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 elEOFChar);.
9ac0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
9ad0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
9ae0: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f oding);. Tcl_
9af0: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
9b00: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
9b10: 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 -eofchar", &uppe
9b20: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
9b30: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
9b40: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
9b50: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 p, chan, "-encod
9b60: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e ing", &upperChan
9b70: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 nelEncoding);.
9b80: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
9b90: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
9ba0: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 han, "-translati
9bb0: 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e on", &upperChann
9bc0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
9bd0: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e Tcl_GetChann
9be0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
9bf0: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e chan, "-blockin
9c00: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 g", &upperChanne
9c10: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 lBlocking);.
9c20: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
9c30: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
9c40: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
9c50: 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 ", "binary");.
9c60: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
9c70: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
9c80: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 han, "-blocking"
9c90: 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 , "true");. d
9ca0: 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e printf("Consumin
9cb0: 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 g Tcl channel %s
9cc0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
9cd0: 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 lName(chan));.
9ce0: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 statePtr->self
9cf0: 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e = Tcl_StackChan
9d00: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f nel(interp, Tls_
9d10: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 ChannelType(), (
9d20: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
9d30: 65 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 ePtr, (TCL_READA
9d40: 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 BLE | TCL_WRITAB
9d50: 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 LE), chan);.
9d60: 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 dprintf("Created
9d70: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 channel named %
9d80: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e s", Tcl_GetChann
9d90: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
9da0: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 >self));. if
9db0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 (statePtr->self
9dc0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
9dd0: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a NULL) {../*.. *
9de0: 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 No use of Tcl_E
9df0: 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 ventuallyFree be
9e00: 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c cause no possibl
9e10: 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a e Tcl_Preserve..
9e20: 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 . */..Tls_Free((
9e30: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
9e40: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
9e50: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
9e60: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
9e70: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 ption(interp, st
9e80: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d atePtr->self, "-
9e90: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 translation", Tc
9ea0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
9eb0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
9ec0: 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 slation));. T
9ed0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
9ee0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
9ef0: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e ePtr->self, "-en
9f00: 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 coding", Tcl_DSt
9f10: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
9f20: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
9f30: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
9f40: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
9f50: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
9f60: 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 lf, "-eofchar",
9f70: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
9f80: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f (&upperChannelEO
9f90: 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c FChar));. Tcl
9fa0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
9fb0: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
9fc0: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 tr->self, "-bloc
9fd0: 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 king", Tcl_DStri
9fe0: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
9ff0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b annelBlocking));
a000: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
a010: 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 SSL Initializati
a020: 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 on. */. s
a030: 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 tatePtr->ssl = S
a040: 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d SL_new(statePtr-
a050: 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 >ctx);. if (!
a060: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b statePtr->ssl) {
a070: 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 ../* SSL library
a080: 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 error */..Tcl_A
a090: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
a0a0: 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f rp, "couldn't co
a0b0: 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 nstruct ssl sess
a0c0: 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 ion: ", REASON()
a0d0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
a0e0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
a0f0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
a100: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
a110: 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 "INIT", "FAILED
a120: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
a130: 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 );..Tls_Free((ch
a140: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
a150: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
a160: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
a170: 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 * Set host serve
a180: 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 r name */. if
a190: 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a (servername) {.
a1a0: 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 ./* Sets the ser
a1b0: 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 ver name indicat
a1c0: 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 ion (SNI) in Cli
a1d0: 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 entHello extensi
a1e0: 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 on */../* Per RF
a1f0: 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 C 6066, hostname
a200: 20 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f is a ASCII enco
a210: 64 65 64 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 09 ded string. */..
a220: 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 if (!SSL_set_tls
a230: 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 ext_host_name(st
a240: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 atePtr->ssl, ser
a250: 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 vername) && requ
a260: 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f ire) {.. Tcl_
a270: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
a280: 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c erp, "setting TL
a290: 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 S host name exte
a2a0: 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 nsion failed", (
a2b0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
a2c0: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
a2d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
a2e0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 S", "IMPORT", "S
a2f0: 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 NI", "FAILED", (
a300: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
a310: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
a320: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
a330: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
a340: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
a350: 43 6f 6e 66 69 67 75 72 65 20 73 65 72 76 65 72 Configure server
a360: 20 68 6f 73 74 20 6e 61 6d 65 20 63 68 65 63 6b host name check
a370: 73 20 69 6e 20 74 68 65 20 53 53 4c 20 63 6c 69 s in the SSL cli
a380: 65 6e 74 2e 20 53 65 74 20 44 4e 53 20 68 6f 73 ent. Set DNS hos
a390: 74 6e 61 6d 65 20 74 6f 0a 09 20 20 20 6e 61 6d tname to.. nam
a3a0: 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 e for peer certi
a3b0: 66 69 63 61 74 65 20 63 68 65 63 6b 73 2e 20 53 ficate checks. S
a3c0: 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 68 61 73 SL_set1_host has
a3d0: 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f limitations. */
a3e0: 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f ..if (!SSL_add1_
a3f0: 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 host(statePtr->s
a400: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 sl, servername))
a410: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
a420: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
a430: 20 22 73 65 74 74 69 6e 67 20 44 4e 53 20 68 6f "setting DNS ho
a440: 73 74 20 6e 61 6d 65 20 66 61 69 6c 65 64 22 2c st name failed",
a450: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
a460: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
a470: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
a480: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
a490: 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 "HOSTNAME", "FAI
a4a0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
a4b0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
a4c0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
a4d0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
a4e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
a4f0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
a500: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 Resume session i
a510: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 d */. if (ses
a520: 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 sion_id && strle
a530: 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d n(session_id) <=
a540: 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 SSL_MAX_SID_CTX
a550: 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 _LENGTH) {../* S
a560: 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 SL_set_session()
a570: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 */..if (!SSL_SE
a580: 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f SSION_set1_id_co
a590: 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 ntext(SSL_get_se
a5a0: 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e ssion(statePtr->
a5b0: 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 ssl), session_id
a5c0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 , (unsigned int)
a5d0: 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f strlen(session_
a5e0: 69 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c id))) {.. Tcl
a5f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
a600: 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 terp, "Resume se
a610: 73 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 73 ssion id ", sess
a620: 69 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 64 ion_id, " failed
a630: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
a640: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
a650: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
a660: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
a670: 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 , "SESSION", "FA
a680: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
a690: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 NULL);.
a6a0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
a6b0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 retu
a6d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
a6e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
a6f0: 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 alpn) {../* Conv
a700: 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 ert a TCL list i
a710: 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c nto a protocol-l
a720: 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d ist in wire-form
a730: 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 at */..unsigned
a740: 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 char *protos, *p
a750: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 ;..unsigned int
a760: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a protos_len = 0;.
a770: 09 69 6e 74 20 69 2c 20 6c 65 6e 2c 20 63 6e 74 .int i, len, cnt
a780: 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 ;..Tcl_Obj **lis
a790: 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 t;...if (Tcl_Lis
a7a0: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 tObjGetElements(
a7b0: 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 interp, alpn, &c
a7c0: 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43 nt, &list) != TC
a7d0: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 L_OK) {.. Tls
a7e0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
a7f0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
a800: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
a810: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 ..}.../* Determi
a820: 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 ne the memory re
a830: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 quired for the p
a840: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a rotocol-list */.
a850: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c .for (i = 0; i <
a860: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 cnt; i++) {..
a870: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 Tcl_GetStringF
a880: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 romObj(list[i],
a890: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 &len);.. if (
a8a0: 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 len > 255) {...T
a8b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
a8c0: 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 interp, "ALPN pr
a8d0: 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20 otocol name too
a8e0: 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 long", (char *)
a8f0: 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 NULL);...Tcl_Set
a900: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
a910: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
a920: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c ", "ALPN", "FAIL
a930: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
a940: 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 LL);...Tls_Free(
a950: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
a960: 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c r);...return TCL
a970: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 _ERROR;.. }..
a980: 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b protos_len +
a990: 3d 20 31 20 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 = 1 + len;..}...
a9a0: 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d /* Build the com
a9b0: 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c plete protocol-l
a9c0: 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d ist */..protos =
a9d0: 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f ckalloc(protos_
a9e0: 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 len);../* protoc
a9f0: 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 ol-lists consist
aa00: 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 of 8-bit length
aa10: 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 -prefixed, byte
aa20: 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 strings */..for
aa30: 28 69 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 (i = 0, p = prot
aa40: 6f 73 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b os; i < cnt; i++
aa50: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 ) {.. char *s
aa60: 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 tr = Tcl_GetStri
aa70: 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 ngFromObj(list[i
aa80: 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a ], &len);.. *
aa90: 70 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 p++ = len;..
aaa0: 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 6c memcpy(p, str, l
aab0: 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c en);.. p += l
aac0: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f en;..}.../* SSL_
aad0: 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 set_alpn_protos
aae0: 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 makes a copy of
aaf0: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 the protocol-lis
ab00: 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 t */../* Note: T
ab10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 his functions re
ab20: 76 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72 verses the retur
ab30: 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 n value conventi
ab40: 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 on */..if (SSL_s
ab50: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 et_alpn_protos(s
ab60: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 tatePtr->ssl, pr
ab70: 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e otos, protos_len
ab80: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
ab90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
aba0: 70 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73 65 p, "failed to se
abb0: 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 t ALPN protocols
abc0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
abd0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
abe0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
abf0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
ac00: 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 , "ALPN", "FAILE
ac10: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
ac20: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
ac30: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
ac40: 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 Ptr);.. ckfre
ac50: 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 e(protos);..
ac60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
ac70: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 ;..}.../* Store
ac80: 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a protocols list *
ac90: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f /..statePtr->pro
aca0: 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 tos = protos;..s
acb0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f tatePtr->protos_
acc0: 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e len = protos_len
acd0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
ace0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
acf0: 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 = NULL;..stateP
ad00: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d tr->protos_len =
ad10: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 0;. }.. /
ad20: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c *. * SSL Cal
ad30: 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 lbacks. */.
ad40: 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 SSL_set_app_d
ad50: 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ata(statePtr->ss
ad60: 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 l, (void *)state
ad70: 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 Ptr);./* point b
ad80: 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 ack to us */.
ad90: 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 SSL_set_verify(
ada0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 statePtr->ssl, v
adb0: 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c erify, VerifyCal
adc0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f lback);. SSL_
add0: 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 set_info_callbac
ade0: 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c k(statePtr->ssl,
adf0: 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a InfoCallback);.
ae00: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 . /* Create T
ae10: 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 cl_Channel BIO H
ae20: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 andler */. st
ae30: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 atePtr->p_bio.=
ae40: 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 BIO_new_tcl(stat
ae50: 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 ePtr, BIO_NOCLOS
ae60: 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 E);. statePtr
ae70: 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 ->bio.= BIO_new(
ae80: 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 BIO_f_ssl());..
ae90: 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20 7b if (server) {
aea0: 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c ../* Server call
aeb0: 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 backs */..SSL_CT
aec0: 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 X_set_tlsext_ser
aed0: 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 vername_arg(stat
aee0: 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 ePtr->ctx, (void
aef0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 *)statePtr);..S
af00: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 SL_CTX_set_tlsex
af10: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c t_servername_cal
af20: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e lback(statePtr->
af30: 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b ctx, SNICallback
af40: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
af50: 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 client_hello_cb(
af60: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 statePtr->ctx, H
af70: 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 elloCallback, (v
af80: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
af90: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e ..if (statePtr->
afa0: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 protos != NULL)
afb0: 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 {.. SSL_CTX_s
afc0: 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 et_alpn_select_c
afd0: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c b(statePtr->ctx,
afe0: 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 ALPNCallback, (
aff0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
b000: 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e ;.#ifdef USE_NPN
b010: 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32 .. if (tls1_2
b020: 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 == 0 && tls1_3
b030: 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 == 0) {...SSL_CT
b040: 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f X_set_next_proto
b050: 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62 28 s_advertised_cb(
b060: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e statePtr->ctx, N
b070: 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 PNCallback, (voi
b080: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 d *)statePtr);..
b090: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a }.#endif..}.
b0a0: 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 ../* Enable serv
b0b0: 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 er to send cert
b0c0: 72 65 71 75 65 73 74 20 61 66 74 65 72 20 68 61 request after ha
b0d0: 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 ndshake (TLS 1.3
b0e0: 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 only) */../* A
b0f0: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 write operation
b100: 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20 must take place
b110: 66 6f 72 20 74 68 65 20 43 65 72 74 69 66 69 63 for the Certific
b120: 61 74 65 20 52 65 71 75 65 73 74 20 74 6f 20 62 ate Request to b
b130: 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68 e.. sent to th
b140: 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 e client, this c
b150: 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 an be done with
b160: 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 SSL_do_handshake
b170: 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 (). */..if (requ
b180: 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 est && post_hand
b190: 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 shake) {.. SS
b1a0: 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f L_verify_client_
b1b0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 post_handshake(s
b1c0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 tatePtr->ssl);..
b1d0: 7d 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 }.../* Set serve
b1e0: 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 r mode */..state
b1f0: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c Ptr->flags |= TL
b200: 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 S_TCL_SERVER;..S
b210: 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 SL_set_accept_st
b220: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ate(statePtr->ss
b230: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b l);. } else {
b240: 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c ../* Client call
b250: 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 backs */.#ifdef
b260: 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 USE_NPN..if (sta
b270: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d tePtr->protos !=
b280: 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 NULL && tls1_2
b290: 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d == 0 && tls1_3 =
b2a0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f = 0) {.. SSL_
b2b0: 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f CTX_set_next_pro
b2c0: 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 to_select_cb(sta
b2d0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e tePtr->ctx, ALPN
b2e0: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 Callback, (void
b2f0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a *)statePtr);..}.
b300: 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 #endif.../* Sess
b310: 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 ion caching */..
b320: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 SSL_CTX_set_sess
b330: 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 ion_cache_mode(s
b340: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 tatePtr->ctx, SS
b350: 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 L_SESS_CACHE_CLI
b360: 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 ENT | SSL_SESS_C
b370: 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c ACHE_NO_INTERNAL
b380: 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 _STORE);..SSL_CT
b390: 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 X_sess_set_new_c
b3a0: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c b(statePtr->ctx,
b3b0: 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b SessionCallback
b3c0: 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 );.../* Enable p
b3d0: 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 ost handshake Au
b3e0: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 thentication ext
b3f0: 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 ension. TLS 1.3
b400: 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 only, not http/2
b410: 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 . */..if (reques
b420: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 t && post_handsh
b430: 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f ake) {.. SSL_
b440: 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 set_post_handsha
b450: 6b 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 ke_auth(statePtr
b460: 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 ->ssl, 1);..}...
b470: 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f /* Set client mo
b480: 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 de */..SSL_set_c
b490: 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 onnect_state(sta
b4a0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
b4b0: 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 }. SSL_set_b
b4c0: 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c io(statePtr->ssl
b4d0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 , statePtr->p_bi
b4e0: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 o, statePtr->p_b
b4f0: 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 io);. BIO_set
b500: 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 _ssl(statePtr->b
b510: 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 io, statePtr->ss
b520: 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b l, BIO_NOCLOSE);
b530: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
b540: 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a End of SSL Init.
b550: 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 */. dpri
b560: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 ntf("Returning %
b570: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e s", Tcl_GetChann
b580: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
b590: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c >self));. Tcl
b5a0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
b5b0: 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f p, (char *) Tcl_
b5c0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
b5d0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
b5e0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a TCL_VOLATILE);..
b5f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
b600: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d K;..clientData =
b610: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c clientData;.}..
b620: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
b630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
b670: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d UnimportObjCmd -
b680: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
b690: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
b6a0: 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 d to remove the
b6b0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
b6c0: 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 filter.. *. * Re
b6d0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
b6e0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
b6f0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
b700: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 cts:. *.May modi
b710: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 fy the behavior
b720: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c of an IO channel
b730: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
b740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
b780: 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f tatic int.Unimpo
b790: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 rtObjCmd(ClientD
b7a0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
b7b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
b7c0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
b7d0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
b7e0: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
b7f0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
b800: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
b810: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
b820: 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 /.. dprintf("
b830: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
b840: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
b850: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
b860: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
b870: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
b880: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
b890: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 ;. }.. cha
b8a0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
b8b0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
b8c0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d etString(objv[1]
b8d0: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 ), NULL);. if
b8e0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
b8f0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
b900: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
b910: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
b920: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
b930: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
b940: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a most channel */.
b950: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
b960: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
b970: 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c n);.. if (Tcl
b980: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
b990: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
b9a0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
b9b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
b9c0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
b9d0: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
b9e0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
b9f0: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 n),..."\": not a
ba00: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
ba10: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
ba20: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
ba30: 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d rp, "TLS", "UNIM
ba40: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 PORT", "CHANNEL"
ba50: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
ba60: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
ba70: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
ba80: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 }.. if (T
ba90: 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 cl_UnstackChanne
baa0: 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 l(interp, chan)
bab0: 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a == TCL_ERROR) {.
bac0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
bad0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 R;. }.. re
bae0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
baf0: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
bb00: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a tData;.}.../*. *
bb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb50: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e ---. *. * CTX_In
bb60: 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 it -- construct
bb70: 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e a SSL_CTX instan
bb80: 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 ce. *. * Results
bb90: 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c :. *.A valid SSL
bba0: 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 _CTX instance or
bbb0: 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 NULL.. *. * Sid
bbc0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f e effects:. *.co
bbd0: 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e nstructs SSL con
bbe0: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a text (CTX). *. *
bbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc30: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 ---. */.static S
bc40: 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 SL_CTX *.CTX_Ini
bc50: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 t(State *statePt
bc60: 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c r, int isServer,
bc70: 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 int proto, char
bc80: 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 *keyfile, char
bc90: 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 *certfile,. u
bca0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 nsigned char *ke
bcb0: 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 y, unsigned char
bcc0: 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f *cert, int key_
bcd0: 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 len, int cert_le
bce0: 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a n, char *CAdir,.
bcf0: 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 char *CAfile
bd00: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c , char *ciphers,
bd10: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 char *ciphersui
bd20: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 tes, int level,
bd30: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 char *DHparams)
bd40: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 {. Tcl_Interp
bd50: 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 *interp = state
bd60: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
bd70: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 SSL_CTX *ctx =
bd80: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 NULL;. Tcl_DS
bd90: 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 tring ds;. Tc
bda0: 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 l_DString ds1;.
bdb0: 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a int off = 0;.
bdc0: 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 int load_pri
bdd0: 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f vate_key;. co
bde0: 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a nst SSL_METHOD *
bdf0: 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 method;.. dpr
be00: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
be10: 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 . if (!proto)
be20: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
be30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f sult(interp, "no
be40: 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 valid protocol
be50: 73 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 selected", NULL)
be60: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
be70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 }.. /* cr
be80: 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 eate SSL context
be90: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f */.#if OPENSSL_
bea0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e VERSION_NUMBER >
beb0: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c = 0x10100000L ||
bec0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 defined(NO_SSL2
bed0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
bee0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 NSSL_NO_SSL2).
bef0: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
bf00: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 oto, TLS_PROTO_S
bf10: 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 SL2)) {..Tcl_App
bf20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
bf30: 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c , "SSL2 protocol
bf40: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
bf50: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
bf60: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
bf70: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
bf80: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e O_SSL3) || defin
bf90: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
bfa0: 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 L3). if (ENAB
bfb0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
bfc0: 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 ROTO_SSL3)) {..T
bfd0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
bfe0: 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 interp, "SSL3 pr
bff0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
c000: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 rted", NULL);..r
c010: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
c020: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 }.#endif.#if def
c030: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c ined(NO_TLS1) ||
c040: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
c050: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 _NO_TLS1). if
c060: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
c070: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 TLS_PROTO_TLS1)
c080: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
c090: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 esult(interp, "T
c0a0: 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 LS 1.0 protocol
c0b0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
c0c0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
c0d0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
c0e0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
c0f0: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
c100: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
c110: 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 LS1_1). if (E
c120: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
c130: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 S_PROTO_TLS1_1))
c140: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
c150: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
c160: 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.1 protocol n
c170: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
c180: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
c190: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
c1a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
c1b0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e TLS1_2) || defin
c1c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
c1d0: 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e S1_2). if (EN
c1e0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
c1f0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 _PROTO_TLS1_2))
c200: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
c210: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
c220: 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.2 protocol no
c230: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
c240: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
c250: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
c260: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
c270: 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_3) || define
c280: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
c290: 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 1_3). if (ENA
c2a0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
c2b0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b PROTO_TLS1_3)) {
c2c0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
c2d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 lt(interp, "TLS
c2e0: 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 1.3 protocol not
c2f0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
c300: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
c310: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a ;. }.#endif..
c320: 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 switch (prot
c330: 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c o) {.#if OPENSSL
c340: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
c350: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 < 0x10100000L &&
c360: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
c370: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
c380: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
c390: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
c3a0: 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 TO_SSL2:..method
c3b0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 = isServer ? SS
c3c0: 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f Lv2_server_metho
c3d0: 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 d() : SSLv2_clie
c3e0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
c3f0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
c400: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 !defined(NO_SSL3
c410: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
c420: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 ENSSL_NO_SSL3) &
c430: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
c440: 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f SL_NO_SSL3_METHO
c450: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
c460: 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 PROTO_SSL3:..met
c470: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
c480: 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 SSLv3_server_me
c490: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 thod() : SSLv3_c
c4a0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
c4b0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
c4c0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
c4d0: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
c4e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
c4f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
c500: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 ENSSL_NO_TLS1_ME
c510: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 THOD). case T
c520: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 LS_PROTO_TLS1:..
c530: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
c540: 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 r ? TLSv1_server
c550: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 _method() : TLSv
c560: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 1_client_method(
c570: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
c580: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
c590: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
c5a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
c5b0: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
c5c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
c5d0: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_1_METHOD).
c5e0: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
c5f0: 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f O_TLS1_1:..metho
c600: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
c610: 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 LSv1_1_server_me
c620: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 thod() : TLSv1_1
c630: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
c640: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
c650: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
c660: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
c670: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
c680: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
c690: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
c6a0: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 LS1_2_METHOD).
c6b0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
c6c0: 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 _TLS1_2:..method
c6d0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c = isServer ? TL
c6e0: 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 Sv1_2_server_met
c6f0: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f hod() : TLSv1_2_
c700: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
c710: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
c720: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
c730: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
c740: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
c750: 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 LS1_3). case
c760: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
c770: 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 :../* Use the ge
c780: 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 neric method and
c790: 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 constraint rang
c7a0: 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 e after context
c7b0: 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d is created */..m
c7c0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
c7d0: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 ? TLS_server_me
c7e0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 thod() : TLS_cli
c7f0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
c800: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 reak;.#endif.
c810: 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 default:../* Ne
c820: 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20 gotiate highest
c830: 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c available SSL/TL
c840: 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 S version */..me
c850: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
c860: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 ? TLS_server_met
c870: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 hod() : TLS_clie
c880: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 nt_method();.#if
c890: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
c8a0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
c8b0: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 0000L && !define
c8c0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 d(NO_SSL2) && !d
c8d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
c8e0: 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 O_SSL2)..off |=
c8f0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
c900: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 TLS_PROTO_SSL2)
c910: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ? 0 : SSL_OP_N
c920: 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 O_SSLv2);.#endif
c930: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
c940: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
c950: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
c960: 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 L3)..off |= (ENA
c970: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
c980: 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 PROTO_SSL3) ?
c990: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 0 : SSL_OP_NO_SS
c9a0: 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 Lv3);.#endif.#if
c9b0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
c9c0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
c9d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a PENSSL_NO_TLS1).
c9e0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
c9f0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
ca00: 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 O_TLS1) ? 0 :
ca10: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 SSL_OP_NO_TLSv1)
ca20: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
ca30: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
ca40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
ca50: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a NSSL_NO_TLS1_1).
ca60: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
ca70: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
ca80: 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 O_TLS1_1) ? 0 :
ca90: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f SSL_OP_NO_TLSv1_
caa0: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 1);.#endif.#if !
cab0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
cac0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
cad0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
cae0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
caf0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
cb00: 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 OTO_TLS1_2) ? 0
cb10: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
cb20: 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 1_2);.#endif.#if
cb30: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
cb40: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
cb50: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
cb60: 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 _3)..off |= (ENA
cb70: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
cb80: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 PROTO_TLS1_3) ?
cb90: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 0 : SSL_OP_NO_TL
cba0: 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 Sv1_3);.#endif..
cbb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 break;. }..
cbc0: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
cbd0: 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 r();.. ctx =
cbe0: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 SSL_CTX_new(meth
cbf0: 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74 od);. if (!ct
cc00: 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c x) {..return(NUL
cc10: 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 L);. }.. i
cc20: 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 f (getenv(SSLKEY
cc30: 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c LOGFILE)) {..SSL
cc40: 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f _CTX_set_keylog_
cc50: 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 callback(ctx, Ke
cc60: 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 yLogCallback);.
cc70: 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e }..#if !defin
cc80: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 ed(NO_TLS1_3) &&
cc90: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
cca0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
ccb0: 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c if (proto == TL
ccc0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 S_PROTO_TLS1_3)
ccd0: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d {..SSL_CTX_set_m
cce0: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e in_proto_version
ccf0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 (ctx, TLS1_3_VER
cd00: 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f SION);..SSL_CTX_
cd10: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 set_max_proto_ve
cd20: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f rsion(ctx, TLS1_
cd30: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 3_VERSION);.
cd40: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a }.#endif.. /*
cd50: 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 Force cipher se
cd60: 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 lection order by
cd70: 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 server */. i
cd80: 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a f (!isServer) {.
cd90: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 .SSL_CTX_set_opt
cda0: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 ions(ctx, SSL_OP
cdb0: 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 _CIPHER_SERVER_P
cdc0: 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 REFERENCE);.
cdd0: 7d 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 }.. SSL_CTX_s
cde0: 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c et_app_data(ctx,
cdf0: 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b (void*)interp);
ce00: 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 ./* remember the
ce10: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a interpreter */.
ce20: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
ce30: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c options(ctx, SSL
ce40: 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c _OP_ALL);./* all
ce50: 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f SSL bug workaro
ce60: 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f unds */. SSL_
ce70: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
ce80: 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 ctx, off);../* d
ce90: 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 isable protocol
cea0: 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 versions */.#if
ceb0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
cec0: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 NUMBER < 0x10101
ced0: 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 000L. SSL_CTX
cee0: 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 _set_mode(ctx, S
cef0: 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 SL_MODE_AUTO_RET
cf00: 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e RY);./* handle n
cf10: 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e ew handshakes in
cf20: 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 background. On
cf30: 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 by default in Op
cf40: 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a enSSL 1.1.1. */.
cf50: 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 #endif. SSL_C
cf60: 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 TX_sess_set_cach
cf70: 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 e_size(ctx, 128)
cf80: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 ;.. /* Set us
cf90: 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 er defined ciphe
cfa0: 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 rs, cipher suite
cfb0: 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 s, and security
cfc0: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 level */. if
cfd0: 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c ((ciphers != NUL
cfe0: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 L) && !SSL_CTX_s
cff0: 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 et_cipher_list(c
d000: 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a tx, ciphers)) {.
d010: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
d020: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 t(interp, "Set c
d030: 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e iphers failed: N
d040: 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 o valid ciphers"
d050: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
d060: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
d070: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ctx);..return NU
d080: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
d090: 20 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 ((ciphersuites
d0a0: 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c != NULL) && !SSL
d0b0: 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 _CTX_set_ciphers
d0c0: 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 uites(ctx, ciphe
d0d0: 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c rsuites)) {..Tcl
d0e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d0f0: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 terp, "Set ciphe
d100: 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a r suites failed:
d110: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 No valid cipher
d120: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c s", (char *) NUL
d130: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
d140: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
d150: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
d160: 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 /* Set security
d170: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 level */. if
d180: 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 (level > -1 &&
d190: 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a level < 6) {../*
d1a0: 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 SSL_set_securit
d1b0: 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f y_level */..SSL_
d1c0: 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 CTX_set_security
d1d0: 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 _level(ctx, leve
d1e0: 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f l);. }.. /
d1f0: 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 * set some callb
d200: 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f acks */. SSL_
d210: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
d220: 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 passwd_cb(ctx, P
d230: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 asswordCallback)
d240: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 ;. SSL_CTX_se
d250: 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 t_default_passwd
d260: 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 _cb_userdata(ctx
d270: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
d280: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 tr);.. /* rea
d290: 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d d a Diffie-Hellm
d2a0: 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 an parameters fi
d2b0: 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 le, or use the b
d2c0: 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 uilt-in one */.#
d2d0: 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f ifdef OPENSSL_NO
d2e0: 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 _DH. if (DHpa
d2f0: 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a rams != NULL) {.
d300: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
d310: 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 t(interp, "DH pa
d320: 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 rameter support
d330: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 not available",
d340: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
d350: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
d360: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c x);..return NULL
d370: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 ;. }.#else.
d380: 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 {..DH* dh;..if
d390: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 (DHparams != NU
d3a0: 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a LL) {.. BIO *
d3b0: 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 bio;.. Tcl_DS
d3c0: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a tringInit(&ds);.
d3d0: 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e . bio = BIO_n
d3e0: 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 ew_file(F2N(DHpa
d3f0: 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 rams, &ds), "r")
d400: 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 ;.. if (!bio)
d410: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 {...Tcl_DString
d420: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c Free(&ds);...Tcl
d430: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d440: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 terp, "Could not
d450: 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 find DH paramet
d460: 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 ers file", (char
d470: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
d480: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
d490: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
d4a0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d }... dh =
d4b0: 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 PEM_read_bio_DH
d4c0: 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c params(bio, NULL
d4d0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 , NULL, NULL);..
d4e0: 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f BIO_free(bio
d4f0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 );.. Tcl_DStr
d500: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
d510: 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 if (!dh) {...
d520: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d530: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 (interp, "Could
d540: 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61 not read DH para
d550: 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 meters from file
d560: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
d570: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 );...SSL_CTX_fre
d580: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e e(ctx);...return
d590: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d NULL;.. }..}
d5a0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 68 20 else {.. dh
d5b0: 3d 20 67 65 74 5f 64 68 50 61 72 61 6d 73 28 29 = get_dhParams()
d5c0: 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 ;..}..SSL_CTX_se
d5d0: 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 t_tmp_dh(ctx, dh
d5e0: 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 29 3b );..DH_free(dh);
d5f0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 . }.#endif..
d600: 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 /* set our ce
d610: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 rtificate */.
d620: 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 load_private_ke
d630: 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 y = 0;. if (c
d640: 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 ertfile != NULL)
d650: 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 {..load_private
d660: 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f _key = 1;...Tcl_
d670: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
d680: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f ;...if (SSL_CTX_
d690: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f use_certificate_
d6a0: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 file(ctx, F2N(ce
d6b0: 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 rtfile, &ds), SS
d6c0: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 L_FILETYPE_PEM)
d6d0: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c <= 0) {.. Tcl
d6e0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
d6f0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 );.. Tcl_Appe
d700: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
d710: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
d720: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 certificate file
d730: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a ", certfile, ":
d740: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 ",.... REAS
d750: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
d760: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
d770: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
d780: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
d790: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 .}. } else if
d7a0: 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 (cert != NULL)
d7b0: 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f {..load_private_
d7c0: 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 key = 1;..if (SS
d7d0: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 L_CTX_use_certif
d7e0: 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 icate_ASN1(ctx,
d7f0: 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 cert_len, cert)
d800: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c <= 0) {.. Tcl
d810: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
d820: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 );.. Tcl_Appe
d830: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
d840: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
d850: 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a certificate: ",.
d860: 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 ... REASON()
d870: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
d880: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
d890: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
d8a0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 eturn NULL;..}.
d8b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 } else {..cer
d8c0: 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 tfile = (char*)X
d8d0: 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 509_get_default_
d8e0: 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 cert_file();...i
d8f0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
d900: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 ertificate_file(
d910: 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 ctx, certfile, S
d920: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 SL_FILETYPE_PEM)
d930: 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 <= 0) {.#if 0..
d940: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
d950: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 ree(&ds);.. T
d960: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d970: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
d980: 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 to use default c
d990: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 ertificate file
d9a0: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 ", certfile, ":
d9b0: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f ",.... REASO
d9c0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
d9d0: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
d9e0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
d9f0: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 return NULL;.#
da00: 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a endif..}. }..
da10: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 /* set our p
da20: 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 rivate key */.
da30: 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 if (load_priva
da40: 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b te_key) {..if (k
da50: 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 eyfile == NULL &
da60: 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b & key == NULL) {
da70: 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 .. keyfile =
da80: 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 certfile;..}...i
da90: 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 f (keyfile != NU
daa0: 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 LL) {.. /* ge
dab0: 74 20 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 t the private ke
dac0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 y associated wit
dad0: 68 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61 h this certifica
dae0: 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b te */.. if (k
daf0: 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 eyfile == NULL)
db00: 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 {...keyfile = ce
db10: 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a rtfile;.. }..
db20: 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 . if (SSL_CTX
db30: 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f _use_PrivateKey_
db40: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 file(ctx, F2N(ke
db50: 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c yfile, &ds), SSL
db60: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c _FILETYPE_PEM) <
db70: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 = 0) {...Tcl_DSt
db80: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
db90: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 ./* flush the pa
dba0: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d ssphrase which m
dbb0: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 ight be left in
dbc0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 the result */...
dbd0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
dbe0: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f terp, NULL, TCL_
dbf0: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 STATIC);...Tcl_A
dc00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
dc10: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
dc20: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 et public key fi
dc30: 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 le ", keyfile, "
dc40: 20 22 2c 0a 09 09 09 20 20 20 20 20 20 20 20 20 ",....
dc50: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
dc60: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f *) NULL);...SSL_
dc70: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
dc80: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 .return NULL;..
dc90: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
dca0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
dcb0: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 ..} else if (key
dcc0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
dcd0: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 if (SSL_CTX_use
dce0: 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 _PrivateKey_ASN1
dcf0: 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 (EVP_PKEY_RSA, c
dd00: 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 tx, key,key_len)
dd10: 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 <= 0) {...Tcl_D
dd20: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
dd30: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 .../* flush the
dd40: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 passphrase which
dd50: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 might be left i
dd60: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a n the result */.
dd70: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 ..Tcl_SetResult(
dd80: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 interp, NULL, TC
dd90: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c L_STATIC);...Tcl
dda0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
ddb0: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
ddc0: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a set public key:
ddd0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 ", REASON(), (c
dde0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
ddf0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
de00: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
de10: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 ;.. }..}../*
de20: 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 Now we know that
de30: 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 a key and cert
de40: 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 have been set ag
de50: 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 ainst.. * the SS
de60: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 L context */..if
de70: 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b (!SSL_CTX_check
de80: 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 _private_key(ctx
de90: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
dea0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
deb0: 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 p, "private key
dec0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 does not match t
ded0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 70 he certificate p
dee0: 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 ublic key",....
def0: 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (char *) NUL
df00: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
df10: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
df20: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d return NULL;..}
df30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
df40: 65 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 et verification
df50: 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 CAs */. Tcl_D
df60: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b StringInit(&ds);
df70: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
df80: 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20 Init(&ds1);.
df90: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 if (!SSL_CTX_loa
dfa0: 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f d_verify_locatio
dfb0: 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 ns(ctx, F2N(CAfi
dfc0: 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 le, &ds), F2N(CA
dfd0: 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 dir, &ds1)) ||..
dfe0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 !SSL_CTX_set_def
dff0: 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 ault_verify_path
e000: 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a s(ctx)) {.#if 0.
e010: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
e020: 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 (&ds);..Tcl_DStr
e030: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 ingFree(&ds1);..
e040: 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 /* Don't current
e050: 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20 ly care if this
e060: 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 fails */..Tcl_Ap
e070: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
e080: 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 p, "SSL default
e090: 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c verify paths: ",
e0a0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
e0b0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f *) NULL);..SSL_
e0c0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
e0d0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e return NULL;.#en
e0e0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f dif. }.. /
e0f0: 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 * https://source
e100: 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f forge.net/p/tls/
e110: 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 20 bugs/57/ */.
e120: 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 /* XXX:TODO: Let
e130: 20 74 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 the user supply
e140: 20 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 values here ins
e150: 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e tead of somethin
e160: 67 20 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e g that exists on
e170: 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 the filesystem
e180: 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c */. if (CAfil
e190: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53 54 e != NULL) {..ST
e1a0: 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 ACK_OF(X509_NAME
e1b0: 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 ) *certNames = S
e1c0: 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 SL_load_client_C
e1d0: 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c A_file(F2N(CAfil
e1e0: 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 20 28 63 e, &ds));..if (c
e1f0: 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c ertNames != NULL
e200: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 ) {.. SSL_CTX
e210: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c _set_client_CA_l
e220: 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d ist(ctx, certNam
e230: 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 es);..}. }..
e240: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
e250: 65 65 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c ee(&ds);. Tcl
e260: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
e270: 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 1);. return c
e280: 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d tx;.}.../*. *---
e290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e2d0: 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a . *. * StatusObj
e2e0: 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 Cmd -- return ce
e2f0: 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f rtificate for co
e300: 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a nnected peer.. *
e310: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
e320: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
e330: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
e340: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
e350: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
e360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
e3a0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 .static int.Stat
e3b0: 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 usObjCmd(ClientD
e3c0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
e3d0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
e3e0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
e3f0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
e400: 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65 v[]) {. State
e410: 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 *statePtr;.
e420: 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 X509 *peer;.
e430: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
e440: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
e450: 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 chan;. char
e460: 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 *channelName, *c
e470: 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 iphers;. int
e480: 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 mode;. const
e490: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
e4a0: 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e roto;. unsign
e4b0: 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 ed int len;.
e4c0: 69 6e 74 20 6e 69 64 3b 0a 0a 20 20 20 20 64 70 int nid;.. dp
e4d0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
e4e0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 6f 62 .. switch (ob
e4f0: 6a 63 29 20 7b 0a 09 63 61 73 65 20 32 3a 0a 09 jc) {..case 2:..
e500: 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 channelName
e510: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
e520: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 romObj(objv[1],
e530: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 NULL);.. brea
e540: 6b 3b 0a 0a 09 63 61 73 65 20 33 3a 0a 09 20 20 k;...case 3:..
e550: 20 20 69 66 20 28 21 73 74 72 63 6d 70 20 28 54 if (!strcmp (T
e560: 63 6c 5f 47 65 74 53 74 72 69 6e 67 20 28 6f 62 cl_GetString (ob
e570: 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 jv[1]), "-local"
e580: 29 29 20 7b 0a 09 09 63 68 61 6e 6e 65 6c 4e 61 )) {...channelNa
e590: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 me = Tcl_GetStri
e5a0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 ngFromObj(objv[2
e5b0: 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 09 62 72 65 61 ], NULL);...brea
e5c0: 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2f k;.. }.. /
e5d0: 2a 20 65 6c 73 65 20 66 61 6c 6c 2d 74 68 72 6f * else fall-thro
e5e0: 75 67 68 20 2e 2e 2e 20 2a 2f 0a 23 69 66 20 64 ugh ... */.#if d
e5f0: 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 efined(__GNUC__)
e600: 0a 09 20 20 20 20 5f 5f 61 74 74 72 69 62 75 74 .. __attribut
e610: 65 5f 5f 28 28 66 61 6c 6c 74 68 72 6f 75 67 68 e__((fallthrough
e620: 29 29 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 ));.#endif..defa
e630: 75 6c 74 3a 0a 09 20 20 20 20 54 63 6c 5f 57 72 ult:.. Tcl_Wr
e640: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
e650: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c p, 1, objv, "?-l
e660: 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b ocal? channel");
e670: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
e680: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
e690: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
e6a0: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
e6b0: 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d channelName, &m
e6c0: 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 ode);. if (ch
e6d0: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
e6e0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
e6f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
e700: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }. /* Make
e710: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
e720: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
e730: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
e740: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
e750: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
e760: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
e770: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
e780: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
e790: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
e7a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
e7b0: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
e7c0: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
e7d0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 elName(chan),...
e7e0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
e7f0: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a hannel", NULL);.
e800: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
e810: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
e820: 20 22 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e "STATUS", "CHAN
e830: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
e840: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
e850: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
e860: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 OR;. }. st
e870: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
e880: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *) Tcl_GetChanne
e890: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
e8a0: 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 an);.. /* Get
e8b0: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 certificate for
e8c0: 20 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f peer or self */
e8d0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d . if (objc ==
e8e0: 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 2) {..peer = SS
e8f0: 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 L_get_peer_certi
e900: 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d ficate(statePtr-
e910: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 >ssl);. } els
e920: 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f e {..peer = SSL_
e930: 67 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 get_certificate(
e940: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
e950: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 65 }. if (pe
e960: 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 er) {..objPtr =
e970: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 Tls_NewX509Obj(i
e980: 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 nterp, peer);..i
e990: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 20 f (objc == 2) {
e9a0: 58 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b X509_free(peer);
e9b0: 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a }. } else {.
e9c0: 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 .objPtr = Tcl_Ne
e9d0: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
e9e0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
e9f0: 20 50 65 65 72 20 63 65 72 74 20 63 68 61 69 6e Peer cert chain
ea00: 20 28 63 6c 69 65 6e 74 20 6f 6e 6c 79 29 20 2a (client only) *
ea10: 2f 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 /. STACK_OF(X
ea20: 35 30 39 29 2a 20 73 73 6c 5f 63 65 72 74 73 20 509)* ssl_certs
ea30: 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 = SSL_get_peer_c
ea40: 65 72 74 5f 63 68 61 69 6e 28 73 74 61 74 65 50 ert_chain(stateP
ea50: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 tr->ssl);. if
ea60: 20 28 21 70 65 65 72 20 26 26 20 28 73 73 6c 5f (!peer && (ssl_
ea70: 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c certs == NULL ||
ea80: 20 73 6b 5f 58 35 30 39 5f 6e 75 6d 28 73 73 6c sk_X509_num(ssl
ea90: 5f 63 65 72 74 73 29 20 3d 3d 20 30 29 29 20 7b _certs) == 0)) {
eaa0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
eab0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
eac0: 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 45 52 , "STATUS", "CER
ead0: 54 49 46 49 43 41 54 45 22 2c 20 28 63 68 61 72 TIFICATE", (char
eae0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
eaf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
eb00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 }.. /* Peer
eb10: 20 6e 61 6d 65 20 66 72 6f 6d 20 63 65 72 74 20 name from cert
eb20: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f */. Tcl_ListO
eb30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
eb40: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
eb50: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
eb60: 28 22 70 65 65 72 6e 61 6d 65 22 2c 20 2d 31 29 ("peername", -1)
eb70: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
eb80: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
eb90: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
eba0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
ebb0: 28 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 (SSL_get0_peerna
ebc0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c me(statePtr->ssl
ebd0: 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 ), -1));.. Tc
ebe0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
ebf0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
ec00: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
ec10: 72 69 6e 67 4f 62 6a 28 22 73 62 69 74 73 22 2c ringObj("sbits",
ec20: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
ec30: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
ec40: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
ec50: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
ec60: 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 j(SSL_get_cipher
ec70: 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e _bits(statePtr->
ec80: 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 ssl, NULL)));..
ec90: 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 ciphers = (ch
eca0: 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 ar*)SSL_get_ciph
ecb0: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c er(statePtr->ssl
ecc0: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 );. if ((ciph
ecd0: 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 ers != NULL) &&
ece0: 28 73 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c (strcmp(ciphers,
ecf0: 20 22 28 4e 4f 4e 45 29 22 29 20 21 3d 20 30 29 "(NONE)") != 0)
ed00: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
ed10: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
ed20: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
ed30: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
ed40: 63 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 cipher", -1));..
ed50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
ed60: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
ed70: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
ed80: 53 74 72 69 6e 67 4f 62 6a 28 63 69 70 68 65 72 StringObj(cipher
ed90: 73 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a s, -1));. }..
eda0: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 /* Verify th
edb0: 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 e X509 certifica
edc0: 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 te presented by
edd0: 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 the peer */.
ede0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
edf0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
ee00: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
ee10: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 StringObj("verif
ee20: 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a ication", -1));.
ee30: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
ee40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
ee50: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 54 63 erp, objPtr,..Tc
ee60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 58 l_NewStringObj(X
ee70: 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 509_verify_cert_
ee80: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c error_string(SSL
ee90: 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 _get_verify_resu
eea0: 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c lt(statePtr->ssl
eeb0: 29 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f )), -1));.. /
eec0: 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c * Report the sel
eed0: 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
eee0: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 s a result of th
eef0: 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f e negotiation */
ef00: 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c . SSL_get0_al
ef10: 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 pn_selected(stat
ef20: 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 ePtr->ssl, &prot
ef30: 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 o, &len);. Tc
ef40: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
ef50: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
ef60: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
ef70: 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 ringObj("alpn",
ef80: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
ef90: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
efa0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
efb0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
efc0: 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 Obj((char *)prot
efd0: 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a o, (int) len));.
efe0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
eff0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f000: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f010: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 _NewStringObj("p
f020: 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a rotocol", -1));.
f030: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
f040: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f050: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f060: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
f070: 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 L_get_version(st
f080: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 atePtr->ssl), -1
f090: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 ));.. /* Vali
f0a0: 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 d for non-RSA si
f0b0: 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 gnature and TLS
f0c0: 31 2e 33 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 1.3 */. Tcl_L
f0d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f0e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f0f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
f100: 67 4f 62 6a 28 22 73 69 67 6e 61 74 75 72 65 48 gObj("signatureH
f110: 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 2d ashAlgorithm", -
f120: 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 1));. if (obj
f130: 63 20 3d 3d 20 32 20 3f 20 53 53 4c 5f 67 65 74 c == 2 ? SSL_get
f140: 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f _peer_signature_
f150: 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
f160: 6c 2c 20 26 6e 69 64 29 20 3a 20 53 53 4c 5f 67 l, &nid) : SSL_g
f170: 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 et_signature_nid
f180: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
f190: 26 6e 69 64 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 &nid)) {..Tcl_Li
f1a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f1b0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f1c0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
f1d0: 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e Obj(OBJ_nid2ln(n
f1e0: 69 64 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d id), -1));. }
f1f0: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 else {..Tcl_Lis
f200: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
f210: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
f220: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
f230: 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 20 20 20 bj("", -1));.
f240: 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f }. Tcl_ListO
f250: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f260: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f270: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
f280: 28 22 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 ("signature_type
f290: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 ", -1));. if
f2a0: 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 53 53 4c (objc == 2 ? SSL
f2b0: 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 _get_peer_signat
f2c0: 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 ure_type_nid(sta
f2d0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
f2e0: 29 20 3a 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e ) : SSL_get_sign
f2f0: 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 ature_type_nid(s
f300: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e tatePtr->ssl, &n
f310: 69 64 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 id)) {..Tcl_List
f320: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f330: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f340: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
f350: 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 j(OBJ_nid2ln(nid
f360: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 ), -1));. } e
f370: 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f lse {..Tcl_ListO
f380: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f390: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f3a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
f3b0: 28 22 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d ("", -1));. }
f3c0: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
f3d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
f3e0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
f3f0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
f400: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
f410: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
f420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f460: 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 -. *. * Connecti
f470: 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 onInfoObjCmd --
f480: 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f return connectio
f490: 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e n info from Open
f4a0: 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c SSL.. *. * Resul
f4b0: 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 ts:. *.A list of
f4c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f connection info
f4d0: 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *---------
f4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
f520: 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 static int Conne
f530: 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 ctionInfoObjCmd(
f540: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
f550: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
f560: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
f570: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
f580: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
f590: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
f5a0: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e an;../* The chan
f5b0: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
f5c0: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 e on. */. Sta
f5d0: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f te *statePtr;../
f5e0: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
f5f0: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
f600: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
f610: 6a 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 jPtr;. const
f620: 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f SSL *ssl;. co
f630: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a nst SSL_CIPHER *
f640: 63 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 cipher;. cons
f650: 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 t SSL_SESSION *s
f660: 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 ession;. cons
f670: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
f680: 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 6c 6f 6e 67 *proto;. long
f690: 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 66 20 28 mode;.. if (
f6a0: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 objc != 2) {..Tc
f6b0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
f6c0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
f6d0: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 "channel");..ret
f6e0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
f6f0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 }.. chan
f700: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
f710: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 (interp, Tcl_Get
f720: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 StringFromObj(ob
f730: 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 jv[1], NULL), NU
f740: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
f750: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
f760: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
f770: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
f780: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b }.. /* Mak
f790: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
f7a0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
f7b0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
f7c0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
f7d0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
f7e0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
f7f0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
f800: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
f810: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
f820: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f830: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
f840: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
f850: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
f860: 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 "\": not a T
f870: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
f880: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f L);..Tcl_SetErro
f890: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
f8a0: 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e LS", "CONNECTION
f8b0: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 ", "CHANNEL", "I
f8c0: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a NVALID", (char *
f8d0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
f8e0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
f8f0: 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d }.. objPtr =
f900: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
f910: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 0, NULL);.. /
f920: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 * Connection inf
f930: 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 o */. statePt
f940: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c r = (State *)Tcl
f950: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
f960: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 nceData(chan);.
f970: 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 ssl = statePt
f980: 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 r->ssl;. if (
f990: 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ssl != NULL) {..
f9a0: 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 /* connection st
f9b0: 61 74 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 ate */..Tcl_List
f9c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f9d0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f9e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
f9f0: 6a 28 22 73 74 61 74 65 22 2c 20 2d 31 29 29 3b j("state", -1));
fa00: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
fa10: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
fa20: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
fa30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
fa40: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e state_string_lon
fa50: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 g(ssl), -1));...
fa60: 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 65 /* Get SNI reque
fa70: 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65 sted server name
fa80: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
fa90: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
faa0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
fab0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
fac0: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 2d 31 29 servername", -1)
fad0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
fae0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
faf0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
fb00: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
fb10: 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 L_get_servername
fb20: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d (ssl, TLSEXT_NAM
fb30: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 ETYPE_host_name)
fb40: 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 , -1));.../* Get
fb50: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 54 63 protocol */..Tc
fb60: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
fb70: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
fb80: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
fb90: 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f ringObj("protoco
fba0: 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c l", -1));..Tcl_L
fbb0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
fbc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
fbd0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
fbe0: 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 gObj(SSL_get_ver
fbf0: 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 29 3b sion(ssl), -1));
fc00: 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 .../* Renegotiat
fc10: 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 ion allowed */..
fc20: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
fc30: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
fc40: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
fc50: 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 6e 65 67 StringObj("reneg
fc60: 6f 74 69 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b otiation", -1));
fc70: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
fc80: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
fc90: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
fca0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 20 20 ewStringObj(..
fcb0: 20 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 SSL_get_secure
fcc0: 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 _renegotiation_s
fcd0: 75 70 70 6f 72 74 28 73 73 6c 29 20 3f 20 22 73 upport(ssl) ? "s
fce0: 75 70 70 6f 72 74 65 64 22 20 3a 20 22 6e 6f 74 upported" : "not
fcf0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 2d 31 29 supported", -1)
fd00: 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 );.../* Get secu
fd10: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 54 rity level */..T
fd20: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
fd30: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
fd40: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
fd50: 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 75 72 69 tringObj("securi
fd60: 74 79 6c 65 76 65 6c 22 2c 20 2d 31 29 29 3b 0a tylevel", -1));.
fd70: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
fd80: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
fd90: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
fda0: 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f wIntObj(SSL_get_
fdb0: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 security_level(s
fdc0: 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 sl)));.../* Sess
fdd0: 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c ion info */..Tcl
fde0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fdf0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fe00: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
fe10: 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f ingObj("session_
fe20: 72 65 75 73 65 64 22 2c 20 2d 31 29 29 3b 0a 09 reused", -1));..
fe30: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
fe40: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
fe50: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
fe60: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f 73 BooleanObj(SSL_s
fe70: 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 ession_reused(ss
fe80: 6c 29 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 l)));.../* Is se
fe90: 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 rver info */..Tc
fea0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
feb0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
fec0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
fed0: 72 69 6e 67 4f 62 6a 28 22 69 73 5f 73 65 72 76 ringObj("is_serv
fee0: 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f er", -1));..Tcl_
fef0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
ff00: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
ff10: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c Ptr, Tcl_NewBool
ff20: 65 61 6e 4f 62 6a 28 53 53 4c 5f 69 73 5f 73 65 eanObj(SSL_is_se
ff30: 72 76 65 72 28 73 73 6c 29 29 29 3b 0a 20 20 20 rver(ssl)));.
ff40: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 }.. /* Ciphe
ff50: 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 r info */. ci
ff60: 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 pher = SSL_get_c
ff70: 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 urrent_cipher(ss
ff80: 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 l);. if (ciph
ff90: 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 er != NULL) {..c
ffa0: 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 har buf[BUFSIZ]
ffb0: 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 = {0};..int bits
ffc0: 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 54 63 , alg_bits;...Tc
ffd0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
ffe0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
fff0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
10000 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22 ringObj("cipher"
10010 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
10020 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10030 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10040 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10050 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 bj(SSL_CIPHER_ge
10060 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 t_name(cipher),
10070 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
10080 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10090 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
100a0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
100b0 28 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 ("standard_name"
100c0 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
100d0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
100e0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
100f0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10100 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 bj(SSL_CIPHER_st
10110 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 andard_name(ciph
10120 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 62 69 74 er), -1));...bit
10130 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 s = SSL_CIPHER_g
10140 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 et_bits(cipher,
10150 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 54 63 6c &alg_bits);..Tcl
10160 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
10170 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
10180 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
10190 69 6e 67 4f 62 6a 28 22 62 69 74 73 22 2c 20 2d ingObj("bits", -
101a0 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
101b0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
101c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
101d0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 62 69 74 cl_NewIntObj(bit
101e0 73 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 s));..Tcl_ListOb
101f0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10200 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
10210 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
10220 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c 20 2d "secret_bits", -
10230 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
10240 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10250 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
10260 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6c 67 cl_NewIntObj(alg
10270 5f 62 69 74 73 29 29 3b 0a 09 2f 2a 20 61 6c 67 _bits));../* alg
10280 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 _bits is actual
10290 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e key secret bits.
102a0 20 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 If use bits and
102b0 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 secret (algorit
102c0 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c hm) bits differ,
102d0 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 .. the rest of
102e0 20 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 the bits are fi
102f0 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 xed, i.e. for li
10300 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 mited export cip
10310 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 hers (bits < 56)
10320 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
10330 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
10340 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
10350 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
10360 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 2d 31 min_version", -1
10370 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
10380 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
10390 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
103a0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 l_NewStringObj(S
103b0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 SL_CIPHER_get_ve
103c0 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d rsion(cipher), -
103d0 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 1));.../* Get Op
103e0 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 enSSL-specific I
103f0 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a D, not IANA ID *
10400 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
10410 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10420 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
10430 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 64 NewStringObj("id
10440 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
10450 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
10460 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
10470 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a r, Tcl_NewIntObj
10480 28 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 ((int) SSL_CIPHE
10490 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 R_get_id(cipher)
104a0 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 49 ));...if (SSL_CI
104b0 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e PHER_description
104c0 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 (cipher, buf, si
104d0 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 zeof(buf)) != NU
104e0 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c LL) {.. Tcl_L
104f0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10500 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
10510 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
10520 67 4f 62 6a 28 22 64 65 73 63 72 69 70 74 69 6f gObj("descriptio
10530 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54 n", -1));.. T
10540 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10550 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10560 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
10570 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 tringObj(buf, -1
10580 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 ));..}. }..
10590 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 /* Session inf
105a0 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e o */. session
105b0 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 = SSL_get_sessi
105c0 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 on(ssl);. if
105d0 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c (session != NULL
105e0 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 ) {..const unsig
105f0 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 ned char *ticket
10600 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a ;..size_t len2;.
10610 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c .unsigned int ul
10620 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 en;..const unsig
10630 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
10640 6e 5f 69 64 3b 0a 09 63 68 61 72 20 62 75 66 66 n_id;..char buff
10650 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 er[SSL_MAX_MASTE
10660 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a R_KEY_LENGTH];..
10670 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 ./* Report the s
10680 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
10690 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
106a0 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 the ALPN negotia
106b0 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 tion */..SSL_SES
106c0 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 SION_get0_alpn_s
106d0 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c elected(session,
106e0 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b &proto, &len2);
106f0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
10700 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10710 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
10720 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 ewStringObj("alp
10730 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c n", -1));..Tcl_L
10740 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10750 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
10760 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
10770 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f gObj((char *)pro
10780 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 to, (int) len2))
10790 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 ;.../* Report th
107a0 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
107b0 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
107c0 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 of the NPN negot
107d0 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 iation */.#ifdef
107e0 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 USE_NPN..SSL_ge
107f0 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 t0_next_proto_ne
10800 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 gotiated(ssl, &p
10810 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 54 roto, &ulen);..T
10820 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10830 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10840 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
10850 74 72 69 6e 67 4f 62 6a 28 22 6e 70 6e 22 2c 20 tringObj("npn",
10860 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
10870 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10880 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10890 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
108a0 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 ((char *)proto,
108b0 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 23 65 (int) ulen));.#e
108c0 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 ndif.../* Resuma
108d0 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 ble session */..
108e0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
108f0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
10900 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
10910 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 73 75 6d StringObj("resum
10920 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 able", -1));..Tc
10930 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10940 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
10950 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e bjPtr, Tcl_NewIn
10960 74 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e tObj(SSL_SESSION
10970 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 _is_resumable(se
10980 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 ssion)));.../* S
10990 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d ession start tim
109a0 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 e (seconds since
109b0 20 65 70 6f 63 68 29 20 2a 2f 0a 09 54 63 6c 5f epoch) */..Tcl_
109c0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
109d0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
109e0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
109f0 6e 67 4f 62 6a 28 22 73 74 61 72 74 5f 74 69 6d ngObj("start_tim
10a00 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c e", -1));..Tcl_L
10a10 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10a20 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
10a30 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f tr, Tcl_NewLongO
10a40 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 bj(SSL_SESSION_g
10a50 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 et_time(session)
10a60 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 ));.../* Timeout
10a70 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 value - SSL_CTX
10a80 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e _get_timeout (in
10a90 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 seconds) */..Tc
10aa0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10ab0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
10ac0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
10ad0 72 69 6e 67 4f 62 6a 28 22 74 69 6d 65 6f 75 74 ringObj("timeout
10ae0 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
10af0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
10b00 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
10b10 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 r, Tcl_NewLongOb
10b20 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 j(SSL_SESSION_ge
10b30 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f t_timeout(sessio
10b40 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 n)));.../* Sessi
10b50 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 on ticket lifeti
10b60 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f me hint (in seco
10b70 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 nds) */..Tcl_Lis
10b80 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10b90 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10ba0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10bb0 62 6a 28 22 6c 69 66 65 74 69 6d 65 22 2c 20 2d bj("lifetime", -
10bc0 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
10bd0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10be0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
10bf0 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 cl_NewLongObj(SS
10c00 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
10c10 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 cket_lifetime_hi
10c20 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a nt(session)));..
10c30 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a ./* Session id *
10c40 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 /..session_id =
10c50 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
10c60 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 id(session, &ule
10c70 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a n);..Tcl_ListObj
10c80 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
10c90 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
10ca0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
10cb0 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 2d 31 29 session_id", -1)
10cc0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
10cd0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
10ce0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
10cf0 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a _NewByteArrayObj
10d00 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e (session_id, (in
10d10 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 t) ulen));.../*
10d20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d Session ticket -
10d30 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a client only */.
10d40 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 .SSL_SESSION_get
10d50 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 0_ticket(session
10d60 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 , &ticket, &len2
10d70 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
10d80 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
10d90 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
10da0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
10db0 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 ession_ticket",
10dc0 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
10dd0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10de0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10df0 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 Tcl_NewByteArray
10e00 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 Obj(ticket, (int
10e10 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 54 ) len2));.../* T
10e20 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a icket app data *
10e30 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 /..SSL_SESSION_g
10e40 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 et0_ticket_appda
10e50 74 61 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 ta(session, &tic
10e60 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 ket, &len2);..Tc
10e70 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10e80 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
10e90 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
10ea0 72 69 6e 67 4f 62 6a 28 22 74 69 63 6b 65 74 5f ringObj("ticket_
10eb0 61 70 70 5f 64 61 74 61 22 2c 20 2d 31 29 29 3b app_data", -1));
10ec0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
10ed0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10ee0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
10ef0 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 ewByteArrayObj(t
10f00 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e icket, (int) len
10f10 32 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 2));.../* Get ma
10f20 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e ster key */..len
10f30 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 2 = SSL_SESSION_
10f40 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 get_master_key(s
10f50 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 ession, buffer,
10f60 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b SSL_MAX_MASTER_K
10f70 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 54 63 6c EY_LENGTH);..Tcl
10f80 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
10f90 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
10fa0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
10fb0 69 6e 67 4f 62 6a 28 22 6d 61 73 74 65 72 5f 6b ingObj("master_k
10fc0 65 79 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f ey", -1));..Tcl_
10fd0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10fe0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
10ff0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 Ptr, Tcl_NewByte
11000 41 72 72 61 79 4f 62 6a 28 62 75 66 66 65 72 2c ArrayObj(buffer,
11010 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 20 (int) len2));.
11020 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d }.. /* Com
11030 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f pression info */
11040 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 . if (ssl !=
11050 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 NULL) {.#ifdef H
11060 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 AVE_SSL_COMPRESS
11070 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f ION..const COMP_
11080 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 METHOD *comp, *e
11090 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c xpn;..comp = SSL
110a0 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d _get_current_com
110b0 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 pression(ssl);..
110c0 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 expn = SSL_get_c
110d0 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e urrent_expansion
110e0 28 73 73 6c 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 (ssl);...Tcl_Lis
110f0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
11100 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
11110 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
11120 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 bj("compression"
11130 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
11140 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
11150 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
11160 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
11170 62 6a 28 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f bj(comp ? SSL_CO
11180 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 MP_get_name(comp
11190 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 ) : "NONE", -1))
111a0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
111b0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
111c0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
111d0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 NewStringObj("ex
111e0 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a pansion", -1));.
111f0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11200 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11210 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
11220 77 53 74 72 69 6e 67 4f 62 6a 28 65 78 70 6e 20 wStringObj(expn
11230 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e ? SSL_COMP_get_n
11240 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 4e 4f 4e ame(expn) : "NON
11250 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6c 73 65 0a E", -1));.#else.
11260 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11270 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11280 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
11290 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 wStringObj("comp
112a0 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a ression", -1));.
112b0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
112c0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
112d0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
112e0 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 wStringObj("NONE
112f0 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
11300 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
11310 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
11320 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
11330 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c Obj("expansion",
11340 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
11350 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
11360 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11370 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
11380 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a j("NONE", -1));.
11390 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
113a0 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f /* Server info
113b0 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 */. mode = S
113c0 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 SL_CTX_get_sessi
113d0 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 on_cache_mode(st
113e0 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 atePtr->ctx);.
113f0 20 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c if (mode & SSL
11400 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 _SESS_CACHE_OFF)
11410 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 6f 66 66 {..proto = "off
11420 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ";. } else if
11430 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
11440 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 S_CACHE_CLIENT)
11450 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 63 6c 69 65 {..proto = "clie
11460 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 nt";. } else
11470 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
11480 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 ESS_CACHE_SERVER
11490 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 73 65 ) {..proto = "se
114a0 72 76 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 rver";. } els
114b0 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c e if (mode & SSL
114c0 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 _SESS_CACHE_BOTH
114d0 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 62 6f ) {..proto = "bo
114e0 74 68 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 th";. } else
114f0 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 75 6e 6b 6e {..proto = "unkn
11500 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 own";. }.
11510 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
11520 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
11530 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
11540 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 StringObj("sessi
11550 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 on_cache_mode",
11560 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
11570 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
11580 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
11590 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
115a0 4f 62 6a 28 70 72 6f 74 6f 2c 20 2d 31 29 29 3b Obj(proto, -1));
115b0 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
115c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
115d0 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
115e0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
115f0 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
11600 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
11610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11650 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f -. *. * VersionO
11660 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 bjCmd -- return
11670 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 version string f
11680 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a rom OpenSSL.. *.
11690 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
116a0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
116b0 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
116c0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
116d0 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
116e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
116f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
11720 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 static int.Versi
11730 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 onObjCmd(ClientD
11740 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
11750 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
11760 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
11770 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
11780 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f v[]) {. Tcl_O
11790 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 bj *objPtr;..
117a0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
117b0 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 ");.. objPtr
117c0 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f = Tcl_NewStringO
117d0 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 bj(OPENSSL_VERSI
117e0 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 ON_TEXT, -1);.
117f0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
11800 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
11810 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
11820 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 TCL_OK;..clientD
11830 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
11840 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a ;..objc = objc;.
11850 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a .objv = objv;.}.
11860 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
11870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
118a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
118b0 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d MiscObjCmd -- m
118c0 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a isc commands. *.
118d0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
118e0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
118f0 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
11900 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
11910 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
11920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
11960 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f static int.MiscO
11970 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
11980 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
11990 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
119a0 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
119b0 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
119c0 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 ) {. static c
119d0 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 onst char *comma
119e0 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 nds [] = { "req"
119f0 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c , "strreq", NULL
11a00 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d };. enum com
11a10 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f mand { C_REQ, C_
11a20 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 STRREQ, C_DUMMY
11a30 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c 20 };. int cmd,
11a40 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 isStr;. char
11a50 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a buffer[16384];..
11a60 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
11a70 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
11a80 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c objc < 2) {..Tcl
11a90 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
11aa0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
11ab0 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 subcommand ?args
11ac0 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c ?");..return TCL
11ad0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
11ae0 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 if (Tcl_GetInd
11af0 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 exFromObj(interp
11b00 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 , objv[1], comma
11b10 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 nds, "command",
11b20 30 2c 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 0,&cmd) != TCL_O
11b30 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
11b40 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
11b50 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 ERR_clear_err
11b60 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 or();.. isStr
11b70 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 = (cmd == C_STR
11b80 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 REQ);. switch
11b90 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 ((enum command)
11ba0 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f cmd) {..case C_
11bb0 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 REQ:..case C_STR
11bc0 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f REQ: {.. EVP_
11bd0 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b PKEY *pkey=NULL;
11be0 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 .. X509 *cert
11bf0 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 =NULL;.. X509
11c00 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c _NAME *name=NULL
11c10 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a ;.. Tcl_Obj *
11c20 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 69 6e 74 *listv;.. int
11c30 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 listc,i;...
11c40 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a BIO *out=NULL;..
11c50 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 . char *k_C="
11c60 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d ",*k_ST="",*k_L=
11c70 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 "",*k_O="",*k_OU
11c80 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f ="",*k_CN="",*k_
11c90 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 Email="";.. c
11ca0 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d har *keyout,*pem
11cb0 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 out,*str;.. i
11cc0 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 nt keysize,seria
11cd0 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 l=0,days=365;..#
11ce0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
11cf0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
11d00 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 000000L.. BIG
11d10 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b NUM *bne = NULL;
11d20 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d .. RSA *rsa =
11d30 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 NULL;.#else..
11d40 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a EVP_PKEY_CTX *
11d50 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 ctx = NULL;.#end
11d60 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 if... if ((ob
11d70 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 jc<5) || (objc>6
11d80 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 )) {...Tcl_Wrong
11d90 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
11da0 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 2, objv, "keysiz
11db0 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 e keyfile certfi
11dc0 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 le ?info?");...r
11dd0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
11de0 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 .. }... if
11df0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
11e00 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
11e10 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 [2], &keysize) !
11e20 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 = TCL_OK) {...re
11e30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
11e40 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f . }.. keyo
11e50 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ut=Tcl_GetString
11e60 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 (objv[3]);..
11e70 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 pemout=Tcl_GetSt
11e80 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 ring(objv[4]);..
11e90 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b if (isStr) {
11ea0 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e ...Tcl_SetVar(in
11eb0 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 terp,keyout,"",0
11ec0 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 );...Tcl_SetVar(
11ed0 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 interp,pemout,""
11ee0 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ,0);.. }...
11ef0 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b if (objc>=6) {
11f00 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f ...if (Tcl_ListO
11f10 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e bjGetElements(in
11f20 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 terp, objv[5],..
11f30 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 ..&listc, &listv
11f40 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
11f50 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
11f60 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 ERROR;...}....if
11f70 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 ((listc%2) != 0
11f80 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 ) {... Tcl_Se
11f90 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
11fa0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 Information list
11fb0 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 must have even
11fc0 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 number of argume
11fd0 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 nts",NULL);...
11fe0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
11ff0 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 OR;...}...for (i
12000 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d =0; i<listc; i+=
12010 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 2) {... str=T
12020 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
12030 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 tv[i]);... if
12040 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 (strcmp(str,"da
12050 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 ys")==0) {....if
12060 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
12070 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
12080 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 [i+1],&days)!=TC
12090 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 L_OK).... ret
120a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
120b0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
120c0 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 strcmp(str,"seri
120d0 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 al")==0) {....if
120e0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
120f0 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
12100 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d [i+1],&serial)!=
12110 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 TCL_OK).... r
12120 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
12130 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
12140 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 (strcmp(str,"C"
12150 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 )==0) {....k_C=T
12160 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
12170 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
12180 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
12190 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 p(str,"ST")==0)
121a0 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 {....k_ST=Tcl_Ge
121b0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
121c0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
121d0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
121e0 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"L")==0) {....k
121f0 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _L=Tcl_GetString
12200 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
12210 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
12220 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d trcmp(str,"O")==
12230 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 0) {....k_O=Tcl_
12240 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
12250 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
12260 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
12270 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 tr,"OU")==0) {..
12280 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 ..k_OU=Tcl_GetSt
12290 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
122a0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
122b0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 f (strcmp(str,"C
122c0 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 N")==0) {....k_C
122d0 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 N=Tcl_GetString(
122e0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
122f0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
12300 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 rcmp(str,"Email"
12310 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 )==0) {....k_Ema
12320 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 il=Tcl_GetString
12330 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
12340 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 } else {....
12350 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
12360 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 terp,"Unknown pa
12370 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a rameter",NULL);.
12380 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
12390 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d ROR;... }...}
123a0 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 .. }..#if OPE
123b0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
123c0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
123d0 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f L.. bne = BN_
123e0 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 new();.. rsa
123f0 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 = RSA_new();..
12400 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 pkey = EVP_PKE
12410 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 Y_new();.. if
12420 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (bne == NULL ||
12430 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 rsa == NULL ||
12440 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 pkey == NULL ||
12450 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 !BN_set_word(bne
12460 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 ,RSA_F4) ||...!R
12470 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f SA_generate_key_
12480 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c ex(rsa, keysize,
12490 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 bne, NULL) || !
124a0 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f EVP_PKEY_assign_
124b0 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 RSA(pkey, rsa))
124c0 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 {...EVP_PKEY_fre
124d0 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 e(pkey);.../* RS
124e0 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 A_free(rsa); fre
124f0 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 ed by EVP_PKEY_f
12500 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 ree */...BN_free
12510 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 (bne);.#else..
12520 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 pkey = EVP_RSA
12530 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 _gen((unsigned i
12540 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 nt) keysize);..
12550 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 ctx = EVP_PKE
12560 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e Y_CTX_new(pkey,N
12570 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 ULL);.. if (p
12580 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 key == NULL || c
12590 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 tx == NULL || !E
125a0 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 VP_PKEY_keygen_i
125b0 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 nit(ctx) ||...!E
125c0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f VP_PKEY_CTX_set_
125d0 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 rsa_keygen_bits(
125e0 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c ctx, keysize) ||
125f0 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 !EVP_PKEY_keyge
12600 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b n(ctx, &pkey)) {
12610 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
12620 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b (pkey);...EVP_PK
12630 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 EY_CTX_free(ctx)
12640 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 ;.#endif...Tcl_S
12650 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
12660 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e "Error generatin
12670 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e g private key",N
12680 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 ULL);...return T
12690 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
126a0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 else {...if (is
126b0 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 Str) {... out
126c0 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d =BIO_new(BIO_s_m
126d0 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d em());... PEM
126e0 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 _write_bio_Priva
126f0 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e teKey(out,pkey,N
12700 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c ULL,NULL,0,NULL,
12710 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 NULL);... i=B
12720 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 IO_read(out,buff
12730 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 er,sizeof(buffer
12740 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 )-1);... i=(i
12750 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 <0) ? 0 : i;...
12760 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 buffer[i]='\0
12770 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 ';... Tcl_Set
12780 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
12790 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 t,buffer,0);...
127a0 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 BIO_flush(out
127b0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
127c0 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 e(out);...} else
127d0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
127e0 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 _new(BIO_s_file(
127f0 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 ));... BIO_wr
12800 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 ite_filename(out
12810 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 ,keyout);...
12820 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 PEM_write_bio_Pr
12830 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 ivateKey(out,pke
12840 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 y,NULL,NULL,0,NU
12850 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 LL,NULL);...
12860 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f /* PEM_write_bio
12870 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f _RSAPrivateKey(o
12880 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e ut, rsa, NULL, N
12890 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 ULL, 0, NULL, NU
128a0 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 LL); */... BI
128b0 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
128c0 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 .. .}....if ((ce
128d0 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d rt=X509_new())==
128e0 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 NULL) {... Tc
128f0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
12900 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 rp,"Error genera
12910 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ting certificate
12920 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b request",NULL);
12930 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f ... EVP_PKEY_
12940 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
12950 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
12960 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
12970 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 000L... BN_fr
12980 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
12990 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c .. return(TCL
129a0 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 _ERROR);...}....
129b0 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e X509_set_version
129c0 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 (cert,2);...ASN1
129d0 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 _INTEGER_set(X50
129e0 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 9_get_serialNumb
129f0 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 er(cert),serial)
12a00 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f ;...X509_gmtime_
12a10 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f adj(X509_getm_no
12a20 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 tBefore(cert),0)
12a30 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f ;...X509_gmtime_
12a40 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f adj(X509_getm_no
12a50 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f tAfter(cert),(lo
12a60 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 ng)60*60*24*days
12a70 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 );...X509_set_pu
12a80 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b bkey(cert,pkey);
12a90 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 ....name=X509_ge
12aa0 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 t_subject_name(c
12ab0 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 ert);....X509_NA
12ac0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
12ad0 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 txt(name,"C", MB
12ae0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
12af0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
12b00 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c *) k_C, -1, -1,
12b10 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
12b20 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
12b30 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 t(name,"ST", MBS
12b40 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
12b50 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
12b60 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c *) k_ST, -1, -1,
12b70 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
12b80 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
12b90 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 t(name,"L", MBST
12ba0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
12bb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
12bc0 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 ) k_L, -1, -1, 0
12bd0 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
12be0 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
12bf0 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 name,"O", MBSTRI
12c00 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
12c10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
12c20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b k_O, -1, -1, 0);
12c30 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
12c40 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
12c50 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e me,"OU", MBSTRIN
12c60 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
12c70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
12c80 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _OU, -1, -1, 0);
12c90 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
12ca0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
12cb0 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e me,"CN", MBSTRIN
12cc0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
12cd0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
12ce0 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _CN, -1, -1, 0);
12cf0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
12d00 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
12d10 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 me,"Email", MBST
12d20 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
12d30 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
12d40 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d ) k_Email, -1, -
12d50 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 1, 0);....X509_s
12d60 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 et_subject_name(
12d70 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 cert,name);....i
12d80 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 f (!X509_sign(ce
12d90 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 rt,pkey,EVP_sha2
12da0 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 56())) {... X
12db0 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 509_free(cert);.
12dc0 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 .. EVP_PKEY_f
12dd0 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
12de0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
12df0 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
12e00 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 00L... BN_fre
12e10 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 e(bne);.#endif..
12e20 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
12e30 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 lt(interp,"Error
12e40 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 signing certifi
12e50 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 cate",NULL);...
12e60 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
12e70 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 ROR;...}....if (
12e80 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f isStr) {... o
12e90 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
12ea0 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 _mem());... P
12eb0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 EM_write_bio_X50
12ec0 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 9(out,cert);...
12ed0 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 i=BIO_read(ou
12ee0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 t,buffer,sizeof(
12ef0 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 buffer)-1);...
12f00 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 i=(i<0) ? 0 :
12f10 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b i;... buffer[
12f20 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 i]='\0';... T
12f30 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
12f40 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 ,pemout,buffer,0
12f50 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 );... BIO_flu
12f60 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 sh(out);... B
12f70 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 IO_free(out);...
12f80 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f } else {... o
12f90 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
12fa0 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 _file());...
12fb0 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
12fc0 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a me(out,pemout);.
12fd0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
12fe0 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 bio_X509(out,cer
12ff0 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 t);... BIO_fr
13000 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d ee_all(out);...}
13010 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 ....X509_free(ce
13020 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f rt);...EVP_PKEY_
13030 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
13040 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
13050 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
13060 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 000L...BN_free(b
13070 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 ne);.#endif..
13080 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 }..}..break;.
13090 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 default:..brea
130a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 k;. }. ret
130b0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
130c0 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
130d0 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a Data;.}.../*****
130e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
130f0 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 ./* Init
13100 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
13110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
13120 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
13130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13160 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
13170 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a ls_Free --. *. *
13180 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
13190 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 cleans up when a
131a0 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
131b0 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 d channel. *.is
131c0 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 closed and its r
131d0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 eference count f
131e0 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a alls below 1. *.
131f0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e * Results:. *.n
13200 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
13210 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 ffects:. *.Frees
13220 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 all the state.
13230 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
13240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13270 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
13280 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a .Tls_Free(char *
13290 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 blockPtr) {.
132a0 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
132b0 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b = (State *)block
132c0 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 Ptr;.. dprint
132d0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
132e0 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 Tls_Clean(stat
132f0 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 ePtr);. ckfre
13300 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c e(blockPtr);.}..
13310 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
13320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13350 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
13360 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a Tls_Clean --. *.
13370 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
13380 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e e cleans up when
13390 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
133a0 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 sed channel. *.i
133b0 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 s closed and its
133c0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
133d0 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 falls below 1.
133e0 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 This should. *.
133f0 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 be called synchr
13400 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 onously by the C
13410 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e loseProc, not in
13420 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c the. *.Eventual
13430 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e lyFree callback.
13440 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
13450 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.none. *. * Si
13460 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 de effects:. *.F
13470 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 rees all the sta
13480 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d te. *. *--------
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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
134c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
134d0 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 void Tls_Clean(S
134e0 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 tate *statePtr)
134f0 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 {. dprintf("C
13500 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
13510 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 . * we're as
13520 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 suming here that
13530 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 we're single-th
13540 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 readed. */.
13550 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
13560 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 >timer != (Tcl_T
13570 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 imerToken) NULL)
13580 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 {..Tcl_DeleteTi
13590 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 merHandler(state
135a0 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 Ptr->timer);..st
135b0 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 atePtr->timer =
135c0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
135d0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
135e0 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 rotos) {..ckfree
135f0 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
13600 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 s);..statePtr->p
13610 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 rotos = NULL;.
13620 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
13630 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a ePtr->bio) {../*
13640 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 This will call
13650 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 SSL_shutdown. Bu
13660 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 g 1414045 */..dp
13670 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f rintf("BIO_free_
13680 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 all(%p)", stateP
13690 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 tr->bio);..BIO_f
136a0 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 ree_all(statePtr
136b0 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 ->bio);..statePt
136c0 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 r->bio = NULL;.
136d0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
136e0 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 tePtr->ssl) {..d
136f0 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 printf("SSL_free
13700 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d (%p)", statePtr-
13710 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 >ssl);..SSL_free
13720 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
13730 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 ..statePtr->ssl
13740 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
13750 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
13760 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f ctx) {..SSL_CTX_
13770 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 free(statePtr->c
13780 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e tx);..statePtr->
13790 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
137a0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
137b0 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a tr->callback) {.
137c0 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
137d0 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c t(statePtr->call
137e0 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 back);..statePtr
137f0 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c ->callback = NUL
13800 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
13810 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
13820 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 ord) {..Tcl_Decr
13830 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
13840 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 r->password);..s
13850 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
13860 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a d = NULL;. }.
13870 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
13880 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 ->vcmd) {..Tcl_D
13890 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ecrRefCount(stat
138a0 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 ePtr->vcmd);..st
138b0 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e atePtr->vcmd = N
138c0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
138d0 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
138e0 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d ng");.}.../*. *-
138f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13930 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 --. *. * Tls_Ini
13940 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 t --. *. *.This
13950 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 is a package ini
13960 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 tialization proc
13970 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 edure, which is
13980 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c called. *.by Tcl
13990 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 when this packa
139a0 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 ge is to be adde
139b0 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 d to an interpre
139c0 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ter.. *. * Resul
139d0 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 ts: Ssl configu
139e0 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 red and loaded.
139f0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
13a00 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 s:. *. create th
13a10 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 e ssl command, i
13a20 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f nitialize ssl co
13a30 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ntext. *. *-----
13a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
13a80 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 */.DLLEXPORT int
13a90 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e Tls_Init(Tcl_In
13aa0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a terp *interp) {.
13ab0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74 const char t
13ac0 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b lsTclInitScript[
13ad0 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 ] = {.#include "
13ae0 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 tls.tcl.h"..0x00
13af0 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 . };.. dpr
13b00 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
13b10 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 . /*. * W
13b20 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 54 e only support T
13b30 63 6c 20 38 2e 34 20 6f 72 20 6e 65 77 65 72 0a cl 8.4 or newer.
13b40 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 */. if (
13b50 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f .#ifdef USE_TCL_
13b60 53 54 55 42 53 0a 09 54 63 6c 5f 49 6e 69 74 53 STUBS..Tcl_InitS
13b70 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e tubs(interp, "8.
13b80 34 22 2c 20 30 29 0a 23 65 6c 73 65 0a 09 54 63 4", 0).#else..Tc
13b90 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 l_PkgRequire(int
13ba0 65 72 70 2c 20 22 54 63 6c 22 2c 20 22 38 2e 34 erp, "Tcl", "8.4
13bb0 2d 22 2c 20 30 29 0a 23 65 6e 64 69 66 0a 09 20 -", 0).#endif..
13bc0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
13bd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
13be0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 }.. if (Tls
13bf0 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 LibInit(0) != TC
13c00 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 L_OK) {..Tcl_App
13c10 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
13c20 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 , "could not ini
13c30 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 tialize SSL libr
13c40 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ary", NULL);..re
13c50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13c60 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 }.. Tcl_C
13c70 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
13c80 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 interp, "tls::ci
13c90 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f phers", CiphersO
13ca0 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
13cb0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
13cc0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
13cd0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
13ce0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
13cf0 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 erp, "tls::conne
13d00 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 ction", Connecti
13d10 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 onInfoObjCmd, (C
13d20 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
13d30 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
13d40 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
13d50 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
13d60 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
13d70 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 ::handshake", Ha
13d80 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 ndshakeObjCmd, (
13d90 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
13da0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
13db0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
13dc0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
13dd0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
13de0 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f s::import", Impo
13df0 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e rtObjCmd, (Clien
13e00 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
13e10 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
13e20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
13e30 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
13e40 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e interp, "tls::un
13e50 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 import", Unimpor
13e60 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 tObjCmd, (Client
13e70 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
13e80 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
13e90 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
13ea0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
13eb0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 nterp, "tls::sta
13ec0 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 tus", StatusObjC
13ed0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
13ee0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
13ef0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
13f00 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
13f10 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
13f20 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 , "tls::version"
13f30 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c , VersionObjCmd,
13f40 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
13f50 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
13f60 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
13f70 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
13f80 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
13f90 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 tls::misc", Misc
13fa0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
13fb0 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
13fc0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
13fd0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
13fe0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
13ff0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 terp, "tls::prot
14000 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c ocols", Protocol
14010 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 sObjCmd, (Client
14020 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
14030 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
14040 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 ULL);.. if (i
14050 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 nterp) {..Tcl_Ev
14060 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 al(interp, tlsTc
14070 6c 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 lInitScript);.
14080 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 }.. return(
14090 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 Tcl_PkgProvide(i
140a0 6e 74 65 72 70 2c 20 22 74 6c 73 22 2c 20 50 41 nterp, "tls", PA
140b0 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 29 3b CKAGE_VERSION));
140c0 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
140d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
140e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
140f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
14100 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 . *. *.Tls_SafeI
14110 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d nit --. *. *.---
14120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
14150 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 *.Standard proce
14160 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79 dure required by
14170 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 'load'.. *.Init
14180 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 ializes this ext
14190 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 ension for a saf
141a0 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 e interpreter..
141b0 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
141c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
141d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
141e0 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 --*. *. *.Side e
141f0 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f ffects:. *..As o
14200 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a f 'Tls_Init'. *.
14210 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 *.Result:. *..A
14220 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 standard Tcl er
14230 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d ror code.. *. *-
14240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14270 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 -----*. */.DLLEX
14280 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 PORT int Tls_Saf
14290 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 eInit(Tcl_Interp
142a0 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
142b0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
142c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 6c );. return(Tl
142d0 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b s_Init(interp));
142e0 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
142f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
14320 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 . *. *.TlsLibIni
14330 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d t --. *. *.-----
14340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 -----------*. *.
14370 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 Initializes SSL
14380 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 library once per
14390 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 application. *.
143a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
143b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
143c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
143d0 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 *. *. *.Side eff
143e0 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 ects:. *..initia
143f0 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 lizes SSL librar
14400 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a y. *. *.Result:.
14410 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d *..none. *. *--
14420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14450 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 ----*. */.static
14460 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 int TlsLibInit(
14470 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 int uninitialize
14480 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 ) {. static i
14490 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d nt initialized =
144a0 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 0;. int stat
144b0 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 us = TCL_OK;.#if
144c0 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
144d0 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
144e0 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
144f0 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d ). size_t num
14500 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a _locks;.#endif..
14510 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 if (uninitia
14520 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e lize) {..if (!in
14530 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 itialized) {..
14540 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 dprintf("Asked
14550 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 to uninitialize
14560 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 , but we are not
14570 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a initialized");.
14580 0a 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c .. return(TCL
14590 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e _OK);..}...dprin
145a0 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 tf("Asked to uni
145b0 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 nitialize");..#i
145c0 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
145d0 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
145e0 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
145f0 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 S)..Tcl_MutexLoc
14600 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 k(&init_mx);...i
14610 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 f (locks) {..
14620 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 free(locks);..
14630 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b locks = NULL;
14640 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 .. locksCount
14650 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a = 0;..}.#endif.
14660 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 .initialized = 0
14670 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
14680 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
14690 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
146a0 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 HREADS)..Tcl_Mut
146b0 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d exUnlock(&init_m
146c0 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 x);.#endif...ret
146d0 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 urn(TCL_OK);.
146e0 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 }.. if (init
146f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 ialized) {..dpri
14700 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 ntf("Called, but
14710 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 using cached va
14720 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 28 73 lue");..return(s
14730 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 tatus);. }..
14740 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
14750 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e ed");..#if defin
14760 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
14770 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
14780 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 CL_THREADS).
14790 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 Tcl_MutexLock(&i
147a0 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a nit_mx);.#endif.
147b0 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 initialized
147c0 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 = 1;..#if define
147d0 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
147e0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
147f0 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e L_THREADS). n
14800 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 um_locks = 1;.
14810 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 locksCount = (
14820 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a int) num_locks;.
14830 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c locks = mall
14840 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 oc(sizeof(*locks
14850 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a ) * num_locks);.
14860 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 memset(locks
14870 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 , 0, sizeof(*loc
14880 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 ks) * num_locks)
14890 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a ;.#endif.. /*
148a0 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 Initialize BOTH
148b0 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c libcrypto and l
148c0 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 ibssl. */. OP
148d0 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f ENSSL_init_ssl(O
148e0 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 PENSSL_INIT_LOAD
148f0 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f _SSL_STRINGS | O
14900 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 PENSSL_INIT_LOAD
14910 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a _CRYPTO_STRINGS.
14920 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f .| OPENSSL_INIT_
14930 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 ADD_ALL_CIPHERS
14940 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 | OPENSSL_INIT_A
14950 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 DD_ALL_DIGESTS,
14960 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f NULL);.. BIO_
14970 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 new_tcl(NULL, 0)
14980 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a ;..#if 0. /*.
14990 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a * XXX:TODO:
149a0 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 Remove this cod
149b0 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 e and replace it
149c0 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 with a check.
149d0 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 * for enough
149e0 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e entropy and do n
149f0 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 ot try to create
14a00 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 our own. *
14a10 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 terrible entropy
14a20 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a . */. /*.
14a30 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 * Seed the
14a40 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 random number ge
14a50 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 nerator in the S
14a60 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 SL library,.
14a70 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f * using the do/
14a80 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 while construct
14a90 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 because of the b
14aa0 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 ug note in the.
14ab0 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 * OpenSSL FA
14ac0 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e Q at http://www.
14ad0 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 openssl.org/supp
14ae0 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 ort/faq.html#USE
14af0 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a R1. *. *
14b00 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 The crux of the
14b10 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 problem is that
14b20 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 Solaris 7 does
14b30 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 not have a.
14b40 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 * /dev/random or
14b50 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 /dev/urandom de
14b60 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f vice so it canno
14b70 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a t gather enough.
14b80 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 * entropy f
14b90 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 rom the RAND_see
14ba0 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 d() when TLS ini
14bb0 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 tializes and ref
14bc0 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 uses. * to g
14bd0 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 o further. Earli
14be0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f er versions of O
14bf0 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f penSSL carried o
14c00 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 n regardless..
14c10 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 */. srand(
14c20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 (unsigned int) t
14c30 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e ime((time_t *) N
14c40 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a ULL));. do {.
14c50 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c .for (i = 0; i <
14c60 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 16; i++) {..
14c70 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 rnd_seed[i] = 1
14c80 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 + (char) (255.0
14c90 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f * rand()/(RAND_
14ca0 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 MAX+1.0));..}..R
14cb0 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 AND_seed(rnd_see
14cc0 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 d, sizeof(rnd_se
14cd0 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c ed));. } whil
14ce0 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 e (RAND_status()
14cf0 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a != 1);.#endif..
14d00 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
14d10 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
14d20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
14d30 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 ADS)..Tcl_MutexU
14d40 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b nlock(&init_mx);
14d50 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e .#endif...return
14d60 28 73 74 61 74 75 73 29 3b 0a 7d 0a (status);.}.