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 09 2f 2a 20 54 63 6c 5f 53 65 -1));../* Tcl_Se
2680: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
2690: 70 2c 20 22 53 53 4c 22 2c 20 6d 73 67 2c 20 28 p, "SSL", msg, (
26a0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 20 2a 2f char *)NULL); */
26b0: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
26c0: 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 ((msg = Tcl_GetS
26d0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c tringFromObj(Tcl
26e0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _GetObjResult(in
26f0: 74 65 72 70 29 2c 20 4e 55 4c 4c 29 29 20 21 3d terp), NULL)) !=
2700: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 NULL) {..Tcl_Li
2710: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2720: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2730: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2740: 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a Obj(msg, -1));..
2750: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 } else {..li
2760: 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c stPtr = Tcl_NewL
2770: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
2780: 0a 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 ..while ((err =
2790: 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 ERR_get_error())
27a0: 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 != 0) {.. Tc
27b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
27c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
27d0: 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 istPtr, Tcl_NewS
27e0: 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 tringObj(ERR_rea
27f0: 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 son_error_string
2800: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a (err), -1));..}.
2810: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
2820: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2830: 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 , cmdPtr, listPt
2840: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f r);. }.. /
2850: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
2860: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
2870: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
2880: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 cmdPtr);. Eva
2890: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
28a0: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
28b0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 tr);. Tcl_Dec
28c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
28d0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
28e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2920: 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c *. * KeyLogCall
2930: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 back --. *. *.Wr
2940: 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 ite received key
2950: 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c data to log fil
2960: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
2970: 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 fects:. *.none.
2980: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29c0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
29d0: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 KeyLogCallback(
29e0: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 const SSL *ssl,
29f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 const char *line
2a00: 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 ) {. char *st
2a10: 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 r = getenv(SSLKE
2a20: 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 YLOGFILE);. F
2a30: 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 ILE *fd;.. dp
2a40: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
2a50: 0a 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 7b .. if (str) {
2a60: 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 ..fd = fopen(str
2a70: 2c 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 , "a");..fprintf
2a80: 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 (fd, "%s\n",line
2a90: 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a );..fclose(fd);.
2aa0: 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d }.}.../*. *-
2ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2af0: 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 --. *. * Passwor
2b00: 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a d Callback --. *
2b10: 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 . *.Called when
2b20: 61 20 70 61 73 73 77 6f 72 64 20 69 73 20 6e 65 a password is ne
2b30: 65 64 65 64 20 74 6f 20 75 6e 70 61 63 6b 20 52 eded to unpack R
2b40: 53 41 20 61 6e 64 20 50 45 4d 20 6b 65 79 73 2e SA and PEM keys.
2b50: 0a 20 2a 09 45 76 61 6c 73 20 61 6e 79 20 62 6f . *.Evals any bo
2b60: 75 6e 64 20 70 61 73 73 77 6f 72 64 20 73 63 72 und password scr
2b70: 69 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20 ipt and returns
2b80: 74 68 65 20 72 65 73 75 6c 74 20 61 73 0a 20 2a the result as. *
2b90: 09 74 68 65 20 70 61 73 73 77 6f 72 64 20 73 74 .the password st
2ba0: 72 69 6e 67 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ring.. *. *-----
2bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2bf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61 */.static int.Pa
2c00: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 sswordCallback(c
2c10: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 har *buf, int si
2c20: 7a 65 2c 20 69 6e 74 20 76 65 72 69 66 79 2c 20 ze, int verify,
2c30: 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a 20 void *udata) {.
2c40: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
2c50: 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75 tr.= (State *) u
2c60: 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e data;. Tcl_In
2c70: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
2c80: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
2c90: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
2ca0: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f dPtr;. int co
2cb0: 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 de;.. dprintf
2cc0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
2cd0: 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c 62 61 /* If no callba
2ce0: 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c 74 20 ck, use default
2cf0: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 callback */.
2d00: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 if (statePtr->pa
2d10: 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 ssword == NULL)
2d20: 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c 45 {..if (Tcl_EvalE
2d30: 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a x(interp, "tls::
2d40: 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54 password", -1, T
2d50: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 CL_EVAL_GLOBAL)
2d60: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 == TCL_OK) {..
2d70: 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 char *ret = (c
2d80: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 har *) Tcl_GetSt
2d90: 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 ringResult(inter
2da0: 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 70 79 p);.. strncpy
2db0: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 (buf, ret, (size
2dc0: 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 _t) size);..
2dd0: 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72 6c return (int)strl
2de0: 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c 73 65 en(ret);..} else
2df0: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d {.. return -
2e00: 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 1;..}. }..
2e10: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
2e20: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
2e30: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
2e40: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
2e50: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b ePtr->password);
2e60: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 .. Tcl_Preser
2e70: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
2e80: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c interp);. Tcl
2e90: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
2ea0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
2eb0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
2ec0: 61 6c 6c 62 61 63 6b 20 61 6e 64 20 73 75 63 63 allback and succ
2ed0: 65 73 73 20 66 6f 72 20 6f 6b 2c 20 61 62 6f 72 ess for ok, abor
2ee0: 74 20 66 6f 72 20 65 72 72 6f 72 2c 20 63 6f 6e t for error, con
2ef0: 74 69 6e 75 65 20 66 6f 72 20 63 6f 6e 74 69 6e tinue for contin
2f00: 75 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e ue */. Tcl_In
2f10: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
2f20: 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 r);. code = T
2f30: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 cl_EvalObjEx(int
2f40: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c erp, cmdPtr, TCL
2f50: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 _EVAL_GLOBAL);.
2f60: 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 if (code != T
2f70: 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 CL_OK) {.#if (TC
2f80: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
2f90: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 == 8) && (TCL_MI
2fa0: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 NOR_VERSION < 6)
2fb0: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
2fc0: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 Error(interp);.#
2fd0: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 else..Tcl_Backgr
2fe0: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e oundException(in
2ff0: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e terp, code);.#en
3000: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 dif. }. Tc
3010: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
3020: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c mdPtr);.. Tcl
3030: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
3040: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
3050: 0a 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d .. if (code =
3060: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 = TCL_OK) {..cha
3070: 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a r *ret = (char *
3080: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 ) Tcl_GetStringR
3090: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 esult(interp);..
30a0: 69 66 20 28 73 74 72 6c 65 6e 28 72 65 74 29 20 if (strlen(ret)
30b0: 3c 20 73 69 7a 65 20 2d 20 31 29 20 7b 0a 09 20 < size - 1) {..
30c0: 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 strncpy(buf,
30d0: 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 ret, (size_t) si
30e0: 7a 65 29 3b 0a 09 20 20 20 20 54 63 6c 5f 52 65 ze);.. Tcl_Re
30f0: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
3100: 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 a) interp);..
3110: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72 return (int)str
3120: 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 0a 20 20 20 len(ret);..}.
3130: 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 }. Tcl_Relea
3140: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
3150: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 interp);. ret
3160: 75 72 6e 20 2d 31 3b 0a 09 76 65 72 69 66 79 20 urn -1;..verify
3170: 3d 20 76 65 72 69 66 79 3b 0a 7d 0a 0c 0a 2f 2a = verify;.}.../*
3180: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 ------. *. * Ses
31d0: 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f sion Callback fo
31e0: 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a r Clients --. *.
31f0: 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 *.Called when a
3200: 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 69 73 20 new session is
3210: 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 61 63 added to the cac
3220: 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 he. In TLS 1.3.
3230: 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20 72 65 *.this may be re
3240: 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 ceived multiple
3250: 74 69 6d 65 73 20 61 66 74 65 72 20 74 68 65 20 times after the
3260: 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 handshake. For.
3270: 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f *.earlier versio
3280: 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 ns, this will be
3290: 20 72 65 63 65 69 76 65 64 20 64 75 72 69 6e 67 received during
32a0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a the handshake..
32b0: 20 2a 09 54 68 69 73 20 69 73 20 74 68 65 20 70 *.This is the p
32c0: 72 65 66 65 72 72 65 64 20 77 61 79 20 74 6f 20 referred way to
32d0: 6f 62 74 61 69 6e 20 61 20 72 65 73 75 6d 61 62 obtain a resumab
32e0: 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 le session.. *.
32f0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
3300: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
3310: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
3320: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
3330: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 ined). *. * Retu
3340: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d rn codes:. *.0 =
3350: 20 65 72 72 6f 72 20 77 68 65 72 65 20 73 65 73 error where ses
3360: 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d sion will be imm
3370: 65 64 69 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 ediately removed
3380: 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e from the intern
3390: 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d al cache.. *.1 =
33a0: 20 73 75 63 63 65 73 73 20 77 68 65 72 65 20 61 success where a
33b0: 70 70 20 72 65 74 61 69 6e 73 20 73 65 73 73 69 pp retains sessi
33c0: 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 on in session ca
33d0: 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 che, and must ca
33e0: 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 ll SSL_SESSION_f
33f0: 72 65 65 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e ree() when done.
3400: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
3450: 61 74 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e atic int.Session
3460: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
3470: 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 SL *ssl, SSL_SES
3480: 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b SION *session) {
3490: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
34a0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 ePtr = (State*)S
34b0: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_get_app_data(
34c0: 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 (SSL *)ssl);.
34d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
34e0: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
34f0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
3500: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
3510: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
3520: 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 char *ticket;.
3530: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
3540: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
3550: 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 d;. size_t le
3560: 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 n2;. unsigned
3570: 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 int ulen;..
3580: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
3590: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
35a0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
35b0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
35c0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
35d0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
35e0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 } else if (ss
35f0: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 l == NULL) {..re
3600: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
3610: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
3620: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
3630: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
3640: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
3650: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
3660: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
3670: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
3680: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
3690: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
36a0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
36b0: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d Obj("session", -
36c0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 1));.. /* Ses
36d0: 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 sion id */. s
36e0: 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f ession_id = SSL_
36f0: 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 SESSION_get_id(s
3700: 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a ession, &ulen);.
3710: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
3720: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3730: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3740: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a _NewByteArrayObj
3750: 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e (session_id, (in
3760: 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 t) ulen));..
3770: 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 /* Session ticke
3780: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 t */. SSL_SES
3790: 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
37a0: 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 (session, &ticke
37b0: 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 t, &len2);. T
37c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
37d0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
37e0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 cmdPtr, Tcl_NewB
37f0: 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b yteArrayObj(tick
3800: 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 et, (int) len2))
3810: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 ;.. /* Lifeti
3820: 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 me - number of s
3830: 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 econds */. Tc
3840: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3850: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3860: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c mdPtr,..Tcl_NewL
3870: 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 ongObj((long) SS
3880: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
3890: 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 cket_lifetime_hi
38a0: 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a nt(session)));..
38b0: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
38c0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
38d0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
38e0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
38f0: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 EvalCallback(i
3900: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
3910: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 cmdPtr);. Tc
3920: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
3930: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 mdPtr);. retu
3940: 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d rn 0;.}.../*. *-
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3990: 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 --. *. * ALPN Ca
39a0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 llback for Serve
39b0: 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 rs and NPN Callb
39c0: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 ack for Clients
39d0: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d --. *. *.Perform
39e0: 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f protocol (http/
39f0: 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 1.1, h2, h3, etc
3a00: 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 .) selection for
3a10: 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 the. *.incoming
3a20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c connection. Cal
3a30: 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 led after Hello
3a40: 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c 62 and server callb
3a50: 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 acks.. *.Where '
3a60: 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 64 out' is selected
3a70: 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 protocol and 'i
3a80: 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 20 61 n' is the peer a
3a90: 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e 0a dvertised list..
3aa0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
3ab0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
3ac0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
3ad0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
3ae0: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
3af0: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
3b00: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
3b10: 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f OK: ALPN protoco
3b20: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 l selected. The
3b30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
3b40: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
3b50: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 EXT_ERR_ALERT_FA
3b60: 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e TAL: There was n
3b70: 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 o overlap betwee
3b80: 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 n the client's.
3b90: 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c *. supplied l
3ba0: 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 76 ist and the serv
3bb0: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e er configuration
3bc0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
3bd0: 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 will be aborted
3be0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
3bf0: 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 ERR_NOACK: ALPN
3c00: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c protocol not sel
3c10: 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 ected, e.g., bec
3c20: 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 ause no ALPN. *.
3c30: 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 protocols ar
3c40: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 e configured for
3c50: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e this connection
3c60: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
3c70: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 continues.. *.
3c80: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
3c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cc0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
3cd0: 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b int.ALPNCallback
3ce0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c (const SSL *ssl,
3cf0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
3d00: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 char **out, unsi
3d10: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 gned char *outle
3d20: 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e n,..const unsign
3d30: 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 ed char *in, uns
3d40: 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c igned int inlen,
3d50: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 void *arg) {.
3d60: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
3d70: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b r = (State*)arg;
3d80: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
3d90: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
3da0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
3db0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
3dc0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 . int code, r
3dd0: 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 es;.. dprintf
3de0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
3df0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
3e00: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 || arg == NULL)
3e10: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
3e20: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
3e30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
3e40: 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a elect protocol *
3e50: 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65 /. if (SSL_se
3e60: 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 lect_next_proto(
3e70: 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 out, outlen, sta
3e80: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 tePtr->protos, s
3e90: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f tatePtr->protos_
3ea0: 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 len,..in, inlen)
3eb0: 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f == OPENSSL_NPN_
3ec0: 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f NEGOTIATED) {../
3ed0: 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f * Match found */
3ee0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
3ef0: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
3f00: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e else {../* OPEN
3f10: 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c SSL_NPN_NO_OVERL
3f20: 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c AP = No overlap,
3f30: 20 73 6f 20 75 73 65 20 66 69 72 73 74 20 69 74 so use first it
3f40: 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 em from client p
3f50: 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a rotocol list */.
3f60: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 .res = SSL_TLSEX
3f70: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
3f80: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 }.. if (stat
3f90: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 ePtr->vcmd == (T
3fa0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
3fb0: 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 .return res;.
3fc0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
3fd0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
3fe0: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 l */. cmdPtr
3ff0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
4000: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d bj(statePtr->vcm
4010: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
4020: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
4030: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
4040: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
4050: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a j("alpn", -1));.
4060: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4070: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4080: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
4090: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f _NewStringObj(*o
40a0: 75 74 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f ut, -1));.. /
40b0: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
40c0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
40d0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
40e0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 cmdPtr);. if
40f0: 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c ((code = EvalCal
4100: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
4110: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 atePtr, cmdPtr))
4120: 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 > 1) {..res = S
4130: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
4140: 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ACK;. } else
4150: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b if (code == 1) {
4160: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
4170: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
4180: 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 else {..res = S
4190: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
41a0: 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20 7d ERT_FATAL;. }
41b0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
41c0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
41d0: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d return res;.}
41e0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
41f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
4230: 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f 74 * Advertise Prot
4240: 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20 66 ocols Callback f
4250: 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f 6c or Next Protocol
4260: 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e 50 Negotiation (NP
4270: 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c 6c N) in ServerHell
4280: 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65 o --. *. *.calle
4290: 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65 72 d when a TLS ser
42a0: 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73 74 ver needs a list
42b0: 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70 72 of supported pr
42c0: 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78 74 otocols for Next
42d0: 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 . *.Protocol Neg
42e0: 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 otiation.. *. *
42f0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 Results:. *.None
4300: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
4310: 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 72 cts:. *. * Retur
4320: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f n codes:. *.SSL_
4330: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e TLSEXT_ERR_OK: N
4340: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 PN protocol sele
4350: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 cted. The connec
4360: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a tion continues..
4370: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
4380: 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 6f R_NOACK: NPN pro
4390: 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 tocol not select
43a0: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
43b0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
43c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4400: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 ------. */.#ifde
4410: 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69 63 f USE_NPN.static
4420: 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b int.NPNCallback
4430: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c (const SSL *ssl,
4440: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
4450: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 char **out, unsi
4460: 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65 6e gned int *outlen
4470: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 , void *arg) {.
4480: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
4490: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 tr = (State*)arg
44a0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
44b0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
44c0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c f (ssl == NULL |
44d0: 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b | arg == NULL) {
44e0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
44f0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
4500: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 }.. /* Set
4510: 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 protocols list
4520: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
4530: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e Ptr->protos != N
4540: 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 73 ULL) {..*out = s
4550: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 3b tatePtr->protos;
4560: 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61 74 ..*outlen = stat
4570: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e ePtr->protos_len
4580: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
4590: 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f *out = NULL;..*o
45a0: 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74 75 utlen = 0;..retu
45b0: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
45c0: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 20 R_NOACK;. }.
45d0: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c return SSL_TL
45e0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 SEXT_ERR_OK;.}.#
45f0: 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d endif.../*. *---
4600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4640: 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62 . *. * SNI Callb
4650: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 ack for Servers
4660: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d --. *. *.Perform
4670: 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e 49 server-side SNI
4680: 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 74 hostname select
4690: 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69 76 ion after receiv
46a0: 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69 6f ing SNI extensio
46b0: 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20 48 n. *.in Client H
46c0: 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66 74 ello. Called aft
46d0: 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 er hello callbac
46e0: 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c 50 k but before ALP
46f0: 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 N callback.. *.
4700: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
4710: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
4720: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
4730: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
4740: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 ined). *. * Retu
4750: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c rn codes:. *.SSL
4760: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 _TLSEXT_ERR_OK:
4770: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 SNI hostname is
4780: 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f accepted. The co
4790: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
47a0: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es.. *.SSL_TLSEX
47b0: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 T_ERR_ALERT_FATA
47c0: 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 L: SNI hostname
47d0: 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2e is not accepted.
47e0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a The connection.
47f0: 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 65 *. is aborte
4800: 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 61 d. Default for a
4810: 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f 55 lert is SSL_AD_U
4820: 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 NRECOGNIZED_NAME
4830: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
4840: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e ERR_ALERT_WARNIN
4850: 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 G: SNI hostname
4860: 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2c is not accepted,
4870: 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20 warning alert.
4880: 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 20 *. sent (not
4890: 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c 53 supported in TLS
48a0: 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65 v1.3). The conne
48b0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
48c0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
48d0: 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f RR_NOACK: SNI ho
48e0: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
48f0: 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 61 cepted and not a
4900: 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09 cknowledged,. *.
4910: 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 20 e.g. if SNI
4920: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e has not been con
4930: 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f 6e figured. The con
4940: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
4950: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d s.. *. *--------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
49a0: 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 61 static int.SNICa
49b0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
49c0: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 *ssl, int *aler
49d0: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a t, void *arg) {.
49e0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
49f0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
4a00: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 g;. Tcl_Inter
4a10: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
4a20: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
4a30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
4a40: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c r;. int code,
4a50: 20 72 65 73 3b 0a 20 20 20 20 63 68 61 72 20 2a res;. char *
4a60: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c servername = NUL
4a70: 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 L;.. dprintf(
4a80: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
4a90: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 if (ssl == NULL
4aa0: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 || arg == NULL)
4ab0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
4ac0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4ad0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e }.. /* On
4ae0: 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 ly works for TLS
4af0: 20 31 2e 32 20 61 6e 64 20 65 61 72 6c 69 65 72 1.2 and earlier
4b00: 20 2a 2f 0a 20 20 20 20 73 65 72 76 65 72 6e 61 */. serverna
4b10: 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 me = SSL_get_ser
4b20: 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 vername(ssl, TLS
4b30: 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 EXT_NAMETYPE_hos
4b40: 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 t_name);. if
4b50: 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 (!servername ||
4b60: 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d servername[0] ==
4b70: 20 27 5c 30 27 29 20 7b 0a 09 72 65 74 75 72 6e '\0') {..return
4b80: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
4b90: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
4ba0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
4bb0: 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a vcmd == (Tcl_Obj
4bc0: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
4bd0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
4be0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 _OK;. }..
4bf0: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
4c00: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 d to eval */.
4c10: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
4c20: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
4c30: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 Ptr->vcmd);.
4c40: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
4c50: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
4c60: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
4c70: 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c StringObj("sni",
4c80: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
4c90: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4ca0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4cb0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
4cc0: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 gObj(servername
4cd0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 , -1));.. /*
4ce0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
4cf0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
4d00: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
4d10: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 dPtr);. if ((
4d20: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 code = EvalCallb
4d30: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
4d40: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e ePtr, cmdPtr)) >
4d50: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 1) {..res = SSL
4d60: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 _TLSEXT_ERR_ALER
4d70: 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 T_WARNING;..*ale
4d80: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 rt = SSL_AD_UNRE
4d90: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f COGNIZED_NAME; /
4da0: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 * Not supported
4db0: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 by TLS 1.3 */.
4dc0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 } else if (cod
4dd0: 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d e == 1) {..res =
4de0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
4df0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b OK;. } else {
4e00: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
4e10: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 XT_ERR_ALERT_FAT
4e20: 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 AL;..*alert = SS
4e30: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 L_AD_UNRECOGNIZE
4e40: 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 D_NAME; /* Not s
4e50: 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 upported by TLS
4e60: 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 1.3 */. }.
4e70: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
4e80: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 t(cmdPtr);. r
4e90: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f eturn res;.}.../
4ea0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
4eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ee0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c -------. *. * Cl
4ef0: 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 ientHello Handsh
4f00: 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 ake Callback for
4f10: 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 Servers --. *.
4f20: 2a 09 55 73 65 64 20 62 79 20 73 65 72 76 65 72 *.Used by server
4f30: 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 to examine the
4f40: 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 server name indi
4f50: 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 cation (SNI) ext
4f60: 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 ension. *.provid
4f70: 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 ed by the client
4f80: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c in order to sel
4f90: 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 ect an appropria
4fa0: 74 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 te certificate t
4fb0: 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e o. *.present, an
4fc0: 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e d make other con
4fd0: 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 figuration adjus
4fe0: 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 tments relevant
4ff0: 74 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 to that server.
5000: 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 *.name and its c
5010: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 onfiguration. Th
5020: 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 is includes swap
5030: 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 ping out the ass
5040: 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 ociated. *.SSL_C
5050: 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 TX pointer, modi
5060: 66 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 fying the server
5070: 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 's list of permi
5080: 74 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e tted TLS version
5090: 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 s,. *.changing t
50a0: 68 65 20 73 65 72 76 65 72 27 73 20 63 69 70 68 he server's ciph
50b0: 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f er list in respo
50c0: 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e nse to the clien
50d0: 74 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c t's cipher list,
50e0: 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 etc.. *.Called
50f0: 62 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 before SNI and A
5100: 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 LPN callbacks..
5110: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
5120: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
5130: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
5140: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
5150: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
5160: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 eturn codes:. *.
5170: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
5180: 5f 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 _RETRY: suspend
5190: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 the handshake, a
51a0: 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 nd the handshake
51b0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 function will r
51c0: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c eturn immediatel
51d0: 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f y. *.SSL_CLIENT_
51e0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 HELLO_ERROR: fai
51f0: 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 lure, terminate
5200: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 connection. Set
5210: 61 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 alert to error c
5220: 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 ode.. *.SSL_CLIE
5230: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 NT_HELLO_SUCCESS
5240: 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d : success. *. *-
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5290: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
52a0: 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 t.HelloCallback(
52b0: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 const SSL *ssl,
52c0: 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 int *alert, void
52d0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
52e0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
52f0: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 State*)arg;.
5300: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
5310: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
5320: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
5330: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
5340: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 int code, res;.
5350: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 const char *s
5360: 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 ervername;. c
5370: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
5380: 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f ar *p;. size_
5390: 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 t len, remaining
53a0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
53b0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
53c0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d f (statePtr->vcm
53d0: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e d == (Tcl_Obj*)N
53e0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
53f0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
5400: 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 SUCCESS;. } e
5410: 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e lse if (ssl == N
5420: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 ULL || arg == NU
5430: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
5440: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
5450: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
5460: 20 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f /* Get names */
5470: 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c . if (!SSL_cl
5480: 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f ient_hello_get0_
5490: 65 78 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f ext(ssl, TLSEXT_
54a0: 54 59 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 TYPE_server_name
54b0: 2c 20 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 , &p, &remaining
54c0: 29 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c ) || remaining <
54d0: 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d = 2) {..*alert =
54e0: 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 SSL_R_SSLV3_ALE
54f0: 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d RT_ILLEGAL_PARAM
5500: 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 ETER;..return SS
5510: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
5520: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
5530: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 /* Extract the
5540: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 length of the su
5550: 70 70 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e pplied list of n
5560: 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e ames. */. len
5570: 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 = (*(p++) << 8)
5580: 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 ;. len += *(p
5590: 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e ++);. if (len
55a0: 20 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e + 2 != remainin
55b0: 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 g) {..*alert = S
55c0: 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 SL_R_SSLV3_ALERT
55d0: 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 _ILLEGAL_PARAMET
55e0: 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ER;..return SSL_
55f0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
5600: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 OR;. }. re
5610: 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a maining = len;..
5620: 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 /* The list
5630: 69 6e 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 in practice only
5640: 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c has a single el
5650: 65 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c ement, so we onl
5660: 79 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 y consider the f
5670: 69 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 irst one. */.
5680: 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d if (remaining =
5690: 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 = 0 || *p++ != T
56a0: 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 LSEXT_NAMETYPE_h
56b0: 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c ost_name) {..*al
56c0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 ert = SSL_R_TLSV
56d0: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 1_ALERT_INTERNAL
56e0: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 _ERROR;..return
56f0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
5700: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
5710: 20 20 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a remaining--;..
5720: 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 /* Now we ca
5730: 6e 20 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f n finally pull o
5740: 75 74 20 74 68 65 20 62 79 74 65 20 61 72 72 61 ut the byte arra
5750: 79 20 77 69 74 68 20 74 68 65 20 61 63 74 75 61 y with the actua
5760: 6c 20 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 l hostname. */.
5770: 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 if (remaining
5780: 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 <= 2) {..*alert
5790: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
57a0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
57b0: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c ROR;..return SSL
57c0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
57d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c ROR;. }. l
57e0: 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 en = (*(p++) <<
57f0: 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 8);. len += *
5800: 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c (p++);. if (l
5810: 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 en + 2 > remaini
5820: 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 ng) {..*alert =
5830: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
5840: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 T_INTERNAL_ERROR
5850: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
5860: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
5870: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 ;. }. rema
5880: 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 ining = len;.
5890: 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 servername = (c
58a0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a onst char *)p;..
58b0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f /* Create co
58c0: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f mmand to eval */
58d0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
58e0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
58f0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a tatePtr->vcmd);.
5900: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
5910: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5920: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
5930: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 _NewStringObj("h
5940: 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 ello", -1));.
5950: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5960: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5970: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
5980: 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 wStringObj(serve
5990: 72 6e 61 6d 65 2c 20 28 69 6e 74 29 20 6c 65 6e rname, (int) len
59a0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c ));.. /* Eval
59b0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
59c0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
59d0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
59e0: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 );. if ((code
59f0: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 = EvalCallback(
5a00: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
5a10: 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 , cmdPtr)) > 1)
5a20: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 {..res = SSL_CLI
5a30: 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b ENT_HELLO_RETRY;
5a40: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 ..*alert = SSL_R
5a50: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 _TLSV1_ALERT_USE
5a60: 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 R_CANCELLED;.
5a70: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 } else if (code
5a80: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 == 1) {..res =
5a90: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
5aa0: 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 _SUCCESS;. }
5ab0: 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 else {..res = SS
5ac0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
5ad0: 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 RROR;..*alert =
5ae0: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
5af0: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 T_INTERNAL_ERROR
5b00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
5b10: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
5b20: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
5b30: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a res;.}.../*****
5b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
5b50: 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 ./* Commands
5b60: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
5b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
5b80: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
5b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5bc0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
5bd0: 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 iphersObjCmd --
5be0: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 list available c
5bf0: 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 iphers. *. *.Thi
5c00: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
5c10: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
5c20: 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 s the "tls::ciph
5c30: 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 ers" command. *.
5c40: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c to list availabl
5c50: 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 e ciphers, based
5c60: 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 upon protocol s
5c70: 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 elected.. *. * R
5c80: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
5c90: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
5ca0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 list.. *. * Sid
5cb0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f e effects:. *.co
5cc0: 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 nstructs and des
5cd0: 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 troys SSL contex
5ce0: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d t (CTX). *. *---
5cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d30: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 . */.static cons
5d40: 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c t char *protocol
5d50: 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c s[] = {.."ssl2",
5d60: 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c "ssl3", "tls1",
5d70: 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 "tls1.1", "tls1
5d80: 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e .2", "tls1.3", N
5d90: 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 ULL.};.enum prot
5da0: 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 ocol {. TLS_S
5db0: 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 SL2, TLS_SSL3, T
5dc0: 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 LS_TLS1, TLS_TLS
5dd0: 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 1_1, TLS_TLS1_2,
5de0: 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 TLS_TLS1_3, TLS
5df0: 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 _NONE.};..static
5e00: 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 int.CiphersObjC
5e10: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
5e20: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
5e30: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
5e40: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
5e50: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
5e60: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
5e70: 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 jPtr = NULL;.
5e80: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 SSL_CTX *ctx =
5e90: 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 NULL;. SSL *s
5ea0: 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 sl = NULL;. S
5eb0: 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 TACK_OF(SSL_CIPH
5ec0: 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 ER) *sk;. cha
5ed0: 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 49 r *cp, buf[BUFSI
5ee0: 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 Z];. int inde
5ef0: 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 x, verbose = 0,
5f00: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 use_supported =
5f10: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
5f20: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
5f30: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c if ((objc < 2) |
5f40: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a | (objc > 4)) {.
5f50: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
5f60: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
5f70: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 v, "protocol ?ve
5f80: 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 rbose? ?supporte
5f90: 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 d?");..return TC
5fa0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
5fb0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
5fc0: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
5fd0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 p, objv[1], prot
5fe0: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c ocols, "protocol
5ff0: 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d ", 0, &index) !=
6000: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
6010: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
6020: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a }. if ((obj
6030: 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 c > 2) && Tcl_Ge
6040: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 tBooleanFromObj(
6050: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c interp, objv[2],
6060: 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 &verbose) != TC
6070: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
6080: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
6090: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e . if ((objc >
60a0: 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 3) && Tcl_GetBo
60b0: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 oleanFromObj(int
60c0: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 erp, objv[3], &u
60d0: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d se_supported) !=
60e0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
60f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
6100: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
6110: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
6120: 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 switch ((enum p
6130: 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b rotocol)index) {
6140: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a ..case TLS_SSL2:
6150: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
6160: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 SION_NUMBER >= 0
6170: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 x10100000L || de
6180: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c fined(NO_SSL2) |
6190: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
61a0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 L_NO_SSL2)..
61b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
61c0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
61d0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
61e0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
61f0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
6200: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
6210: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
6220: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
6230: 77 28 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 w(SSLv2_method()
6240: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
6250: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a ..case TLS_SSL3:
6260: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
6270: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
6280: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
6290: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
62a0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 NSSL_NO_SSL3_MET
62b0: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 HOD).. Tcl_Ap
62c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
62d0: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
62e0: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
62f0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
6300: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
6310: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
6320: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 else.. ctx =
6330: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 SSL_CTX_new(SSLv
6340: 33 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 3_method()); bre
6350: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
6360: 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 TLS_TLS1:.#if d
6370: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
6380: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
6390: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 SL_NO_TLS1) || d
63a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
63b0: 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 O_TLS1_METHOD)..
63c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
63d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
63e0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
63f0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
6400: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
6410: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
6420: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
6430: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 ctx = SSL_CT
6440: 58 5f 6e 65 77 28 54 4c 53 76 31 5f 6d 65 74 68 X_new(TLSv1_meth
6450: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 od()); break;.#e
6460: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
6470: 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e LS1_1:.#if defin
6480: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
6490: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
64a0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 _NO_TLS1_1) || d
64b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
64c0: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 O_TLS1_1_METHOD)
64d0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
64e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
64f0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
6500: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
6510: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
6520: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
6530: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
6540: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f .. ctx = SSL_
6550: 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 31 5f CTX_new(TLSv1_1_
6560: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b method()); break
6570: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 ;.#endif..case T
6580: 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 LS_TLS1_2:.#if d
6590: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
65a0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
65b0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 NSSL_NO_TLS1_2)
65c0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
65d0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 SL_NO_TLS1_2_MET
65e0: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 HOD).. Tcl_Ap
65f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
6600: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
6610: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
6620: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
6630: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
6640: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
6650: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 else.. ctx =
6660: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 SSL_CTX_new(TLSv
6670: 31 5f 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 1_2_method()); b
6680: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
6690: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 se TLS_TLS1_3:.#
66a0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
66b0: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_3) || defined
66c0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
66d0: 5f 33 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 _3).. Tcl_App
66e0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
66f0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
6700: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
6710: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
6720: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
6730: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
6740: 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 lse.. ctx = S
6750: 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 5f 6d SL_CTX_new(TLS_m
6760: 65 74 68 6f 64 28 29 29 3b 0a 09 20 20 20 20 53 ethod());.. S
6770: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 SL_CTX_set_min_p
6780: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
6790: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
67a0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
67b0: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 set_max_proto_ve
67c0: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f rsion(ctx, TLS1_
67d0: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 3_VERSION);..
67e0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
67f0: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 62 72 default:.. br
6800: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 eak;. }. i
6810: 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 f (ctx == NULL)
6820: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
6830: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 ult(interp, REAS
6840: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ON(), NULL);..re
6850: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6860: 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d }.. ssl =
6870: 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 SSL_new(ctx);.
6880: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 if (ssl == NU
6890: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
68a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
68b0: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b REASON(), NULL);
68c0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
68d0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c tx);..return TCL
68e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
68f0: 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 /* Use list a
6900: 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c nd order as woul
6910: 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43 d be sent in a C
6920: 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c lientHello or al
6930: 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 l available ciph
6940: 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 ers */. if (u
6950: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a se_supported) {.
6960: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 .sk = SSL_get1_s
6970: 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73 upported_ciphers
6980: 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 (ssl);. } els
6990: 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 e {..sk = SSL_ge
69a0: 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a t_ciphers(ssl);.
69b0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
69c0: 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 k != NULL) {..if
69d0: 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 (!verbose) {..
69e0: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
69f0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
6a00: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 LL);.. for (i
6a10: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b nt i = 0; i < sk
6a20: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 _SSL_CIPHER_num(
6a30: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f sk); i++) {...co
6a40: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a nst SSL_CIPHER *
6a50: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 c = sk_SSL_CIPHE
6a60: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a R_value(sk, i);.
6a70: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 ..if (c == NULL)
6a80: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a continue;..../*
6a90: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 cipher name or
6aa0: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d (NONE) */...cp =
6ab0: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
6ac0: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 name(c);...if (c
6ad0: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b p == NULL) break
6ae0: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
6af0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
6b00: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
6b10: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 _NewStringObj(cp
6b20: 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a , -1));.. }..
6b30: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f .} else {.. o
6b40: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 bjPtr = Tcl_NewS
6b50: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a tringObj("",0);.
6b60: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 . for (int i
6b70: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f = 0; i < sk_SSL_
6b80: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 CIPHER_num(sk);
6b90: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 i++) {...const S
6ba0: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 SL_CIPHER *c = s
6bb0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c k_SSL_CIPHER_val
6bc0: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 ue(sk, i);...if
6bd0: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 (c == NULL) cont
6be0: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 inue;..../* text
6bf0: 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 ual description
6c00: 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f of the cipher */
6c10: 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 ...if (SSL_CIPHE
6c20: 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c R_description(c,
6c30: 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 buf, sizeof(buf
6c40: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 )) != NULL) {...
6c50: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f Tcl_AppendTo
6c60: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c Obj(objPtr, buf,
6c70: 20 28 69 6e 74 29 20 73 74 72 6c 65 6e 28 62 75 (int) strlen(bu
6c80: 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a f));...} else {.
6c90: 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
6ca0: 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 ToObj(objPtr, "U
6cb0: 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 NKNOWN\n", 8);..
6cc0: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 .}.. }..}..if
6cd0: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 (use_supported)
6ce0: 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 {.. sk_SSL_C
6cf0: 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a IPHER_free(sk);.
6d00: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c .}. }. SSL
6d10: 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 _free(ssl);.
6d20: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
6d30: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f );.. Tcl_SetO
6d40: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
6d50: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
6d60: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
6d70: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
6d80: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a tData;.}.../*. *
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6dd0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 ---. *. * Protoc
6de0: 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 olsObjCmd -- lis
6df0: 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 t available prot
6e00: 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 ocols. *. *.This
6e10: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
6e20: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 voked to process
6e30: 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f the "tls::proto
6e40: 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a cols" command. *
6e50: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 .to list availab
6e60: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a le protocols.. *
6e70: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
6e80: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
6e90: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 esult list.. *.
6ea0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
6eb0: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.none. *. *---
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f00: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
6f10: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 ProtocolsObjCmd(
6f20: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
6f30: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
6f40: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
6f50: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
6f60: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
6f70: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
6f80: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 r;.. dprintf(
6f90: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
6fa0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b if (objc != 1) {
6fb0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
6fc0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
6fd0: 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e jv, "");..return
6fe0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
6ff0: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
7000: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f _error();.. o
7010: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
7020: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
7030: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
7040: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
7050: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
7060: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
7070: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
7080: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
7090: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
70a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
70b0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
70c0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
70d0: 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 cols[TLS_SSL2],
70e0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 -1));.#endif.#if
70f0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
7100: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
7110: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 PENSSL_NO_SSL3)
7120: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
7130: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 SSL_NO_SSL3_METH
7140: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 OD). Tcl_List
7150: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
7160: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
7170: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
7180: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
7190: 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e SSL3], -1));.#en
71a0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
71b0: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 (NO_TLS1) && !de
71c0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
71d0: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
71e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
71f0: 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 S1_METHOD). T
7200: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
7210: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
7220: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
7230: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
7240: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 ls[TLS_TLS1], -1
7250: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
7260: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
7270: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
7280: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
7290: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
72a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f ENSSL_NO_TLS1_1_
72b0: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f METHOD). Tcl_
72c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
72d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
72e0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
72f0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
7300: 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 TLS_TLS1_1], -1)
7310: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
7320: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
7330: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
7340: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
7350: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
7360: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d NSSL_NO_TLS1_2_M
7370: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c ETHOD). Tcl_L
7380: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
7390: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
73a0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
73b0: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
73c0: 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 LS_TLS1_2], -1))
73d0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
73e0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
73f0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
7400: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
7410: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
7420: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
7430: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
7440: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
7450: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
7460: 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 _3], -1));.#endi
7470: 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 f.. Tcl_SetOb
7480: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
7490: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
74a0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
74b0: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
74c0: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
74d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
74e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
74f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7510: 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 --. *. * Handsha
7520: 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 keObjCmd --. *.
7530: 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 *.This command i
7540: 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 s used to verify
7550: 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e whether the han
7560: 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 dshake is comple
7570: 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a te. *.or not.. *
7580: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
7590: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
75a0: 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 esult. 1 means h
75b0: 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 andshake complet
75c0: 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 e, 0 means pendi
75d0: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ng.. *. * Side e
75e0: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 ffects:. *.May f
75f0: 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 orce SSL negotia
7600: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 tion to take pla
7610: 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ce.. *. *-------
7620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
7660: 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 .static int Hand
7670: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 shakeObjCmd(Clie
7680: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
7690: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
76a0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
76b0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
76c0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
76d0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 l_Channel chan;
76e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 /* The ch
76f0: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
7700: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 ode on. */. S
7710: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 tate *statePtr;
7720: 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 /* client
7730: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
7740: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e ocket */. con
7750: 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 st char *errStr
7760: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
7770: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 ret = 1;. int
7780: 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 err = 0;.. d
7790: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
77a0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
77b0: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
77c0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
77d0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
77e0: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 nel");..return(T
77f0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
7800: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f .. ERR_clear_
7810: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 error();.. ch
7820: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
7830: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f nel(interp, Tcl_
7840: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
7850: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c (objv[1], NULL),
7860: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
7870: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
7880: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
7890: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
78a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
78b0: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
78c0: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
78d0: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
78e0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
78f0: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
7900: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 );. if (Tcl_G
7910: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
7920: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
7930: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
7940: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
7950: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
7960: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
7970: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
7980: 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 , "\": not a TLS
7990: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 channel", NULL)
79a0: 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 ;..return(TCL_ER
79b0: 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ROR);. }.
79c0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
79d0: 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e e *)Tcl_GetChann
79e0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 elInstanceData(c
79f0: 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e han);.. dprin
7a00: 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f tf("Calling Tls_
7a10: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 WaitForConnect")
7a20: 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73 5f ;. ret = Tls_
7a30: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 WaitForConnect(s
7a40: 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20 31 tatePtr, &err, 1
7a50: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 );. dprintf("
7a60: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
7a70: 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69 22 ct returned: %i"
7a80: 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 , ret);.. if
7a90: 28 72 65 74 20 3c 20 30 20 26 26 20 28 28 73 74 (ret < 0 && ((st
7aa0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 atePtr->flags &
7ab0: 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 TLS_TCL_ASYNC) &
7ac0: 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49 4e & (err == EAGAIN
7ad0: 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 ))) {..dprintf("
7ae0: 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72 Async set and er
7af0: 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 r = EAGAIN");..r
7b00: 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c et = 0;. } el
7b10: 73 65 20 69 66 20 28 72 65 74 20 3c 20 30 29 20 se if (ret < 0)
7b20: 7b 0a 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 {..errStr = stat
7b30: 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f ePtr->err;..Tcl_
7b40: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 ResetResult(inte
7b50: 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 rp);..Tcl_SetErr
7b60: 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 no(err);...if (!
7b70: 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 errStr || (*errS
7b80: 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 tr == 0)) {..
7b90: 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f errStr = Tcl_Po
7ba0: 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 sixError(interp)
7bb0: 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e ;..}...Tcl_Appen
7bc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
7bd0: 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 "handshake faile
7be0: 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 d: ", errStr, (c
7bf0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 har *) NULL);..d
7c00: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
7c10: 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 g TCL_ERROR with
7c20: 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 handshake faile
7c30: 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b d: %s", errStr);
7c40: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
7c50: 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 OR);. } else
7c60: 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 {..if (err != 0)
7c70: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
7c80: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 "Got an error wi
7c90: 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 th a completed h
7ca0: 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 andshake: err =
7cb0: 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 %i", err);..}..r
7cc0: 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 et = 1;. }..
7cd0: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
7ce0: 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 rning TCL_OK wit
7cf0: 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 h data \"%i\"",
7d00: 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ret);. Tcl_Se
7d10: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
7d20: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a p, Tcl_NewIntObj
7d30: 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 (ret));. retu
7d40: 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 rn(TCL_OK);..cli
7d50: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
7d60: 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d Data;.}../*. *--
7d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7db0: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 -. *. * ImportOb
7dc0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
7dd0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
7de0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
7df0: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d ss the "ssl" com
7e00: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 mand. *. *.The s
7e10: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 sl command pushe
7e20: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 s SSL over a (ne
7e30: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 wly connected) t
7e40: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 cp socket. *. *
7e50: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
7e60: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
7e70: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
7e80: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f fects:. *.May mo
7e90: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f dify the behavio
7ea0: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e r of an IO chann
7eb0: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d el.. *. *-------
7ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
7f00: 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f .static int.Impo
7f10: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 rtObjCmd(ClientD
7f20: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
7f30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
7f40: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
7f50: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
7f60: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
7f70: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
7f80: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
7f90: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
7fa0: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
7fb0: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e tePtr;../* clien
7fc0: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
7fd0: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 socket */. SS
7fe0: 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20 20 20 L_CTX *ctx.
7ff0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 = NULL;. T
8000: 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 20 cl_Obj *script.
8010: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
8020: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 Tcl_Obj *pass
8030: 77 6f 72 64 09 20 20 20 20 20 20 20 20 3d 20 4e word. = N
8040: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
8050: 20 2a 76 63 6d 64 09 20 20 20 20 20 20 20 20 3d *vcmd. =
8060: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 NULL;. Tcl_D
8070: 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e String upperChan
8080: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 nelTranslation,
8090: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
80a0: 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e king, upperChann
80b0: 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 elEncoding, uppe
80c0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b rChannelEOFChar;
80d0: 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c 65 . int idx, le
80e0: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 n;. int flags
80f0: 09 09 20 20 20 20 20 20 20 20 3d 20 54 4c 53 5f .. = TLS_
8100: 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e TCL_INIT;. in
8110: 74 20 73 65 72 76 65 72 09 09 20 20 20 20 20 20 t server..
8120: 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e = 0;./* is con
8130: 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 nection incoming
8140: 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f or outgoing? */
8150: 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 69 . char *keyfi
8160: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c le. = NUL
8170: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 L;. char *cer
8180: 74 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 tfile. =
8190: 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e NULL;. unsign
81a0: 65 64 20 63 68 61 72 20 2a 6b 65 79 20 20 09 3d ed char *key .=
81b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6b NULL;. int k
81c0: 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 ey_len
81d0: 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 = 0;.
81e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 unsigned char *c
81f0: 65 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e 55 ert = NU
8200: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 63 65 72 74 LL;. int cert
8210: 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 _len
8220: 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 = 0;. cha
8230: 72 20 2a 63 69 70 68 65 72 73 09 20 20 20 20 20 r *ciphers.
8240: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 = NULL;. c
8250: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
8260: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c s. = NULL
8270: 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 ;. char *CAfi
8280: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c le. = NUL
8290: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 64 L;. char *CAd
82a0: 69 72 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ir.. = NU
82b0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 LL;. char *DH
82c0: 70 61 72 61 6d 73 09 20 20 20 20 20 20 20 20 3d params. =
82d0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
82e0: 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20 20 20 20 *model..
82f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
8300: 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 20 20 20 *servername.
8310: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 = NULL;./*
8320: 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 hostname for Ser
8330: 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 ver Name Indicat
8340: 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 ion */. const
8350: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
8360: 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c session_id = NUL
8370: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
8380: 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 alpn..= NULL;.
8390: 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 int ssl2 = 0,
83a0: 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e ssl3 = 0;. in
83b0: 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 t tls1 = 1, tls1
83c0: 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d _1 = 1, tls1_2 =
83d0: 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 1, tls1_3 = 1;.
83e0: 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 int proto =
83f0: 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 0, level = -1;.
8400: 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 int verify =
8410: 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 0, require = 0,
8420: 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 request = 1, pos
8430: 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b t_handshake = 0;
8440: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
8450: 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 4f 50 alled");..#if OP
8460: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
8470: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
8480: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 0L && !defined(O
8490: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 20 PENSSL_NO_SSL2)
84a0: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 && !defined(NO_S
84b0: 53 4c 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 SL2) && defined(
84c0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 66 69 NO_SSL3) && defi
84d0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 ned(NO_TLS1) &&
84e0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
84f0: 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 1) && defined(NO
8500: 5f 54 4c 53 31 5f 32 29 20 26 26 20 64 65 66 69 _TLS1_2) && defi
8510: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 ned(NO_TLS1_3).
8520: 20 20 20 73 73 6c 32 20 3d 20 31 3b 0a 23 65 6e ssl2 = 1;.#en
8530: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
8540: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
8550: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f ) && !defined(NO
8560: 5f 53 53 4c 33 29 20 26 26 20 64 65 66 69 6e 65 _SSL3) && define
8570: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 d(NO_SSL2) && de
8580: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 fined(NO_TLS1) &
8590: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 & defined(NO_TLS
85a0: 31 5f 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 1_1) && defined(
85b0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 64 65 NO_TLS1_2) && de
85c0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
85d0: 0a 20 20 20 20 73 73 6c 33 20 3d 20 31 3b 0a 23 . ssl3 = 1;.#
85e0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
85f0: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 d(NO_TLS1) || de
8600: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8610: 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 _TLS1). tls1
8620: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 0;.#endif.#if
8630: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
8640: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
8650: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
8660: 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b . tls1_1 = 0;
8670: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
8680: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c ned(NO_TLS1_2) |
8690: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
86a0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 L_NO_TLS1_2).
86b0: 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e tls1_2 = 0;.#en
86c0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
86d0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
86e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
86f0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 _TLS1_3). tls
8700: 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 1_3 = 0;.#endif.
8710: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 . if (objc <
8720: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
8730: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
8740: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c , objv, "channel
8750: 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 ?options?");..r
8760: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8770: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
8780: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
8790: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
87a0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
87b0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 , Tcl_GetStringF
87c0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 romObj(objv[1],
87d0: 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 NULL), NULL);.
87e0: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 if (chan == (T
87f0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
8800: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
8810: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
8820: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 /* Make sure t
8830: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
8840: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
8850: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 */. chan = T
8860: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
8870: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 (chan);.. for
8880: 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c (idx = 2; idx <
8890: 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a objc; idx++) {.
88a0: 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c .char *opt = Tcl
88b0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
88c0: 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c j(objv[idx], NUL
88d0: 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d L);...if (opt[0]
88e0: 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 != '-').. br
88f0: 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d eak;...OPTOBJ("-
8900: 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f alpn", alpn);..O
8910: 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20 PTSTR("-cadir",
8920: 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 CAdir);..OPTSTR(
8930: 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 6c "-cafile", CAfil
8940: 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 e);..OPTBYTE("-c
8950: 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72 74 ert", cert, cert
8960: 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 _len);..OPTSTR("
8970: 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74 -certfile", cert
8980: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 file);..OPTSTR("
8990: 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 -cipher", cipher
89a0: 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 s);..OPTSTR("-ci
89b0: 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 29 phers", ciphers)
89c0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 ;..OPTSTR("-ciph
89d0: 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 65 ersuites", ciphe
89e0: 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 rsuites);..OPTOB
89f0: 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 J("-command", sc
8a00: 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 ript);..OPTSTR("
8a10: 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61 -dhparams", DHpa
8a20: 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 rams);..OPTBYTE(
8a30: 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 "-key", key, key
8a40: 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 _len);..OPTSTR("
8a50: 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 -keyfile", keyfi
8a60: 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d le);..OPTSTR("-m
8a70: 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 odel", model);..
8a80: 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 OPTOBJ("-passwor
8a90: 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 d", password);..
8aa0: 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 OPTBOOL("-post_h
8ab0: 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f andshake", post_
8ac0: 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 handshake);..OPT
8ad0: 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 2c BOOL("-request",
8ae0: 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 request);..OPTB
8af0: 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c 20 OOL("-require",
8b00: 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e require);..OPTIN
8b10: 54 28 22 2d 73 65 63 75 72 69 74 79 6c 65 76 65 T("-securityleve
8b20: 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 l", level);..OPT
8b30: 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 BOOL("-server",
8b40: 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 server);..OPTSTR
8b50: 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 ("-servername",
8b60: 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 servername);..OP
8b70: 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 TSTR("-session_i
8b80: 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b d", session_id);
8b90: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 ..OPTBOOL("-ssl2
8ba0: 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f ", ssl2);..OPTBO
8bb0: 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 OL("-ssl3", ssl3
8bc0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
8bd0: 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 s1", tls1);..OPT
8be0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 BOOL("-tls1.1",
8bf0: 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f tls1_1);..OPTBOO
8c00: 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 L("-tls1.2", tls
8c10: 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 1_2);..OPTBOOL("
8c20: 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 -tls1.3", tls1_3
8c30: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c );..OPTOBJ("-val
8c40: 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 idatecommand", v
8c50: 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d cmd);..OPTOBJ("-
8c60: 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 vcmd", vcmd);...
8c70: 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c OPTBAD("option",
8c80: 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c "-alpn, -cadir,
8c90: 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c -cafile, -cert,
8ca0: 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 -certfile, -cip
8cb0: 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 her, -ciphersuit
8cc0: 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 es, -command, -d
8cd0: 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d hparams, -key, -
8ce0: 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c keyfile, -model,
8cf0: 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 -password, -pos
8d00: 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 t_handshake, -re
8d10: 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c quest, -require,
8d20: 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c 2c -securitylevel,
8d30: 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 -server, -serve
8d40: 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f rname, -session_
8d50: 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 id, -ssl2, -ssl3
8d60: 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 , -tls1, -tls1.1
8d70: 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 , -tls1.2, -tls1
8d80: 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 .3, or -validate
8d90: 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 command");...ret
8da0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
8db0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 }. if (req
8dc0: 75 65 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d uest)..verify |=
8dd0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 SSL_VERIFY_CLIE
8de0: 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 NT_ONCE | SSL_VE
8df0: 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 RIFY_PEER;. i
8e00: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72 65 f (request && re
8e10: 71 75 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d quire).verify |=
8e20: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
8e30: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
8e40: 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 ;. if (reques
8e50: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 t && post_handsh
8e60: 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 ake).verify |= S
8e70: 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 SL_VERIFY_POST_H
8e80: 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 ANDSHAKE;. if
8e90: 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 (verify == 0)..
8ea0: 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 verify = SSL_VER
8eb0: 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 IFY_NONE;.. p
8ec0: 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 roto |= (ssl2 ?
8ed0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a TLS_PROTO_SSL2 :
8ee0: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
8ef0: 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 = (ssl3 ? TLS_PR
8f00: 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 OTO_SSL3 : 0);.
8f10: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 proto |= (tls
8f20: 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 1 ? TLS_PROTO_TL
8f30: 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f S1 : 0);. pro
8f40: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 to |= (tls1_1 ?
8f50: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
8f60: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f : 0);. proto
8f70: 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c |= (tls1_2 ? TL
8f80: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a S_PROTO_TLS1_2 :
8f90: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
8fa0: 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f = (tls1_3 ? TLS_
8fb0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 PROTO_TLS1_3 : 0
8fc0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 );.. /* reset
8fd0: 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e to NULL if blan
8fe0: 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 k string provide
8ff0: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 d */. if (cer
9000: 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 t && !*cert)..
9010: 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20 20 cert.
9020: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
9030: 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 f (key && !*key)
9040: 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 .. key.
9050: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
9060: 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 if (certfile &
9070: 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 & !*certfile)
9080: 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d certfile.=
9090: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b NULL;. if (k
90a0: 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 eyfile && !*keyf
90b0: 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 ile)..keyfile.
90c0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
90d0: 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 if (ciphers &&
90e0: 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 !*ciphers).
90f0: 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20 20 ciphers.
9100: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
9110: 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65 73 if (ciphersuites
9120: 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 && !*ciphersuit
9130: 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65 73 es) ciphersuites
9140: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
9150: 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a if (CAfile && !*
9160: 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 CAfile).
9170: 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d CAfile. =
9180: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 NULL;. if (C
9190: 41 64 69 72 20 26 26 20 21 2a 43 41 64 69 72 29 Adir && !*CAdir)
91a0: 09 20 20 20 20 20 20 20 20 43 41 64 69 72 09 20 . CAdir.
91b0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
91c0: 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 if (DHparams
91d0: 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09 20 && !*DHparams).
91e0: 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73 20 DHparams
91f0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a = NULL;..
9200: 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 /* new SSL s
9210: 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 tate */. stat
9220: 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20 2a ePtr..= (State *
9230: 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 ) ckalloc((unsig
9240: 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61 74 ned) sizeof(Stat
9250: 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 e));. memset(
9260: 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a statePtr, 0, siz
9270: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 eof(State));..
9280: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 statePtr->flag
9290: 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 s.= flags;. s
92a0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 tatePtr->interp.
92b0: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 = interp;. st
92c0: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d atePtr->vflags.=
92d0: 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74 61 verify;. sta
92e0: 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b tePtr->err.= "";
92f0: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 .. /* allocat
9300: 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 e script */.
9310: 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09 28 if (script) {..(
9320: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 void) Tcl_GetStr
9330: 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 ingFromObj(scrip
9340: 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c t, &len);..if (l
9350: 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 en) {.. state
9360: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 Ptr->callback =
9370: 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63 6c script;.. Tcl
9380: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _IncrRefCount(st
9390: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
93a0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
93b0: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 /* allocate pas
93c0: 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 sword */. if
93d0: 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 (password) {..(v
93e0: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 oid) Tcl_GetStri
93f0: 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f ngFromObj(passwo
9400: 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 rd, &len);..if (
9410: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 len) {.. stat
9420: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
9430: 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 password;..
9440: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
9450: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
9460: 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a ord);..}. }..
9470: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 /* allocate
9480: 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 validate command
9490: 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d 64 */. if (vcmd
94a0: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f ) {..(void) Tcl_
94b0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
94c0: 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 (vcmd, &len);..i
94d0: 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 f (len) {.. s
94e0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 tatePtr->vcmd =
94f0: 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 vcmd;.. Tcl_I
9500: 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ncrRefCount(stat
9510: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a ePtr->vcmd);..}.
9520: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d }.. if (m
9530: 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a odel != NULL) {.
9540: 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 .int mode;../* G
9550: 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 et the "model" c
9560: 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 ontext */..chan
9570: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
9580: 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 (interp, model,
9590: 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61 &mode);..if (cha
95a0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
95b0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 l) NULL) {..
95c0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
95d0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
95e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
95f0: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 OR;..}.../*.. *
9600: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
9610: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
9620: 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f ost channel.. */
9630: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 ..chan = Tcl_Get
9640: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
9650: 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 ;..if (Tcl_GetCh
9660: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
9670: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
9680: 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c pe()) {.. Tcl
9690: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
96a0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
96b0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
96c0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
96d0: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 ,..."\": not a T
96e0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
96f0: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
9700: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
9710: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
9720: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
9730: 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a .ctx = ((State *
9740: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 )Tcl_GetChannelI
9750: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e nstanceData(chan
9760: 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 ))->ctx;. } e
9770: 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 lse {..if ((ctx
9780: 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 = CTX_Init(state
9790: 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f Ptr, server, pro
97a0: 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 to, keyfile, cer
97b0: 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 tfile, key, cert
97c0: 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 , key_len,..
97d0: 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c cert_len, CAdir,
97e0: 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 CAfile, ciphers
97f0: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 , ciphersuites,
9800: 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 level, DHparams)
9810: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 ) == NULL) {..
9820: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
9830: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
9840: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
9850: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a RROR;..}. }..
9860: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 statePtr->ct
9870: 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a x = ctx;.. /*
9880: 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 . * We need
9890: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 to make sure tha
98a0: 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f t the channel wo
98b0: 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 rks in binary (f
98c0: 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e or the. * en
98d0: 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 cryption not to
98e0: 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a get goofed up)..
98f0: 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 * We only w
9900: 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 ant to adjust th
9910: 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 e buffering in p
9920: 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 re-v2 channels,
9930: 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 where. * eac
9940: 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 h channel in the
9950: 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 stack maintaine
9960: 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 d its own buffer
9970: 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 s.. */. T
9980: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
9990: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
99a0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 slation);. Tc
99b0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
99c0: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
99d0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ing);. Tcl_DS
99e0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
99f0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
9a00: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
9a10: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
9a20: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 elEncoding);.
9a30: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
9a40: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
9a50: 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 an, "-eofchar",
9a60: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
9a70: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 Char);. Tcl_G
9a80: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
9a90: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
9aa0: 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 encoding", &uppe
9ab0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
9ac0: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
9ad0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
9ae0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e rp, chan, "-tran
9af0: 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 slation", &upper
9b00: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
9b10: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 on);. Tcl_Get
9b20: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
9b30: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c terp, chan, "-bl
9b40: 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 ocking", &upperC
9b50: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b hannelBlocking);
9b60: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
9b70: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
9b80: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c , chan, "-transl
9b90: 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 ation", "binary"
9ba0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
9bb0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
9bc0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 rp, chan, "-bloc
9bd0: 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a king", "true");.
9be0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e dprintf("Con
9bf0: 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e suming Tcl chann
9c00: 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 el %s", Tcl_GetC
9c10: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
9c20: 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d );. statePtr-
9c30: 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 >self = Tcl_Stac
9c40: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c kChannel(interp,
9c50: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
9c60: 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 (), (ClientData)
9c70: 20 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f statePtr, (TCL_
9c80: 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 READABLE | TCL_W
9c90: 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b RITABLE), chan);
9ca0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 . dprintf("Cr
9cb0: 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 eated channel na
9cc0: 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 med %s", Tcl_Get
9cd0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
9ce0: 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 ePtr->self));.
9cf0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
9d00: 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 self == (Tcl_Cha
9d10: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f nnel) NULL) {../
9d20: 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 *.. * No use of
9d30: 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 Tcl_EventuallyFr
9d40: 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f ee because no po
9d50: 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 ssible Tcl_Prese
9d60: 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 rve... */..Tls_F
9d70: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
9d80: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 tePtr);..return
9d90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
9da0: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 .. Tcl_SetCha
9db0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
9dc0: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
9dd0: 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e f, "-translation
9de0: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 ", Tcl_DStringVa
9df0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 lue(&upperChanne
9e00: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a lTranslation));.
9e10: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
9e20: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
9e30: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
9e40: 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 "-encoding", Tc
9e50: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
9e60: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
9e70: 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f ding));. Tcl_
9e80: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
9e90: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
9ea0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 r->self, "-eofch
9eb0: 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 ar", Tcl_DString
9ec0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
9ed0: 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 nelEOFChar));.
9ee0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
9ef0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 Option(interp, s
9f00: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 tatePtr->self, "
9f10: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f -blocking", Tcl_
9f20: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
9f30: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 perChannelBlocki
9f40: 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ng));.. /*.
9f50: 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c * SSL Initial
9f60: 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a ization. */.
9f70: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 statePtr->ss
9f80: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 l = SSL_new(stat
9f90: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 ePtr->ctx);.
9fa0: 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 if (!statePtr->s
9fb0: 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 sl) {../* SSL li
9fc0: 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 brary error */..
9fd0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
9fe0: 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e (interp, "couldn
9ff0: 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 't construct ssl
a000: 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41 session: ", REA
a010: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
a020: 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 NULL);..Tls_Free
a030: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
a040: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c tr);..return TCL
a050: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
a060: 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 /* Set host s
a070: 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 erver name */.
a080: 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d 65 if (servername
a090: 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 ) {../* Sets the
a0a0: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 server name ind
a0b0: 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e ication (SNI) in
a0c0: 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 ClientHello ext
a0d0: 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 ension */../* Pe
a0e0: 72 20 52 46 43 20 36 30 36 36 2c 20 68 6f 73 74 r RFC 6066, host
a0f0: 6e 61 6d 65 20 69 73 20 61 20 41 53 43 49 49 20 name is a ASCII
a100: 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2e 20 encoded string.
a110: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 */..if (!SSL_set
a120: 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d _tlsext_host_nam
a130: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c e(statePtr->ssl,
a140: 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 servername) &&
a150: 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 require) {..
a160: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
a170: 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e (interp, "settin
a180: 67 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20 g TLS host name
a190: 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 extension failed
a1a0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
a1b0: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 );.. Tls_Free
a1c0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
a1d0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
a1e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
a1f0: 09 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 73 65 ./* Configure se
a200: 72 76 65 72 20 68 6f 73 74 20 6e 61 6d 65 20 63 rver host name c
a210: 68 65 63 6b 73 20 69 6e 20 74 68 65 20 53 53 4c hecks in the SSL
a220: 20 63 6c 69 65 6e 74 2e 20 53 65 74 20 44 4e 53 client. Set DNS
a230: 20 68 6f 73 74 6e 61 6d 65 20 74 6f 0a 09 20 20 hostname to..
a240: 20 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63 name for peer c
a250: 65 72 74 69 66 69 63 61 74 65 20 63 68 65 63 6b ertificate check
a260: 73 2e 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 s. SSL_set1_host
a270: 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 has limitations
a280: 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 . */..if (!SSL_a
a290: 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 dd1_host(statePt
a2a0: 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 r->ssl, serverna
a2b0: 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f me)) {.. Tcl_
a2c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
a2d0: 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 44 4e erp, "setting DN
a2e0: 53 20 68 6f 73 74 20 6e 61 6d 65 20 66 61 69 6c S host name fail
a2f0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
a300: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
a310: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
a320: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
a330: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
a340: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 . }.. /* R
a350: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 esume session id
a360: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 */. if (sess
a370: 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e ion_id && strlen
a380: 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 (session_id) <=
a390: 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f SSL_MAX_SID_CTX_
a3a0: 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 LENGTH) {../* SS
a3b0: 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 L_set_session()
a3c0: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 */..if (!SSL_SES
a3d0: 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e SION_set1_id_con
a3e0: 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 text(SSL_get_ses
a3f0: 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 sion(statePtr->s
a400: 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c sl), session_id,
a410: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 (unsigned int)
a420: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 strlen(session_i
a430: 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f d))) {.. Tcl_
a440: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
a450: 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 erp, "Resume ses
a460: 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 73 69 sion id ", sessi
a470: 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 64 22 on_id, " failed"
a480: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
a490: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6c ;. Tl
a4a0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
a4b0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 statePtr);.
a4c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 return TC
a4d0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 L_ERROR;..}.
a4e0: 7d 0a 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 }.. if (alpn)
a4f0: 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 {../* Convert a
a500: 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 TCL list into a
a510: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 protocol-list i
a520: 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f n wire-format */
a530: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
a540: 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e *protos, *p;..un
a550: 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f signed int proto
a560: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 s_len = 0;..int
a570: 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 i, len, cnt;..Tc
a580: 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 l_Obj **list;...
a590: 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 if (Tcl_ListObjG
a5a0: 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 etElements(inter
a5b0: 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 p, alpn, &cnt, &
a5c0: 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 list) != TCL_OK)
a5d0: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
a5e0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
a5f0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
a600: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
a610: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 ./* Determine th
a620: 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 e memory require
a630: 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 d for the protoc
a640: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 ol-list */..for
a650: 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b (i = 0; i < cnt;
a660: 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c i++) {.. Tcl
a670: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
a680: 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 j(list[i], &len)
a690: 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e ;.. if (len >
a6a0: 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 255) {...Tcl_Ap
a6b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
a6c0: 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f p, "ALPN protoco
a6d0: 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 l name too long"
a6e0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
a6f0: 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63 68 ;...Tls_Free((ch
a700: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
a710: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
a720: 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 ROR;.. }..
a730: 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 protos_len += 1
a740: 20 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 + len;..}.../*
a750: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 Build the comple
a760: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 te protocol-list
a770: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b */..protos = ck
a780: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e alloc(protos_len
a790: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d );../* protocol-
a7a0: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 lists consist of
a7b0: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 8-bit length-pr
a7c0: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 efixed, byte str
a7d0: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 69 20 ings */..for (i
a7e0: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b = 0, p = protos;
a7f0: 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b i < cnt; i++) {
a800: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 .. char *str
a810: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
a820: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 romObj(list[i],
a830: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b &len);.. *p++
a840: 20 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d = len;.. mem
a850: 63 70 79 28 70 2c 20 73 74 72 2c 20 6c 65 6e 29 cpy(p, str, len)
a860: 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b ;.. p += len;
a870: 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 ..}.../* SSL_set
a880: 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b _alpn_protos mak
a890: 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 es a copy of the
a8a0: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a protocol-list *
a8b0: 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 /../* Note: This
a8c0: 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 functions rever
a8d0: 73 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 ses the return v
a8e0: 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 alue convention
a8f0: 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f */..if (SSL_set_
a900: 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 alpn_protos(stat
a910: 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f ePtr->ssl, proto
a920: 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 s, protos_len))
a930: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
a940: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
a950: 22 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 41 "failed to set A
a960: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 LPN protocols",
a970: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
a980: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
a990: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
a9a0: 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72 ;.. ckfree(pr
a9b0: 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75 otos);.. retu
a9c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
a9d0: 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 .../* Store prot
a9e0: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 ocols list */..s
a9f0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
aa00: 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 = protos;..state
aa10: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 Ptr->protos_len
aa20: 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 = protos_len;.
aa30: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 } else {..stat
aa40: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e ePtr->protos = N
aa50: 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e ULL;..statePtr->
aa60: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a protos_len = 0;.
aa70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
aa80: 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 * SSL Callbac
aa90: 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 ks. */. S
aaa0: 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_set_app_data(
aab0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 statePtr->ssl, (
aac0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
aad0: 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 ;./* point back
aae0: 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c to us */. SSL
aaf0: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 _set_verify(stat
ab00: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 ePtr->ssl, verif
ab10: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 y, VerifyCallbac
ab20: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f k);. SSL_set_
ab30: 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 info_callback(st
ab40: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 atePtr->ssl, Inf
ab50: 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 oCallback);..
ab60: 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 /* Create Tcl_C
ab70: 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c hannel BIO Handl
ab80: 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 er */. stateP
ab90: 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f tr->p_bio.= BIO_
aba0: 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 new_tcl(statePtr
abb0: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a , BIO_NOCLOSE);.
abc0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 statePtr->bi
abd0: 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f o.= BIO_new(BIO_
abe0: 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 f_ssl());.. i
abf0: 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a f (server) {../*
ac00: 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b Server callback
ac10: 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 s */..SSL_CTX_se
ac20: 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e t_tlsext_servern
ac30: 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 ame_arg(statePtr
ac40: 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 ->ctx, (void *)s
ac50: 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 tatePtr);..SSL_C
ac60: 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 TX_set_tlsext_se
ac70: 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 rvername_callbac
ac80: 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c k(statePtr->ctx,
ac90: 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 SNICallback);..
aca0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 SSL_CTX_set_clie
acb0: 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 nt_hello_cb(stat
acc0: 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f ePtr->ctx, Hello
acd0: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 Callback, (void
ace0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 *)statePtr);..if
acf0: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 (statePtr->prot
ad00: 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 os != NULL) {..
ad10: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 SSL_CTX_set_a
ad20: 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 lpn_select_cb(st
ad30: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 atePtr->ctx, ALP
ad40: 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 NCallback, (void
ad50: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 *)statePtr);.#i
ad60: 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 fdef USE_NPN..
ad70: 20 20 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 if (tls1_2 ==
ad80: 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 0 && tls1_3 == 0
ad90: 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 ) {...SSL_CTX_se
ada0: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 t_next_protos_ad
adb0: 76 65 72 74 69 73 65 64 5f 63 62 28 73 74 61 74 vertised_cb(stat
adc0: 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 ePtr->ctx, NPNCa
add0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
ade0: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
adf0: 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a }.#endif..}.../*
ae00: 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72 20 74 Enable server t
ae10: 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65 71 75 o send cert requ
ae20: 65 73 74 20 61 66 74 65 72 20 68 61 6e 64 73 68 est after handsh
ae30: 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c ake (TLS 1.3 onl
ae40: 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 y) */../* A writ
ae50: 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 e operation must
ae60: 20 74 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 take place for
ae70: 74 68 65 20 43 65 72 74 69 66 69 63 61 74 65 20 the Certificate
ae80: 52 65 71 75 65 73 74 20 74 6f 20 62 65 0a 09 20 Request to be..
ae90: 20 20 73 65 6e 74 20 74 6f 20 74 68 65 20 63 6c sent to the cl
aea0: 69 65 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 62 ient, this can b
aeb0: 65 20 64 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f e done with SSL_
aec0: 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 do_handshake().
aed0: 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 */..if (request
aee0: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b && post_handshak
aef0: 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 e) {.. SSL_ve
af00: 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 rify_client_post
af10: 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65 _handshake(state
af20: 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 Ptr->ssl);..}...
af30: 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f /* Set server mo
af40: 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d de */..statePtr-
af50: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 >flags |= TLS_TC
af60: 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 L_SERVER;..SSL_s
af70: 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 et_accept_state(
af80: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
af90: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a } else {../*
afa0: 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b Client callback
afb0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f s */.#ifdef USE_
afc0: 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 NPN..if (statePt
afd0: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c r->protos != NUL
afe0: 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 L && tls1_2 == 0
aff0: 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 && tls1_3 == 0)
b000: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f {.. SSL_CTX_
b010: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 set_next_proto_s
b020: 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 elect_cb(statePt
b030: 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c r->ctx, ALPNCall
b040: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 back, (void *)st
b050: 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 atePtr);..}.#end
b060: 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 if.../* Session
b070: 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f caching */..SSL_
b080: 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f CTX_set_session_
b090: 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 cache_mode(state
b0a0: 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 Ptr->ctx, SSL_SE
b0b0: 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 SS_CACHE_CLIENT
b0c0: 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 | SSL_SESS_CACHE
b0d0: 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f _NO_INTERNAL_STO
b0e0: 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 RE);..SSL_CTX_se
b0f0: 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 ss_set_new_cb(st
b100: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 atePtr->ctx, Ses
b110: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a sionCallback);..
b120: 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 ./* Enable post
b130: 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e handshake Authen
b140: 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 tication extensi
b150: 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 on. TLS 1.3 only
b160: 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f , not http/2. */
b170: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 ..if (request &&
b180: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 post_handshake)
b190: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f {.. SSL_set_
b1a0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 post_handshake_a
b1b0: 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 uth(statePtr->ss
b1c0: 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 l, 1);..}.../* S
b1d0: 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a et client mode *
b1e0: 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 /..SSL_set_conne
b1f0: 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 ct_state(statePt
b200: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 r->ssl);. }.
b210: 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 SSL_set_bio(s
b220: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 tatePtr->ssl, st
b230: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 atePtr->p_bio, s
b240: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b tatePtr->p_bio);
b250: 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c . BIO_set_ssl
b260: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 (statePtr->bio,
b270: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 statePtr->ssl, B
b280: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 IO_NOCLOSE);..
b290: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 /*. * End
b2a0: 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 of SSL Init.
b2b0: 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 */. dprintf(
b2c0: 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 "Returning %s",
b2d0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
b2e0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
b2f0: 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 f));. Tcl_Set
b300: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 Result(interp, (
b310: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 char *) Tcl_GetC
b320: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
b330: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f Ptr->self), TCL_
b340: 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 VOLATILE);..
b350: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
b360: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
b370: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
b380: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
b390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b3c0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d -----. *. * Unim
b3d0: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a portObjCmd --. *
b3e0: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
b3f0: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f re is invoked to
b400: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d remove the topm
b410: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 ost channel filt
b420: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
b430: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
b440: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
b450: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
b460: 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 . *.May modify t
b470: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 he behavior of a
b480: 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a n IO channel.. *
b490: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
b4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b4d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
b4e0: 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 c int.UnimportOb
b4f0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
b500: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
b510: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
b520: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
b530: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
b540: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e {. Tcl_Chann
b550: 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 el chan;../* The
b560: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 channel to set
b570: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 a mode on. */..
b580: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
b590: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
b5a0: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
b5b0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
b5c0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
b5d0: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
b5e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
b5f0: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
b600: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
b610: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 nterp, Tcl_GetSt
b620: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e ring(objv[1]), N
b630: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 ULL);. if (ch
b640: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
b650: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
b660: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
b670: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b }.. /* Mak
b680: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
b690: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
b6a0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
b6b0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
b6c0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
b6d0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
b6e0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
b6f0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
b700: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
b710: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
b720: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
b730: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
b740: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
b750: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 .."\": not a TLS
b760: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 channel", NULL)
b770: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
b780: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
b790: 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 if (Tcl_UnstackC
b7a0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 hannel(interp, c
b7b0: 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f han) == TCL_ERRO
b7c0: 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c R) {..return TCL
b7d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
b7e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
b7f0: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
b800: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
b810: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
b820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b850: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
b860: 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 TX_Init -- const
b870: 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 ruct a SSL_CTX i
b880: 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 nstance. *. * Re
b890: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 sults:. *.A vali
b8a0: 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e d SSL_CTX instan
b8b0: 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 ce or NULL.. *.
b8c0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
b8d0: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 *.constructs SS
b8e0: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a L context (CTX).
b8f0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
b900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b930: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
b940: 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 tic SSL_CTX *.CT
b950: 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 X_Init(State *st
b960: 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 atePtr, int isSe
b970: 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c rver, int proto,
b980: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 char *keyfile,
b990: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a char *certfile,.
b9a0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
b9b0: 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 r *key, unsigned
b9c0: 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 char *cert, int
b9d0: 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 key_len, int ce
b9e0: 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 rt_len, char *CA
b9f0: 64 69 72 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 dir,. char *C
ba00: 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 Afile, char *cip
ba10: 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68 hers, char *ciph
ba20: 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 ersuites, int le
ba30: 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72 vel, char *DHpar
ba40: 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 ams) {. Tcl_I
ba50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 nterp *interp =
ba60: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
ba70: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 ;. SSL_CTX *c
ba80: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 tx = NULL;. T
ba90: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 cl_DString ds;.
baa0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 Tcl_DString d
bab0: 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 s1;. int off
bac0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 = 0;. int loa
bad0: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 d_private_key;.
bae0: 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 const SSL_MET
baf0: 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 HOD *method;..
bb00: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
bb10: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 d");.. if (!p
bb20: 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 roto) {..Tcl_App
bb30: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
bb40: 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 , "no valid prot
bb50: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 ocol selected",
bb60: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
bb70: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
bb80: 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f /* create SSL co
bb90: 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 ntext */.#if OPE
bba0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
bbb0: 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 BER >= 0x1010000
bbc0: 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 0L || defined(NO
bbd0: 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL2) || define
bbe0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
bbf0: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 2). if (ENABL
bc00: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
bc10: 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 OTO_SSL2)) {..Tc
bc20: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
bc30: 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f nterp, "SSL2 pro
bc40: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
bc50: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ted", NULL);..re
bc60: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
bc70: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
bc80: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 ned(NO_SSL3) ||
bc90: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
bca0: 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 NO_SSL3). if
bcb0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
bcc0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 TLS_PROTO_SSL3))
bcd0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
bce0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 sult(interp, "SS
bcf0: 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 L3 protocol not
bd00: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
bd10: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
bd20: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 . }.#endif.#i
bd30: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
bd40: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
bd50: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 ENSSL_NO_TLS1).
bd60: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
bd70: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
bd80: 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 TLS1)) {..Tcl_Ap
bd90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
bda0: 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 p, "TLS 1.0 prot
bdb0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
bdc0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
bdd0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
bde0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
bdf0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
be00: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
be10: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 _NO_TLS1_1).
be20: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
be30: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
be40: 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 1_1)) {..Tcl_App
be50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
be60: 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f , "TLS 1.1 proto
be70: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
be80: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 d", NULL);..retu
be90: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
bea0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
beb0: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 d(NO_TLS1_2) ||
bec0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
bed0: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 NO_TLS1_2). i
bee0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
bef0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
bf00: 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 _2)) {..Tcl_Appe
bf10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
bf20: 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 "TLS 1.2 protoc
bf30: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
bf40: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
bf50: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
bf60: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
bf70: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 (NO_TLS1_3) || d
bf80: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
bf90: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 O_TLS1_3). if
bfa0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
bfb0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
bfc0: 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 3)) {..Tcl_Appen
bfd0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
bfe0: 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f "TLS 1.3 protoco
bff0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
c000: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
c010: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
c020: 64 69 66 0a 0a 20 20 20 20 73 77 69 74 63 68 20 dif.. switch
c030: 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 (proto) {.#if OP
c040: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
c050: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
c060: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
c070: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
c080: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
c090: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c SL2). case TL
c0a0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d S_PROTO_SSL2:..m
c0b0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
c0c0: 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 72 5f ? SSLv2_server_
c0d0: 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 method() : SSLv2
c0e0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
c0f0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
c100: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
c110: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
c120: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
c130: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
c140: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f OPENSSL_NO_SSL3_
c150: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 METHOD). case
c160: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a TLS_PROTO_SSL3:
c170: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
c180: 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 ver ? SSLv3_serv
c190: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 er_method() : SS
c1a0: 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f Lv3_client_metho
c1b0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
c1c0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
c1d0: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 (NO_TLS1) && !de
c1e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
c1f0: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
c200: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
c210: 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 S1_METHOD). c
c220: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
c230: 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 S1:..method = is
c240: 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 Server ? TLSv1_s
c250: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
c260: 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 TLSv1_client_me
c270: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
c280: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
c290: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 ned(NO_TLS1_1) &
c2a0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
c2b0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 SL_NO_TLS1_1) &&
c2c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
c2d0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 L_NO_TLS1_1_METH
c2e0: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 OD). case TLS
c2f0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 _PROTO_TLS1_1:..
c300: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
c310: 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 r ? TLSv1_1_serv
c320: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c er_method() : TL
c330: 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 Sv1_1_client_met
c340: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 hod();..break;.#
c350: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
c360: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 ed(NO_TLS1_2) &&
c370: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
c380: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 L_NO_TLS1_2) &&
c390: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
c3a0: 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f _NO_TLS1_2_METHO
c3b0: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
c3c0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d PROTO_TLS1_2:..m
c3d0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
c3e0: 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 ? TLSv1_2_serve
c3f0: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 r_method() : TLS
c400: 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 v1_2_client_meth
c410: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
c420: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
c430: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 d(NO_TLS1_3) &&
c440: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
c450: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
c460: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
c470: 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 LS1_3:../* Use t
c480: 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f he generic metho
c490: 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 d and constraint
c4a0: 20 72 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e range after con
c4b0: 74 65 78 74 20 69 73 20 63 72 65 61 74 65 64 20 text is created
c4c0: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 */..method = isS
c4d0: 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 erver ? TLS_serv
c4e0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c er_method() : TL
c4f0: 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 S_client_method(
c500: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
c510: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 f. default:..
c520: 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 /* Negotiate hig
c530: 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 hest available S
c540: 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a SL/TLS version *
c550: 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 /..method = isSe
c560: 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 rver ? TLS_serve
c570: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 r_method() : TLS
c580: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
c590: 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
c5a0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
c5b0: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
c5c0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
c5d0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
c5e0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 SSL_NO_SSL2)..of
c5f0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
c600: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 oto, TLS_PROTO_S
c610: 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c SL2) ? 0 : SSL
c620: 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 _OP_NO_SSLv2);.#
c630: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
c640: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 ed(NO_SSL3) && !
c650: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
c660: 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d NO_SSL3)..off |=
c670: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
c680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 TLS_PROTO_SSL3)
c690: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f ? 0 : SSL_OP_
c6a0: 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 NO_SSLv3);.#endi
c6b0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
c6c0: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
c6d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
c6e0: 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e LS1)..off |= (EN
c6f0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
c700: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f _PROTO_TLS1) ?
c710: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
c720: 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 LSv1);.#endif.#i
c730: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
c740: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
c750: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
c760: 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 1_1)..off |= (EN
c770: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
c780: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f _PROTO_TLS1_1) ?
c790: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
c7a0: 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a LSv1_1);.#endif.
c7b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
c7c0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
c7d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
c7e0: 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 LS1_2)..off |= (
c7f0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
c800: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 LS_PROTO_TLS1_2)
c810: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
c820: 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 _TLSv1_2);.#endi
c830: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
c840: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 O_TLS1_3) && !de
c850: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
c860: 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d _TLS1_3)..off |=
c870: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
c880: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
c890: 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 3) ? 0 : SSL_OP_
c8a0: 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e NO_TLSv1_3);.#en
c8b0: 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 dif..break;.
c8c0: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
c8d0: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 _error();.. c
c8e0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
c8f0: 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 (method);. if
c900: 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 (!ctx) {..retur
c910: 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a n(NULL);. }..
c920: 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28 53 if (getenv(S
c930: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b SLKEYLOGFILE)) {
c940: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 ..SSL_CTX_set_ke
c950: 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 ylog_callback(ct
c960: 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 x, KeyLogCallbac
c970: 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 k);. }..#if !
c980: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
c990: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
c9a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
c9b0: 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 ). if (proto
c9c0: 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 == TLS_PROTO_TLS
c9d0: 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 1_3) {..SSL_CTX_
c9e0: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 set_min_proto_ve
c9f0: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f rsion(ctx, TLS1_
ca00: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 3_VERSION);..SSL
ca10: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f _CTX_set_max_pro
ca20: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 to_version(ctx,
ca30: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b TLS1_3_VERSION);
ca40: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 . }.#endif..
ca50: 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 /* Force ciph
ca60: 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 er selection ord
ca70: 65 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a er by server */.
ca80: 20 20 20 20 69 66 20 28 21 69 73 53 65 72 76 65 if (!isServe
ca90: 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 r) {..SSL_CTX_se
caa0: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 t_options(ctx, S
cab0: 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 SL_OP_CIPHER_SER
cac0: 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b VER_PREFERENCE);
cad0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53 53 4c 5f . }.. SSL_
cae0: 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 CTX_set_app_data
caf0: 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 (ctx, (void*)int
cb00: 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 erp);./* remembe
cb10: 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 r the interprete
cb20: 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 r */. SSL_CTX
cb30: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 _set_options(ctx
cb40: 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f , SSL_OP_ALL);./
cb50: 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f * all SSL bug wo
cb60: 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 rkarounds */.
cb70: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 SSL_CTX_set_opt
cb80: 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 ions(ctx, off);.
cb90: 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 ./* disable prot
cba0: 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f ocol versions */
cbb0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
cbc0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
cbd0: 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 10101000L. SS
cbe0: 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 L_CTX_set_mode(c
cbf0: 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 tx, SSL_MODE_AUT
cc00: 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e O_RETRY);./* han
cc10: 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b dle new handshak
cc20: 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 es in background
cc30: 2e 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 . On by default
cc40: 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 in OpenSSL 1.1.1
cc50: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 . */.#endif.
cc60: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 SSL_CTX_sess_set
cc70: 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c _cache_size(ctx,
cc80: 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 128);.. /* S
cc90: 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 et user defined
cca0: 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 ciphers, cipher
ccb0: 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 suites, and secu
ccc0: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 rity level */.
ccd0: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 if ((ciphers !
cce0: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f = NULL) && !SSL_
ccf0: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c CTX_set_cipher_l
cd00: 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 ist(ctx, ciphers
cd10: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
cd20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
cd30: 53 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c Set ciphers fail
cd40: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 ed: No valid cip
cd50: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 hers", (char *)
cd60: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f NULL);..SSL_CTX_
cd70: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 free(ctx);..retu
cd80: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 rn NULL;. }.
cd90: 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75 if ((ciphersu
cda0: 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 ites != NULL) &&
cdb0: 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 !SSL_CTX_set_ci
cdc0: 70 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 phersuites(ctx,
cdd0: 63 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b ciphersuites)) {
cde0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
cdf0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 lt(interp, "Set
ce00: 63 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61 cipher suites fa
ce10: 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 iled: No valid c
ce20: 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a iphers", (char *
ce30: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
ce40: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
ce50: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
ce60: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 .. /* Set sec
ce70: 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 urity level */.
ce80: 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d if (level > -
ce90: 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 1 && level < 6)
cea0: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 {../* SSL_set_se
ceb0: 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a curity_level */.
cec0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 .SSL_CTX_set_sec
ced0: 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c urity_level(ctx,
cee0: 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a level);. }..
cef0: 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 /* set some
cf00: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 callbacks */.
cf10: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 SSL_CTX_set_def
cf20: 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 ault_passwd_cb(c
cf30: 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c tx, PasswordCall
cf40: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 back);. SSL_C
cf50: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 TX_set_default_p
cf60: 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 asswd_cb_userdat
cf70: 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 a(ctx, (void *)s
cf80: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f tatePtr);.. /
cf90: 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d * read a Diffie-
cfa0: 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 Hellman paramete
cfb0: 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 rs file, or use
cfc0: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 the built-in one
cfd0: 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 */.#ifdef OPENS
cfe0: 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 SL_NO_DH. if
cff0: 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c (DHparams != NUL
d000: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
d010: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d020: 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 DH parameter sup
d030: 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 port not availab
d040: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 le", (char *) NU
d050: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 LL);..SSL_CTX_fr
d060: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e ee(ctx);..return
d070: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c NULL;. }.#el
d080: 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 se. {..DH* dh
d090: 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 ;..if (DHparams
d0a0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
d0b0: 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 BIO *bio;.. T
d0c0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
d0d0: 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 ds);.. bio =
d0e0: 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e BIO_new_file(F2N
d0f0: 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c (DHparams, &ds),
d100: 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 "r");.. if (
d110: 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 !bio) {...Tcl_DS
d120: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
d130: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
d140: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c lt(interp, "Coul
d150: 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 d not find DH pa
d160: 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 rameters file",
d170: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
d180: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
d190: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
d1a0: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 LL;.. }...
d1b0: 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 dh = PEM_read_b
d1c0: 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c io_DHparams(bio,
d1d0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c NULL, NULL, NUL
d1e0: 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 L);.. BIO_fre
d1f0: 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c e(bio);.. Tcl
d200: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
d210: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 );.. if (!dh)
d220: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 {...Tcl_AppendR
d230: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 esult(interp, "C
d240: 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 ould not read DH
d250: 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d parameters from
d260: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 file", (char *)
d270: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
d280: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
d290: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
d2a0: 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 }..} else {..
d2b0: 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50 61 72 dh = get_dhPar
d2c0: 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43 ams();..}..SSL_C
d2d0: 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 TX_set_tmp_dh(ct
d2e0: 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 x, dh);..DH_free
d2f0: 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 (dh);. }.#end
d300: 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f if.. /* set o
d310: 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a ur certificate *
d320: 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 /. load_priva
d330: 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 te_key = 0;.
d340: 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 if (certfile !=
d350: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 NULL) {..load_pr
d360: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a ivate_key = 1;..
d370: 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 .Tcl_DStringInit
d380: 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c (&ds);...if (SSL
d390: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 _CTX_use_certifi
d3a0: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 cate_file(ctx, F
d3b0: 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 2N(certfile, &ds
d3c0: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ), SSL_FILETYPE_
d3d0: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 PEM) <= 0) {..
d3e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
d3f0: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c e(&ds);.. Tcl
d400: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d410: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
d420: 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 set certificate
d430: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c file ", certfil
d440: 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 e, ": ",....
d450: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
d460: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
d470: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
d480: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
d490: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c ULL;..}. } el
d4a0: 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e se if (cert != N
d4b0: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 ULL) {..load_pri
d4c0: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 vate_key = 1;..i
d4d0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
d4e0: 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 ertificate_ASN1(
d4f0: 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 ctx, cert_len, c
d500: 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 ert) <= 0) {..
d510: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
d520: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c e(&ds);.. Tcl
d530: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d540: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
d550: 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 set certificate
d560: 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 : ",.... REA
d570: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
d580: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
d590: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
d5a0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
d5b0: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ..}. } else {
d5c0: 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 ..certfile = (ch
d5d0: 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 ar*)X509_get_def
d5e0: 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 ault_cert_file()
d5f0: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f ;...if (SSL_CTX_
d600: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f use_certificate_
d610: 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 file(ctx, certfi
d620: 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 le, SSL_FILETYPE
d630: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 _PEM) <= 0) {.#i
d640: 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 f 0.. Tcl_DSt
d650: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
d660: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
d670: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e sult(interp, "un
d680: 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 able to use defa
d690: 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20 ult certificate
d6a0: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 file ", certfile
d6b0: 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 , ": ",....
d6c0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
d6d0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
d6e0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
d6f0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
d700: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 LL;.#endif..}.
d710: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 }.. /* set
d720: 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 our private key
d730: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f */. if (load_
d740: 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 private_key) {..
d750: 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e if (keyfile == N
d760: 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 ULL && key == NU
d770: 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 LL) {.. keyfi
d780: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 le = certfile;..
d790: 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 }...if (keyfile
d7a0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
d7b0: 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61 /* get the priva
d7c0: 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 te key associate
d7d0: 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74 d with this cert
d7e0: 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 ificate */..
d7f0: 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e if (keyfile == N
d800: 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 ULL) {...keyfile
d810: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 = certfile;..
d820: 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 }... if (SS
d830: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 L_CTX_use_Privat
d840: 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 eKey_file(ctx, F
d850: 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2N(keyfile, &ds)
d860: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 , SSL_FILETYPE_P
d870: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 EM) <= 0) {...Tc
d880: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
d890: 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 s);.../* flush t
d8a0: 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 he passphrase wh
d8b0: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 ich might be lef
d8c0: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 t in the result
d8d0: 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 */...Tcl_SetResu
d8e0: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c lt(interp, NULL,
d8f0: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 TCL_STATIC);...
d900: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d910: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
d920: 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b to set public k
d930: 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 ey file ", keyfi
d940: 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 le, " ",....
d950: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 REASON(), (
d960: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
d970: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
d980: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c x);...return NUL
d990: 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 L;.. }.. T
d9a0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
d9b0: 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 ds);...} else if
d9c0: 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b (key != NULL) {
d9d0: 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 .. if (SSL_CT
d9e0: 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 X_use_PrivateKey
d9f0: 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 _ASN1(EVP_PKEY_R
da00: 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 SA, ctx, key,key
da10: 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 _len) <= 0) {...
da20: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
da30: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 &ds);.../* flush
da40: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 the passphrase
da50: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c which might be l
da60: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c eft in the resul
da70: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 t */...Tcl_SetRe
da80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c sult(interp, NUL
da90: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a L, TCL_STATIC);.
daa0: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
dab0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 lt(interp, "unab
dac0: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 le to set public
dad0: 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28 key: ", REASON(
dae0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
daf0: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 );...SSL_CTX_fre
db00: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e e(ctx);...return
db10: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d NULL;.. }..}
db20: 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 ../* Now we know
db30: 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 that a key and
db40: 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 cert have been s
db50: 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 et against.. * t
db60: 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a he SSL context *
db70: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f /..if (!SSL_CTX_
db80: 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 check_private_ke
db90: 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 y(ctx)) {.. T
dba0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
dbb0: 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 interp, "private
dbc0: 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 key does not ma
dbd0: 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 tch the certific
dbe0: 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c ate public key",
dbf0: 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a .... (char *
dc00: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 ) NULL);.. SS
dc10: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
dc20: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
dc30: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 L;..}. }..
dc40: 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63 61 /* Set verifica
dc50: 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 tion CAs */.
dc60: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
dc70: 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 &ds);. Tcl_DS
dc80: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b tringInit(&ds1);
dc90: 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 . if (!SSL_CT
dca0: 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f X_load_verify_lo
dcb0: 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e cations(ctx, F2N
dcc0: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 (CAfile, &ds), F
dcd0: 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29 29 2N(CAdir, &ds1))
dce0: 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 65 ||..!SSL_CTX_se
dcf0: 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 t_default_verify
dd00: 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a 23 _paths(ctx)) {.#
dd10: 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 6e if 0..Tcl_DStrin
dd20: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63 6c gFree(&ds);..Tcl
dd30: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
dd40: 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 75 1);../* Don't cu
dd50: 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66 20 rrently care if
dd60: 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 54 this fails */..T
dd70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
dd80: 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65 66 interp, "SSL def
dd90: 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 74 68 ault verify path
dda0: 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 s: ", REASON(),
ddb0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
ddc0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
ddd0: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c x);..return NULL
dde0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a ;.#endif. }..
ddf0: 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 /* https://s
de00: 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 ourceforge.net/p
de10: 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f /tls/bugs/57/ */
de20: 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f . /* XXX:TODO
de30: 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 : Let the user s
de40: 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 upply values her
de50: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d e instead of som
de60: 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 ething that exis
de70: 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 ts on the filesy
de80: 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 stem */. if (
de90: 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 CAfile != NULL)
dea0: 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 {..STACK_OF(X509
deb0: 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 _NAME) *certName
dec0: 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 s = SSL_load_cli
ded0: 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 ent_CA_file(F2N(
dee0: 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 CAfile, &ds));..
def0: 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d if (certNames !=
df00: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 NULL) {.. SS
df10: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 L_CTX_set_client
df20: 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 _CA_list(ctx, ce
df30: 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 rtNames);..}.
df40: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 }.. Tcl_DStr
df50: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 ingFree(&ds);.
df60: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
df70: 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 e(&ds1);. ret
df80: 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a urn ctx;.}.../*.
df90: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
dfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dfd0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 -----. *. * Stat
dfe0: 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 usObjCmd -- retu
dff0: 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66 rn certificate f
e000: 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 or connected pee
e010: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
e020: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
e030: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
e040: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
e050: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
e060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e0a0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
e0b0: 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c .StatusObjCmd(Cl
e0c0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
e0d0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
e0e0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
e0f0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
e100: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
e110: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
e120: 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b . X509 *peer;
e130: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
e140: 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 jPtr;. Tcl_Ch
e150: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 annel chan;.
e160: 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d char *channelNam
e170: 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 e, *ciphers;.
e180: 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 int mode;. c
e190: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
e1a0: 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 ar *proto;. u
e1b0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b nsigned int len;
e1c0: 0a 20 20 20 20 69 6e 74 20 6e 69 64 3b 0a 0a 20 . int nid;..
e1d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
e1e0: 65 64 22 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 ed");.. switc
e1f0: 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73 65 h (objc) {..case
e200: 20 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65 6c 2:.. channel
e210: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 Name = Tcl_GetSt
e220: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
e230: 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 [1], NULL);..
e240: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 33 break;...case 3
e250: 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 72 63 :.. if (!strc
e260: 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 69 6e mp (Tcl_GetStrin
e270: 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c g (objv[1]), "-l
e280: 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 61 6e ocal")) {...chan
e290: 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 nelName = Tcl_Ge
e2a0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
e2b0: 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 bjv[2], NULL);..
e2c0: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 .break;.. }..
e2d0: 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c /* else fall
e2e0: 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20 2a 2f 0a -through ... */.
e2f0: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e #if defined(__GN
e300: 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 74 74 UC__).. __att
e310: 72 69 62 75 74 65 5f 5f 28 28 66 61 6c 6c 74 68 ribute__((fallth
e320: 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64 69 66 0a rough));.#endif.
e330: 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 54 .default:.. T
e340: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
e350: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
e360: 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e "?-local? chann
e370: 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 el");.. retur
e380: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
e390: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
e3a0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
e3b0: 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d terp, channelNam
e3c0: 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 e, &mode);. i
e3d0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
e3e0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
e3f0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
e400: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a OR;. }. /*
e410: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
e420: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
e430: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a most channel */.
e440: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
e450: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
e460: 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f n);. if (Tcl_
e470: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
e480: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
e490: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 nelType()) {..Tc
e4a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e4b0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
e4c0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
e4d0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
e4e0: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
e4f0: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
e500: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
e510: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
e520: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 statePtr = (St
e530: 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 ate *) Tcl_GetCh
e540: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
e550: 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a a(chan);.. /*
e560: 20 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65 Get certificate
e570: 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c for peer or sel
e580: 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a f */. if (obj
e590: 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 c == 2) {..peer
e5a0: 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 = SSL_get_peer_c
e5b0: 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 ertificate(state
e5c0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
e5d0: 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 else {..peer =
e5e0: 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 SSL_get_certific
e5f0: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ate(statePtr->ss
e600: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 l);. }. if
e610: 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 (peer) {..objPt
e620: 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f r = Tls_NewX509O
e630: 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 bj(interp, peer)
e640: 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 ;..if (objc == 2
e650: 29 20 7b 20 58 35 30 39 5f 66 72 65 65 28 70 65 ) { X509_free(pe
e660: 65 72 29 3b 20 7d 0a 20 20 20 20 7d 20 65 6c 73 er); }. } els
e670: 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 e {..objPtr = Tc
e680: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
e690: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL);. }..
e6a0: 20 20 2f 2a 20 50 65 65 72 20 63 65 72 74 20 63 /* Peer cert c
e6b0: 68 61 69 6e 20 28 63 6c 69 65 6e 74 20 6f 6e 6c hain (client onl
e6c0: 79 29 20 2a 2f 0a 20 20 20 20 53 54 41 43 4b 5f y) */. STACK_
e6d0: 4f 46 28 58 35 30 39 29 2a 20 73 73 6c 5f 63 65 OF(X509)* ssl_ce
e6e0: 72 74 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 rts = SSL_get_pe
e6f0: 65 72 5f 63 65 72 74 5f 63 68 61 69 6e 28 73 74 er_cert_chain(st
e700: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
e710: 20 20 69 66 20 28 21 70 65 65 72 20 26 26 20 28 if (!peer && (
e720: 73 73 6c 5f 63 65 72 74 73 20 3d 3d 20 4e 55 4c ssl_certs == NUL
e730: 4c 20 7c 7c 20 73 6b 5f 58 35 30 39 5f 6e 75 6d L || sk_X509_num
e740: 28 73 73 6c 5f 63 65 72 74 73 29 20 3d 3d 20 30 (ssl_certs) == 0
e750: 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c )) {..return TCL
e760: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
e770: 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 /* Peer name
e780: 66 72 6f 6d 20 63 65 72 74 20 2a 2f 0a 20 20 20 from cert */.
e790: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
e7a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
e7b0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
e7c0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 wStringObj("peer
e7d0: 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 name", -1));.
e7e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
e7f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
e800: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
e810: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 wStringObj(SSL_g
e820: 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 et0_peername(sta
e830: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 tePtr->ssl), -1)
e840: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
e850: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
e860: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
e870: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
e880: 6a 28 22 73 62 69 74 73 22 2c 20 2d 31 29 29 3b j("sbits", -1));
e890: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
e8a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
e8b0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
e8c0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f l_NewIntObj(SSL_
e8d0: 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 get_cipher_bits(
e8e0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e statePtr->ssl, N
e8f0: 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 63 69 70 ULL)));.. cip
e900: 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 hers = (char*)SS
e910: 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 L_get_cipher(sta
e920: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
e930: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d if ((ciphers !=
e940: 20 4e 55 4c 4c 29 20 26 26 20 28 73 74 72 63 6d NULL) && (strcm
e950: 70 28 63 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e p(ciphers, "(NON
e960: 45 29 22 29 20 21 3d 20 30 29 29 20 7b 0a 09 54 E)") != 0)) {..T
e970: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
e980: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
e990: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
e9a0: 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 tringObj("cipher
e9b0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
e9c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
e9d0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
e9e0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
e9f0: 4f 62 6a 28 63 69 70 68 65 72 73 2c 20 2d 31 29 Obj(ciphers, -1)
ea00: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
ea10: 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 39 Verify the X509
ea20: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 65 certificate pre
ea30: 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 sented by the pe
ea40: 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 er */. Tcl_Li
ea50: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
ea60: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
ea70: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
ea80: 4f 62 6a 28 22 76 65 72 69 66 69 63 61 74 69 6f Obj("verificatio
ea90: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 n", -1));. Tc
eaa0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
eab0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
eac0: 62 6a 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 bjPtr,..Tcl_NewS
ead0: 74 72 69 6e 67 4f 62 6a 28 58 35 30 39 5f 76 65 tringObj(X509_ve
eae0: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f rify_cert_error_
eaf0: 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 string(SSL_get_v
eb00: 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 erify_result(sta
eb10: 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 tePtr->ssl)), -1
eb20: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f ));.. /* Repo
eb30: 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 rt the selected
eb40: 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 protocol as a re
eb50: 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f sult of the nego
eb60: 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 tiation */. S
eb70: 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c SL_get0_alpn_sel
eb80: 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e ected(statePtr->
eb90: 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 ssl, &proto, &le
eba0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 n);. Tcl_List
ebb0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
ebc0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
ebd0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
ebe0: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a j("alpn", -1));.
ebf0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
ec00: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
ec10: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
ec20: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 _NewStringObj((c
ec30: 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e har *)proto, (in
ec40: 74 29 20 6c 65 6e 29 29 3b 0a 20 20 20 20 54 63 t) len));. Tc
ec50: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
ec60: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
ec70: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
ec80: 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f ringObj("protoco
ec90: 6c 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 l", -1));. Tc
eca0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
ecb0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
ecc0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
ecd0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f ringObj(SSL_get_
ece0: 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72 version(statePtr
ecf0: 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 ->ssl), -1));..
ed00: 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 /* Valid for
ed10: 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72 non-RSA signatur
ed20: 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f e and TLS 1.3 */
ed30: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
ed40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
ed50: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
ed60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
ed70: 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67 signatureHashAlg
ed80: 6f 72 69 74 68 6d 22 2c 20 2d 31 29 29 3b 0a 20 orithm", -1));.
ed90: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 if (objc == 2
eda0: 20 3f 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f ? SSL_get_peer_
edb0: 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 signature_nid(st
edc0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
edd0: 64 29 20 3a 20 53 53 4c 5f 67 65 74 5f 73 69 67 d) : SSL_get_sig
ede0: 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 nature_nid(state
edf0: 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 29 Ptr->ssl, &nid))
ee00: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
ee10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
ee20: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
ee30: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42 _NewStringObj(OB
ee40: 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d J_nid2ln(nid), -
ee50: 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 1));. } else
ee60: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
ee70: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
ee80: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
ee90: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c NewStringObj("",
eea0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 -1));. }.
eeb0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
eec0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
eed0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
eee0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 67 6e wStringObj("sign
eef0: 61 74 75 72 65 5f 74 79 70 65 22 2c 20 2d 31 29 ature_type", -1)
ef00: 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 );. if (objc
ef10: 3d 3d 20 32 20 3f 20 53 53 4c 5f 67 65 74 5f 70 == 2 ? SSL_get_p
ef20: 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 eer_signature_ty
ef30: 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d pe_nid(statePtr-
ef40: 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20 53 53 >ssl, &nid) : SS
ef50: 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f L_get_signature_
ef60: 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 type_nid(statePt
ef70: 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 29 20 7b r->ssl, &nid)) {
ef80: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
ef90: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
efa0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
efb0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f ewStringObj(OBJ_
efc0: 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 nid2ln(nid), -1)
efd0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
efe0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
eff0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f000: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f010: 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d wStringObj("", -
f020: 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 1));. }..
f030: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
f040: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
f050: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
f060: 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 _OK;..clientData
f070: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d = clientData;.}
f080: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
f090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
f0d0: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f * ConnectionInfo
f0e0: 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
f0f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f connection info
f100: 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 from OpenSSL..
f110: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
f120: 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 .A list of conne
f130: 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 ction info. *.
f140: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
f150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f180: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
f190: 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 int ConnectionI
f1a0: 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 nfoObjCmd(Client
f1b0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
f1c0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
f1d0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
f1e0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
f1f0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
f200: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f Channel chan;../
f210: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
f220: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 set a mode on.
f230: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 */. State *st
f240: 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 atePtr;../* clie
f250: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c nt state for ssl
f260: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 socket */. T
f270: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a cl_Obj *objPtr;.
f280: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 const SSL *s
f290: 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 sl;. const SS
f2a0: 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 L_CIPHER *cipher
f2b0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f ;. const SSL_
f2c0: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e SESSION *session
f2d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 ;. const unsi
f2e0: 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f gned char *proto
f2f0: 3b 0a 20 20 20 20 6c 6f 6e 67 20 6d 6f 64 65 3b ;. long mode;
f300: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
f310: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
f320: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
f330: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
f340: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 el");..return(TC
f350: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a L_ERROR);. }.
f360: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
f370: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
f380: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
f390: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
f3a0: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 NULL), NULL);.
f3b0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
f3c0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
f3d0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c L) {..return(TCL
f3e0: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a _ERROR);. }..
f3f0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
f400: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
f410: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
f420: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
f430: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
f440: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 el(chan);. if
f450: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
f460: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
f470: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
f480: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
f490: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
f4a0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
f4b0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
f4c0: 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f e(chan), "\": no
f4d0: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 t a TLS channel"
f4e0: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
f4f0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
f500: 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d }.. objPtr =
f510: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
f520: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 0, NULL);.. /
f530: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 * Connection inf
f540: 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 o */. statePt
f550: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c r = (State *)Tcl
f560: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
f570: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 nceData(chan);.
f580: 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 ssl = statePt
f590: 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 r->ssl;. if (
f5a0: 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ssl != NULL) {..
f5b0: 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 /* connection st
f5c0: 61 74 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 ate */..Tcl_List
f5d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f5e0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f5f0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
f600: 6a 28 22 73 74 61 74 65 22 2c 20 2d 31 29 29 3b j("state", -1));
f610: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
f620: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f630: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f640: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
f650: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e state_string_lon
f660: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 g(ssl), -1));...
f670: 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 65 /* Get SNI reque
f680: 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65 sted server name
f690: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
f6a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
f6b0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
f6c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
f6d0: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 2d 31 29 servername", -1)
f6e0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
f6f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f700: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f710: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
f720: 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 L_get_servername
f730: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d (ssl, TLSEXT_NAM
f740: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 ETYPE_host_name)
f750: 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 , -1));.../* Get
f760: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 54 63 protocol */..Tc
f770: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
f780: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
f790: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
f7a0: 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f ringObj("protoco
f7b0: 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c l", -1));..Tcl_L
f7c0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f7d0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f7e0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
f7f0: 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 gObj(SSL_get_ver
f800: 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 29 3b sion(ssl), -1));
f810: 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 .../* Renegotiat
f820: 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 ion allowed */..
f830: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
f840: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
f850: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
f860: 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 6e 65 67 StringObj("reneg
f870: 6f 74 69 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b otiation", -1));
f880: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
f890: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f8a0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f8b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 20 20 ewStringObj(..
f8c0: 20 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 SSL_get_secure
f8d0: 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 _renegotiation_s
f8e0: 75 70 70 6f 72 74 28 73 73 6c 29 20 3f 20 22 73 upport(ssl) ? "s
f8f0: 75 70 70 6f 72 74 65 64 22 20 3a 20 22 6e 6f 74 upported" : "not
f900: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 2d 31 29 supported", -1)
f910: 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 );.../* Get secu
f920: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 54 rity level */..T
f930: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
f940: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
f950: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
f960: 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 75 72 69 tringObj("securi
f970: 74 79 6c 65 76 65 6c 22 2c 20 2d 31 29 29 3b 0a tylevel", -1));.
f980: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
f990: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f9a0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f9b0: 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f wIntObj(SSL_get_
f9c0: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 security_level(s
f9d0: 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 sl)));.../* Sess
f9e0: 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c ion info */..Tcl
f9f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fa00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fa10: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
fa20: 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f ingObj("session_
fa30: 72 65 75 73 65 64 22 2c 20 2d 31 29 29 3b 0a 09 reused", -1));..
fa40: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
fa50: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
fa60: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
fa70: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f 73 BooleanObj(SSL_s
fa80: 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 ession_reused(ss
fa90: 6c 29 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 l)));.../* Is se
faa0: 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 rver info */..Tc
fab0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
fac0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
fad0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
fae0: 72 69 6e 67 4f 62 6a 28 22 69 73 5f 73 65 72 76 ringObj("is_serv
faf0: 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f er", -1));..Tcl_
fb00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
fb10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
fb20: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c Ptr, Tcl_NewBool
fb30: 65 61 6e 4f 62 6a 28 53 53 4c 5f 69 73 5f 73 65 eanObj(SSL_is_se
fb40: 72 76 65 72 28 73 73 6c 29 29 29 3b 0a 20 20 20 rver(ssl)));.
fb50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 }.. /* Ciphe
fb60: 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 r info */. ci
fb70: 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 pher = SSL_get_c
fb80: 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 urrent_cipher(ss
fb90: 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 l);. if (ciph
fba0: 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 er != NULL) {..c
fbb0: 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 har buf[BUFSIZ]
fbc0: 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 = {0};..int bits
fbd0: 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 54 63 , alg_bits;...Tc
fbe0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
fbf0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
fc00: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
fc10: 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22 ringObj("cipher"
fc20: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
fc30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
fc40: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
fc50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
fc60: 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 bj(SSL_CIPHER_ge
fc70: 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 t_name(cipher),
fc80: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
fc90: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
fca0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
fcb0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
fcc0: 28 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 ("standard_name"
fcd0: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
fce0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
fcf0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
fd00: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
fd10: 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 bj(SSL_CIPHER_st
fd20: 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 andard_name(ciph
fd30: 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 62 69 74 er), -1));...bit
fd40: 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 s = SSL_CIPHER_g
fd50: 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 et_bits(cipher,
fd60: 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 54 63 6c &alg_bits);..Tcl
fd70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fd80: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fd90: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
fda0: 69 6e 67 4f 62 6a 28 22 62 69 74 73 22 2c 20 2d ingObj("bits", -
fdb0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
fdc0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
fdd0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
fde0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 62 69 74 cl_NewIntObj(bit
fdf0: 73 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 s));..Tcl_ListOb
fe00: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
fe10: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
fe20: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
fe30: 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c 20 2d "secret_bits", -
fe40: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
fe50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
fe60: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
fe70: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6c 67 cl_NewIntObj(alg
fe80: 5f 62 69 74 73 29 29 3b 0a 09 2f 2a 20 61 6c 67 _bits));../* alg
fe90: 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 _bits is actual
fea0: 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e key secret bits.
feb0: 20 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 If use bits and
fec0: 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 secret (algorit
fed0: 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c hm) bits differ,
fee0: 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 .. the rest of
fef0: 20 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 the bits are fi
ff00: 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 xed, i.e. for li
ff10: 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 mited export cip
ff20: 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 hers (bits < 56)
ff30: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
ff40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
ff50: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
ff60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
ff70: 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 2d 31 min_version", -1
ff80: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
ff90: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
ffa0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
ffb0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 l_NewStringObj(S
ffc0: 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 SL_CIPHER_get_ve
ffd0: 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d rsion(cipher), -
ffe0: 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 1));.../* Get Op
fff0: 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 enSSL-specific I
10000 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a D, not IANA ID *
10010 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
10020 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10030 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
10040 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 64 NewStringObj("id
10050 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
10060 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
10070 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
10080 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a r, Tcl_NewIntObj
10090 28 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 ((int) SSL_CIPHE
100a0 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 R_get_id(cipher)
100b0 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 49 ));...if (SSL_CI
100c0 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e PHER_description
100d0 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 (cipher, buf, si
100e0 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 zeof(buf)) != NU
100f0 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c LL) {.. Tcl_L
10100 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10110 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
10120 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
10130 67 4f 62 6a 28 22 64 65 73 63 72 69 70 74 69 6f gObj("descriptio
10140 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54 n", -1));.. T
10150 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10160 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10170 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
10180 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 tringObj(buf, -1
10190 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 ));..}. }..
101a0 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 /* Session inf
101b0 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e o */. session
101c0 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 = SSL_get_sessi
101d0 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 on(ssl);. if
101e0 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c (session != NULL
101f0 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 ) {..const unsig
10200 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 ned char *ticket
10210 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a ;..size_t len2;.
10220 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c .unsigned int ul
10230 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 en;..const unsig
10240 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
10250 6e 5f 69 64 3b 0a 09 63 68 61 72 20 62 75 66 66 n_id;..char buff
10260 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 er[SSL_MAX_MASTE
10270 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a R_KEY_LENGTH];..
10280 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 ./* Report the s
10290 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
102a0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
102b0 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 the ALPN negotia
102c0 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 tion */..SSL_SES
102d0 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 SION_get0_alpn_s
102e0 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c elected(session,
102f0 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b &proto, &len2);
10300 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
10310 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10320 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
10330 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 ewStringObj("alp
10340 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c n", -1));..Tcl_L
10350 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10360 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
10370 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
10380 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f gObj((char *)pro
10390 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 to, (int) len2))
103a0 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 ;.../* Report th
103b0 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
103c0 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
103d0 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 of the NPN negot
103e0 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 iation */.#ifdef
103f0 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 USE_NPN..SSL_ge
10400 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 t0_next_proto_ne
10410 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 gotiated(ssl, &p
10420 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 54 roto, &ulen);..T
10430 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10440 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10450 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
10460 74 72 69 6e 67 4f 62 6a 28 22 6e 70 6e 22 2c 20 tringObj("npn",
10470 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
10480 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10490 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
104a0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
104b0 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 ((char *)proto,
104c0 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 23 65 (int) ulen));.#e
104d0 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 ndif.../* Resuma
104e0 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 ble session */..
104f0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
10500 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
10510 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
10520 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 73 75 6d StringObj("resum
10530 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 able", -1));..Tc
10540 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10550 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
10560 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e bjPtr, Tcl_NewIn
10570 74 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e tObj(SSL_SESSION
10580 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 _is_resumable(se
10590 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 ssion)));.../* S
105a0 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d ession start tim
105b0 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 e (seconds since
105c0 20 65 70 6f 63 68 29 20 2a 2f 0a 09 54 63 6c 5f epoch) */..Tcl_
105d0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
105e0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
105f0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10600 6e 67 4f 62 6a 28 22 73 74 61 72 74 5f 74 69 6d ngObj("start_tim
10610 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c e", -1));..Tcl_L
10620 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10630 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
10640 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f tr, Tcl_NewLongO
10650 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 bj(SSL_SESSION_g
10660 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 et_time(session)
10670 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 ));.../* Timeout
10680 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 value - SSL_CTX
10690 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e _get_timeout (in
106a0 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 seconds) */..Tc
106b0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
106c0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
106d0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
106e0 72 69 6e 67 4f 62 6a 28 22 74 69 6d 65 6f 75 74 ringObj("timeout
106f0 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
10700 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
10710 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
10720 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 r, Tcl_NewLongOb
10730 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 j(SSL_SESSION_ge
10740 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f t_timeout(sessio
10750 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 n)));.../* Sessi
10760 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 on ticket lifeti
10770 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f me hint (in seco
10780 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 nds) */..Tcl_Lis
10790 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
107a0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
107b0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
107c0 62 6a 28 22 6c 69 66 65 74 69 6d 65 22 2c 20 2d bj("lifetime", -
107d0 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
107e0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
107f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
10800 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 cl_NewLongObj(SS
10810 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
10820 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 cket_lifetime_hi
10830 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a nt(session)));..
10840 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a ./* Session id *
10850 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 /..session_id =
10860 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
10870 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 id(session, &ule
10880 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a n);..Tcl_ListObj
10890 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
108a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
108b0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
108c0 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 2d 31 29 session_id", -1)
108d0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
108e0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
108f0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
10900 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a _NewByteArrayObj
10910 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e (session_id, (in
10920 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 t) ulen));.../*
10930 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d Session ticket -
10940 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a client only */.
10950 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 .SSL_SESSION_get
10960 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 0_ticket(session
10970 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 , &ticket, &len2
10980 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
10990 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
109a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
109b0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
109c0 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 ession_ticket",
109d0 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
109e0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
109f0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10a00 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 Tcl_NewByteArray
10a10 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 Obj(ticket, (int
10a20 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 54 ) len2));.../* T
10a30 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a icket app data *
10a40 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 /..SSL_SESSION_g
10a50 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 et0_ticket_appda
10a60 74 61 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 ta(session, &tic
10a70 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 ket, &len2);..Tc
10a80 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10a90 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
10aa0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
10ab0 72 69 6e 67 4f 62 6a 28 22 74 69 63 6b 65 74 5f ringObj("ticket_
10ac0 61 70 70 5f 64 61 74 61 22 2c 20 2d 31 29 29 3b app_data", -1));
10ad0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
10ae0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10af0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
10b00 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 ewByteArrayObj(t
10b10 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e icket, (int) len
10b20 32 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 2));.../* Get ma
10b30 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e ster key */..len
10b40 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 2 = SSL_SESSION_
10b50 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 get_master_key(s
10b60 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 ession, buffer,
10b70 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b SSL_MAX_MASTER_K
10b80 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 54 63 6c EY_LENGTH);..Tcl
10b90 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
10ba0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
10bb0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
10bc0 69 6e 67 4f 62 6a 28 22 6d 61 73 74 65 72 5f 6b ingObj("master_k
10bd0 65 79 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f ey", -1));..Tcl_
10be0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10bf0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
10c00 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 Ptr, Tcl_NewByte
10c10 41 72 72 61 79 4f 62 6a 28 62 75 66 66 65 72 2c ArrayObj(buffer,
10c20 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 20 (int) len2));.
10c30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d }.. /* Com
10c40 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f pression info */
10c50 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 . if (ssl !=
10c60 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 NULL) {.#ifdef H
10c70 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 AVE_SSL_COMPRESS
10c80 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f ION..const COMP_
10c90 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 METHOD *comp, *e
10ca0 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c xpn;..comp = SSL
10cb0 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d _get_current_com
10cc0 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 pression(ssl);..
10cd0 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 expn = SSL_get_c
10ce0 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e urrent_expansion
10cf0 28 73 73 6c 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 (ssl);...Tcl_Lis
10d00 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10d10 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10d20 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10d30 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 bj("compression"
10d40 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
10d50 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10d60 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10d70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10d80 62 6a 28 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f bj(comp ? SSL_CO
10d90 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 MP_get_name(comp
10da0 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 ) : "NONE", -1))
10db0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
10dc0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10dd0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
10de0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 NewStringObj("ex
10df0 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a pansion", -1));.
10e00 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
10e10 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10e20 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
10e30 77 53 74 72 69 6e 67 4f 62 6a 28 65 78 70 6e 20 wStringObj(expn
10e40 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e ? SSL_COMP_get_n
10e50 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 4e 4f 4e ame(expn) : "NON
10e60 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6c 73 65 0a E", -1));.#else.
10e70 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
10e80 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10e90 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
10ea0 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 wStringObj("comp
10eb0 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a ression", -1));.
10ec0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
10ed0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10ee0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
10ef0 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 wStringObj("NONE
10f00 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
10f10 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
10f20 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
10f30 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
10f40 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c Obj("expansion",
10f50 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
10f60 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
10f70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10f80 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
10f90 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a j("NONE", -1));.
10fa0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
10fb0 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f /* Server info
10fc0 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 */. mode = S
10fd0 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 SL_CTX_get_sessi
10fe0 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 on_cache_mode(st
10ff0 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 atePtr->ctx);.
11000 20 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c if (mode & SSL
11010 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 _SESS_CACHE_OFF)
11020 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 6f 66 66 {..proto = "off
11030 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ";. } else if
11040 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
11050 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 S_CACHE_CLIENT)
11060 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 63 6c 69 65 {..proto = "clie
11070 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 nt";. } else
11080 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
11090 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 ESS_CACHE_SERVER
110a0 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 73 65 ) {..proto = "se
110b0 72 76 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 rver";. } els
110c0 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c e if (mode & SSL
110d0 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 _SESS_CACHE_BOTH
110e0 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 62 6f ) {..proto = "bo
110f0 74 68 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 th";. } else
11100 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 75 6e 6b 6e {..proto = "unkn
11110 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 own";. }.
11120 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
11130 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
11140 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
11150 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 StringObj("sessi
11160 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 on_cache_mode",
11170 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
11180 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
11190 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
111a0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
111b0 4f 62 6a 28 70 72 6f 74 6f 2c 20 2d 31 29 29 3b Obj(proto, -1));
111c0 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
111d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
111e0 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
111f0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
11200 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
11210 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
11220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11260 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f -. *. * VersionO
11270 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 bjCmd -- return
11280 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 version string f
11290 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a rom OpenSSL.. *.
112a0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
112b0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
112c0 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
112d0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
112e0 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
112f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
11330 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 static int.Versi
11340 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 onObjCmd(ClientD
11350 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
11360 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
11370 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
11380 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
11390 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f v[]) {. Tcl_O
113a0 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 bj *objPtr;..
113b0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
113c0 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 ");.. objPtr
113d0 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f = Tcl_NewStringO
113e0 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 bj(OPENSSL_VERSI
113f0 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 ON_TEXT, -1);.
11400 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
11410 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
11420 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
11430 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 TCL_OK;..clientD
11440 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
11450 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a ;..objc = objc;.
11460 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a .objv = objv;.}.
11470 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
11480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
114c0 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d MiscObjCmd -- m
114d0 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a isc commands. *.
114e0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
114f0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
11500 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
11510 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
11520 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
11530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
11570 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f static int.MiscO
11580 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
11590 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
115a0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
115b0 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
115c0 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
115d0 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 ) {. static c
115e0 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 onst char *comma
115f0 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 nds [] = { "req"
11600 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c , "strreq", NULL
11610 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d };. enum com
11620 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f mand { C_REQ, C_
11630 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 STRREQ, C_DUMMY
11640 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c 20 };. int cmd,
11650 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 isStr;. char
11660 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a buffer[16384];..
11670 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
11680 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
11690 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c objc < 2) {..Tcl
116a0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
116b0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
116c0 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 subcommand ?args
116d0 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c ?");..return TCL
116e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
116f0 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 if (Tcl_GetInd
11700 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 exFromObj(interp
11710 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 , objv[1], comma
11720 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 nds, "command",
11730 30 2c 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 0,&cmd) != TCL_O
11740 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
11750 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
11760 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 ERR_clear_err
11770 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 or();.. isStr
11780 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 = (cmd == C_STR
11790 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 REQ);. switch
117a0 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 ((enum command)
117b0 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f cmd) {..case C_
117c0 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 REQ:..case C_STR
117d0 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f REQ: {.. EVP_
117e0 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b PKEY *pkey=NULL;
117f0 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 .. X509 *cert
11800 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 =NULL;.. X509
11810 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c _NAME *name=NULL
11820 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a ;.. Tcl_Obj *
11830 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 69 6e 74 *listv;.. int
11840 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 listc,i;...
11850 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a BIO *out=NULL;..
11860 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 . char *k_C="
11870 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d ",*k_ST="",*k_L=
11880 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 "",*k_O="",*k_OU
11890 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f ="",*k_CN="",*k_
118a0 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 Email="";.. c
118b0 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d har *keyout,*pem
118c0 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 out,*str;.. i
118d0 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 nt keysize,seria
118e0 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 l=0,days=365;..#
118f0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
11900 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
11910 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 000000L.. BIG
11920 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b NUM *bne = NULL;
11930 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d .. RSA *rsa =
11940 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 NULL;.#else..
11950 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a EVP_PKEY_CTX *
11960 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 ctx = NULL;.#end
11970 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 if... if ((ob
11980 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 jc<5) || (objc>6
11990 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 )) {...Tcl_Wrong
119a0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
119b0 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 2, objv, "keysiz
119c0 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 e keyfile certfi
119d0 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 le ?info?");...r
119e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
119f0 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 .. }... if
11a00 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
11a10 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
11a20 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 [2], &keysize) !
11a30 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 = TCL_OK) {...re
11a40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
11a50 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f . }.. keyo
11a60 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ut=Tcl_GetString
11a70 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 (objv[3]);..
11a80 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 pemout=Tcl_GetSt
11a90 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 ring(objv[4]);..
11aa0 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b if (isStr) {
11ab0 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e ...Tcl_SetVar(in
11ac0 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 terp,keyout,"",0
11ad0 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 );...Tcl_SetVar(
11ae0 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 interp,pemout,""
11af0 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ,0);.. }...
11b00 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b if (objc>=6) {
11b10 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f ...if (Tcl_ListO
11b20 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e bjGetElements(in
11b30 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 terp, objv[5],..
11b40 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 ..&listc, &listv
11b50 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
11b60 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
11b70 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 ERROR;...}....if
11b80 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 ((listc%2) != 0
11b90 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 ) {... Tcl_Se
11ba0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
11bb0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 Information list
11bc0 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 must have even
11bd0 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 number of argume
11be0 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 nts",NULL);...
11bf0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
11c00 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 OR;...}...for (i
11c10 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d =0; i<listc; i+=
11c20 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 2) {... str=T
11c30 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
11c40 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 tv[i]);... if
11c50 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 (strcmp(str,"da
11c60 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 ys")==0) {....if
11c70 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
11c80 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
11c90 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 [i+1],&days)!=TC
11ca0 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 L_OK).... ret
11cb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
11cc0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
11cd0 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 strcmp(str,"seri
11ce0 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 al")==0) {....if
11cf0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
11d00 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
11d10 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d [i+1],&serial)!=
11d20 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 TCL_OK).... r
11d30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
11d40 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
11d50 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 (strcmp(str,"C"
11d60 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 )==0) {....k_C=T
11d70 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
11d80 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
11d90 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
11da0 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 p(str,"ST")==0)
11db0 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 {....k_ST=Tcl_Ge
11dc0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
11dd0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
11de0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
11df0 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"L")==0) {....k
11e00 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _L=Tcl_GetString
11e10 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
11e20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
11e30 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d trcmp(str,"O")==
11e40 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 0) {....k_O=Tcl_
11e50 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
11e60 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
11e70 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
11e80 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 tr,"OU")==0) {..
11e90 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 ..k_OU=Tcl_GetSt
11ea0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
11eb0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
11ec0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 f (strcmp(str,"C
11ed0 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 N")==0) {....k_C
11ee0 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 N=Tcl_GetString(
11ef0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
11f00 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
11f10 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 rcmp(str,"Email"
11f20 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 )==0) {....k_Ema
11f30 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 il=Tcl_GetString
11f40 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
11f50 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 } else {....
11f60 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
11f70 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 terp,"Unknown pa
11f80 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a rameter",NULL);.
11f90 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
11fa0 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d ROR;... }...}
11fb0 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 .. }..#if OPE
11fc0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
11fd0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
11fe0 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f L.. bne = BN_
11ff0 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 new();.. rsa
12000 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 = RSA_new();..
12010 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 pkey = EVP_PKE
12020 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 Y_new();.. if
12030 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (bne == NULL ||
12040 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 rsa == NULL ||
12050 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 pkey == NULL ||
12060 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 !BN_set_word(bne
12070 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 ,RSA_F4) ||...!R
12080 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f SA_generate_key_
12090 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c ex(rsa, keysize,
120a0 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 bne, NULL) || !
120b0 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f EVP_PKEY_assign_
120c0 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 RSA(pkey, rsa))
120d0 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 {...EVP_PKEY_fre
120e0 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 e(pkey);.../* RS
120f0 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 A_free(rsa); fre
12100 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 ed by EVP_PKEY_f
12110 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 ree */...BN_free
12120 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 (bne);.#else..
12130 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 pkey = EVP_RSA
12140 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 _gen((unsigned i
12150 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 nt) keysize);..
12160 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 ctx = EVP_PKE
12170 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e Y_CTX_new(pkey,N
12180 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 ULL);.. if (p
12190 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 key == NULL || c
121a0 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 tx == NULL || !E
121b0 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 VP_PKEY_keygen_i
121c0 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 nit(ctx) ||...!E
121d0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f VP_PKEY_CTX_set_
121e0 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 rsa_keygen_bits(
121f0 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c ctx, keysize) ||
12200 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 !EVP_PKEY_keyge
12210 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b n(ctx, &pkey)) {
12220 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
12230 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b (pkey);...EVP_PK
12240 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 EY_CTX_free(ctx)
12250 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 ;.#endif...Tcl_S
12260 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
12270 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e "Error generatin
12280 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e g private key",N
12290 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 ULL);...return T
122a0 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
122b0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 else {...if (is
122c0 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 Str) {... out
122d0 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d =BIO_new(BIO_s_m
122e0 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d em());... PEM
122f0 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 _write_bio_Priva
12300 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e teKey(out,pkey,N
12310 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c ULL,NULL,0,NULL,
12320 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 NULL);... i=B
12330 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 IO_read(out,buff
12340 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 er,sizeof(buffer
12350 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 )-1);... i=(i
12360 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 <0) ? 0 : i;...
12370 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 buffer[i]='\0
12380 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 ';... Tcl_Set
12390 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
123a0 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 t,buffer,0);...
123b0 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 BIO_flush(out
123c0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
123d0 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 e(out);...} else
123e0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
123f0 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 _new(BIO_s_file(
12400 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 ));... BIO_wr
12410 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 ite_filename(out
12420 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 ,keyout);...
12430 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 PEM_write_bio_Pr
12440 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 ivateKey(out,pke
12450 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 y,NULL,NULL,0,NU
12460 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 LL,NULL);...
12470 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f /* PEM_write_bio
12480 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f _RSAPrivateKey(o
12490 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e ut, rsa, NULL, N
124a0 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 ULL, 0, NULL, NU
124b0 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 LL); */... BI
124c0 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
124d0 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 .. .}....if ((ce
124e0 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d rt=X509_new())==
124f0 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 NULL) {... Tc
12500 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
12510 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 rp,"Error genera
12520 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ting certificate
12530 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b request",NULL);
12540 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f ... EVP_PKEY_
12550 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
12560 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
12570 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
12580 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 000L... BN_fr
12590 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
125a0 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c .. return(TCL
125b0 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 _ERROR);...}....
125c0 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e X509_set_version
125d0 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 (cert,2);...ASN1
125e0 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 _INTEGER_set(X50
125f0 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 9_get_serialNumb
12600 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 er(cert),serial)
12610 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f ;...X509_gmtime_
12620 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f adj(X509_getm_no
12630 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 tBefore(cert),0)
12640 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f ;...X509_gmtime_
12650 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f adj(X509_getm_no
12660 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f tAfter(cert),(lo
12670 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 ng)60*60*24*days
12680 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 );...X509_set_pu
12690 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b bkey(cert,pkey);
126a0 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 ....name=X509_ge
126b0 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 t_subject_name(c
126c0 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 ert);....X509_NA
126d0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
126e0 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 txt(name,"C", MB
126f0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
12700 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
12710 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c *) k_C, -1, -1,
12720 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
12730 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
12740 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 t(name,"ST", MBS
12750 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
12760 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
12770 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c *) k_ST, -1, -1,
12780 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
12790 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
127a0 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 t(name,"L", MBST
127b0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
127c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
127d0 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 ) k_L, -1, -1, 0
127e0 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
127f0 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
12800 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 name,"O", MBSTRI
12810 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
12820 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
12830 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b k_O, -1, -1, 0);
12840 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
12850 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
12860 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e me,"OU", MBSTRIN
12870 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
12880 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
12890 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _OU, -1, -1, 0);
128a0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
128b0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
128c0 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e me,"CN", MBSTRIN
128d0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
128e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
128f0 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _CN, -1, -1, 0);
12900 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
12910 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
12920 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 me,"Email", MBST
12930 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
12940 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
12950 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d ) k_Email, -1, -
12960 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 1, 0);....X509_s
12970 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 et_subject_name(
12980 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 cert,name);....i
12990 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 f (!X509_sign(ce
129a0 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 rt,pkey,EVP_sha2
129b0 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 56())) {... X
129c0 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 509_free(cert);.
129d0 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 .. EVP_PKEY_f
129e0 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
129f0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
12a00 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
12a10 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 00L... BN_fre
12a20 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 e(bne);.#endif..
12a30 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
12a40 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 lt(interp,"Error
12a50 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 signing certifi
12a60 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 cate",NULL);...
12a70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
12a80 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 ROR;...}....if (
12a90 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f isStr) {... o
12aa0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
12ab0 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 _mem());... P
12ac0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 EM_write_bio_X50
12ad0 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 9(out,cert);...
12ae0 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 i=BIO_read(ou
12af0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 t,buffer,sizeof(
12b00 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 buffer)-1);...
12b10 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 i=(i<0) ? 0 :
12b20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b i;... buffer[
12b30 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 i]='\0';... T
12b40 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
12b50 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 ,pemout,buffer,0
12b60 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 );... BIO_flu
12b70 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 sh(out);... B
12b80 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 IO_free(out);...
12b90 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f } else {... o
12ba0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
12bb0 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 _file());...
12bc0 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
12bd0 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a me(out,pemout);.
12be0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
12bf0 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 bio_X509(out,cer
12c00 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 t);... BIO_fr
12c10 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d ee_all(out);...}
12c20 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 ....X509_free(ce
12c30 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f rt);...EVP_PKEY_
12c40 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
12c50 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
12c60 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
12c70 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 000L...BN_free(b
12c80 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 ne);.#endif..
12c90 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 }..}..break;.
12ca0 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 default:..brea
12cb0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 k;. }. ret
12cc0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
12cd0 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
12ce0 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a Data;.}.../*****
12cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
12d00 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 ./* Init
12d10 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
12d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
12d30 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
12d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d70 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
12d80 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a ls_Free --. *. *
12d90 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
12da0 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 cleans up when a
12db0 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
12dc0 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 d channel. *.is
12dd0 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 closed and its r
12de0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 eference count f
12df0 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a alls below 1. *.
12e00 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e * Results:. *.n
12e10 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
12e20 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 ffects:. *.Frees
12e30 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 all the state.
12e40 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
12e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e80 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
12e90 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a .Tls_Free(char *
12ea0 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 blockPtr) {.
12eb0 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
12ec0 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b = (State *)block
12ed0 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 Ptr;.. dprint
12ee0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
12ef0 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 Tls_Clean(stat
12f00 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 ePtr);. ckfre
12f10 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c e(blockPtr);.}..
12f20 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
12f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
12f70 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a Tls_Clean --. *.
12f80 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
12f90 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e e cleans up when
12fa0 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
12fb0 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 sed channel. *.i
12fc0 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 s closed and its
12fd0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
12fe0 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 falls below 1.
12ff0 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 This should. *.
13000 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 be called synchr
13010 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 onously by the C
13020 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e loseProc, not in
13030 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c the. *.Eventual
13040 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e lyFree callback.
13050 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
13060 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.none. *. * Si
13070 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 de effects:. *.F
13080 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 rees all the sta
13090 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d te. *. *--------
130a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
130e0 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 void Tls_Clean(S
130f0 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 tate *statePtr)
13100 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 {. dprintf("C
13110 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
13120 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 . * we're as
13130 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 suming here that
13140 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 we're single-th
13150 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 readed. */.
13160 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
13170 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 >timer != (Tcl_T
13180 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 imerToken) NULL)
13190 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 {..Tcl_DeleteTi
131a0 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 merHandler(state
131b0 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 Ptr->timer);..st
131c0 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 atePtr->timer =
131d0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
131e0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
131f0 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 rotos) {..ckfree
13200 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
13210 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 s);..statePtr->p
13220 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 rotos = NULL;.
13230 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
13240 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a ePtr->bio) {../*
13250 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 This will call
13260 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 SSL_shutdown. Bu
13270 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 g 1414045 */..dp
13280 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f rintf("BIO_free_
13290 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 all(%p)", stateP
132a0 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 tr->bio);..BIO_f
132b0 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 ree_all(statePtr
132c0 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 ->bio);..statePt
132d0 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 r->bio = NULL;.
132e0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
132f0 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 tePtr->ssl) {..d
13300 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 printf("SSL_free
13310 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d (%p)", statePtr-
13320 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 >ssl);..SSL_free
13330 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
13340 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 ..statePtr->ssl
13350 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
13360 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
13370 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f ctx) {..SSL_CTX_
13380 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 free(statePtr->c
13390 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e tx);..statePtr->
133a0 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
133b0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
133c0 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a tr->callback) {.
133d0 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
133e0 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c t(statePtr->call
133f0 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 back);..statePtr
13400 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c ->callback = NUL
13410 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
13420 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
13430 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 ord) {..Tcl_Decr
13440 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
13450 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 r->password);..s
13460 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
13470 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a d = NULL;. }.
13480 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
13490 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 ->vcmd) {..Tcl_D
134a0 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ecrRefCount(stat
134b0 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 ePtr->vcmd);..st
134c0 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e atePtr->vcmd = N
134d0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
134e0 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
134f0 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d ng");.}.../*. *-
13500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13540 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 --. *. * Tls_Ini
13550 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 t --. *. *.This
13560 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 is a package ini
13570 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 tialization proc
13580 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 edure, which is
13590 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c called. *.by Tcl
135a0 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 when this packa
135b0 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 ge is to be adde
135c0 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 d to an interpre
135d0 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ter.. *. * Resul
135e0 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 ts: Ssl configu
135f0 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 red and loaded.
13600 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
13610 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 s:. *. create th
13620 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 e ssl command, i
13630 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f nitialize ssl co
13640 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ntext. *. *-----
13650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
13690 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 */.DLLEXPORT int
136a0 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e Tls_Init(Tcl_In
136b0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a terp *interp) {.
136c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74 const char t
136d0 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b lsTclInitScript[
136e0 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 ] = {.#include "
136f0 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 tls.tcl.h"..0x00
13700 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 . };.. dpr
13710 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
13720 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 . /*. * W
13730 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 54 e only support T
13740 63 6c 20 38 2e 34 20 6f 72 20 6e 65 77 65 72 0a cl 8.4 or newer.
13750 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 */. if (
13760 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f .#ifdef USE_TCL_
13770 53 54 55 42 53 0a 09 54 63 6c 5f 49 6e 69 74 53 STUBS..Tcl_InitS
13780 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e tubs(interp, "8.
13790 34 22 2c 20 30 29 0a 23 65 6c 73 65 0a 09 54 63 4", 0).#else..Tc
137a0 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 l_PkgRequire(int
137b0 65 72 70 2c 20 22 54 63 6c 22 2c 20 22 38 2e 34 erp, "Tcl", "8.4
137c0 2d 22 2c 20 30 29 0a 23 65 6e 64 69 66 0a 09 20 -", 0).#endif..
137d0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
137e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
137f0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 }.. if (Tls
13800 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 LibInit(0) != TC
13810 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 L_OK) {..Tcl_App
13820 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
13830 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 , "could not ini
13840 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 tialize SSL libr
13850 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ary", NULL);..re
13860 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13870 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 }.. Tcl_C
13880 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
13890 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 interp, "tls::ci
138a0 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f phers", CiphersO
138b0 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
138c0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
138d0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
138e0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
138f0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
13900 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 erp, "tls::conne
13910 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 ction", Connecti
13920 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 onInfoObjCmd, (C
13930 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
13940 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
13950 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
13960 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
13970 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
13980 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 ::handshake", Ha
13990 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 ndshakeObjCmd, (
139a0 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
139b0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
139c0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
139d0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
139e0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
139f0 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f s::import", Impo
13a00 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e rtObjCmd, (Clien
13a10 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
13a20 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
13a30 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
13a40 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
13a50 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e interp, "tls::un
13a60 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 import", Unimpor
13a70 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 tObjCmd, (Client
13a80 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
13a90 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
13aa0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
13ab0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
13ac0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 nterp, "tls::sta
13ad0 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 tus", StatusObjC
13ae0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
13af0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
13b00 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
13b10 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
13b20 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
13b30 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 , "tls::version"
13b40 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c , VersionObjCmd,
13b50 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
13b60 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
13b70 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
13b80 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
13b90 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
13ba0 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 tls::misc", Misc
13bb0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
13bc0 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
13bd0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
13be0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
13bf0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
13c00 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 terp, "tls::prot
13c10 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c ocols", Protocol
13c20 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 sObjCmd, (Client
13c30 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
13c40 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
13c50 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 ULL);.. if (i
13c60 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 nterp) {..Tcl_Ev
13c70 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 al(interp, tlsTc
13c80 6c 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 lInitScript);.
13c90 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 }.. return(
13ca0 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 Tcl_PkgProvide(i
13cb0 6e 74 65 72 70 2c 20 22 74 6c 73 22 2c 20 50 41 nterp, "tls", PA
13cc0 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 29 3b CKAGE_VERSION));
13cd0 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
13ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
13d10 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 . *. *.Tls_SafeI
13d20 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d nit --. *. *.---
13d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
13d60 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 *.Standard proce
13d70 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79 dure required by
13d80 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 'load'.. *.Init
13d90 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 ializes this ext
13da0 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 ension for a saf
13db0 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 e interpreter..
13dc0 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
13dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13df0 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 --*. *. *.Side e
13e00 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f ffects:. *..As o
13e10 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a f 'Tls_Init'. *.
13e20 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 *.Result:. *..A
13e30 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 standard Tcl er
13e40 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d ror code.. *. *-
13e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e80 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 -----*. */.DLLEX
13e90 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 PORT int Tls_Saf
13ea0 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 eInit(Tcl_Interp
13eb0 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
13ec0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
13ed0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 6c );. return(Tl
13ee0 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b s_Init(interp));
13ef0 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
13f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
13f30 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 . *. *.TlsLibIni
13f40 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d t --. *. *.-----
13f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 -----------*. *.
13f80 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 Initializes SSL
13f90 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 library once per
13fa0 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 application. *.
13fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fe0 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 *. *. *.Side eff
13ff0 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 ects:. *..initia
14000 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 lizes SSL librar
14010 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a y. *. *.Result:.
14020 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d *..none. *. *--
14030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14060 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 ----*. */.static
14070 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 int TlsLibInit(
14080 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 int uninitialize
14090 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 ) {. static i
140a0 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d nt initialized =
140b0 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 0;. int stat
140c0 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 us = TCL_OK;.#if
140d0 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
140e0 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
140f0 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
14100 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d ). size_t num
14110 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a _locks;.#endif..
14120 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 if (uninitia
14130 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e lize) {..if (!in
14140 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 itialized) {..
14150 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 dprintf("Asked
14160 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 to uninitialize
14170 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 , but we are not
14180 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a initialized");.
14190 0a 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c .. return(TCL
141a0 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e _OK);..}...dprin
141b0 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 tf("Asked to uni
141c0 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 nitialize");..#i
141d0 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
141e0 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
141f0 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
14200 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 S)..Tcl_MutexLoc
14210 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 k(&init_mx);...i
14220 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 f (locks) {..
14230 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 free(locks);..
14240 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b locks = NULL;
14250 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 .. locksCount
14260 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a = 0;..}.#endif.
14270 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 .initialized = 0
14280 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
14290 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
142a0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
142b0 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 HREADS)..Tcl_Mut
142c0 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d exUnlock(&init_m
142d0 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 x);.#endif...ret
142e0 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 urn(TCL_OK);.
142f0 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 }.. if (init
14300 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 ialized) {..dpri
14310 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 ntf("Called, but
14320 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 using cached va
14330 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 28 73 lue");..return(s
14340 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 tatus);. }..
14350 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
14360 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e ed");..#if defin
14370 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
14380 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
14390 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 CL_THREADS).
143a0 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 Tcl_MutexLock(&i
143b0 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a nit_mx);.#endif.
143c0 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 initialized
143d0 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 = 1;..#if define
143e0 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
143f0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
14400 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e L_THREADS). n
14410 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 um_locks = 1;.
14420 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 locksCount = (
14430 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a int) num_locks;.
14440 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c locks = mall
14450 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 oc(sizeof(*locks
14460 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a ) * num_locks);.
14470 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 memset(locks
14480 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 , 0, sizeof(*loc
14490 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 ks) * num_locks)
144a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a ;.#endif.. /*
144b0 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 Initialize BOTH
144c0 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c libcrypto and l
144d0 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 ibssl. */. OP
144e0 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f ENSSL_init_ssl(O
144f0 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 PENSSL_INIT_LOAD
14500 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f _SSL_STRINGS | O
14510 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 PENSSL_INIT_LOAD
14520 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a _CRYPTO_STRINGS.
14530 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f .| OPENSSL_INIT_
14540 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 ADD_ALL_CIPHERS
14550 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 | OPENSSL_INIT_A
14560 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 DD_ALL_DIGESTS,
14570 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f NULL);.. BIO_
14580 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 new_tcl(NULL, 0)
14590 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a ;..#if 0. /*.
145a0 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a * XXX:TODO:
145b0 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 Remove this cod
145c0 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 e and replace it
145d0 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 with a check.
145e0 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 * for enough
145f0 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e entropy and do n
14600 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 ot try to create
14610 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 our own. *
14620 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 terrible entropy
14630 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a . */. /*.
14640 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 * Seed the
14650 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 random number ge
14660 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 nerator in the S
14670 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 SL library,.
14680 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f * using the do/
14690 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 while construct
146a0 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 because of the b
146b0 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 ug note in the.
146c0 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 * OpenSSL FA
146d0 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e Q at http://www.
146e0 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 openssl.org/supp
146f0 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 ort/faq.html#USE
14700 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a R1. *. *
14710 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 The crux of the
14720 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 problem is that
14730 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 Solaris 7 does
14740 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 not have a.
14750 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 * /dev/random or
14760 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 /dev/urandom de
14770 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f vice so it canno
14780 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a t gather enough.
14790 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 * entropy f
147a0 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 rom the RAND_see
147b0 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 d() when TLS ini
147c0 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 tializes and ref
147d0 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 uses. * to g
147e0 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 o further. Earli
147f0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f er versions of O
14800 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f penSSL carried o
14810 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 n regardless..
14820 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 */. srand(
14830 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 (unsigned int) t
14840 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e ime((time_t *) N
14850 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a ULL));. do {.
14860 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c .for (i = 0; i <
14870 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 16; i++) {..
14880 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 rnd_seed[i] = 1
14890 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 + (char) (255.0
148a0 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f * rand()/(RAND_
148b0 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 MAX+1.0));..}..R
148c0 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 AND_seed(rnd_see
148d0 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 d, sizeof(rnd_se
148e0 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c ed));. } whil
148f0 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 e (RAND_status()
14900 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a != 1);.#endif..
14910 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
14920 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
14930 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
14940 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 ADS)..Tcl_MutexU
14950 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b nlock(&init_mx);
14960 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e .#endif...return
14970 28 73 74 61 74 75 73 29 3b 0a 7d 0a (status);.}.