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 4d 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 4d 65 73 73 61 67 65 --. *. * Message
1770: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 Callback --. *.
1780: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 *.Monitors SSL p
1790: 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 rotocol messages
17a0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
17b0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
17c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
17d0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
17e0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1830: 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 ---. */.#ifndef
1840: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 OPENSSL_NO_SSL_T
1850: 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64 RACE.static void
1860: 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b .MessageCallback
1870: 28 69 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 6e (int write_p, in
1880: 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 t version, int c
1890: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e ontent_type, con
18a0: 73 74 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 st void *buf, si
18b0: 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 ze_t len, SSL *s
18c0: 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b sl, void *arg) {
18d0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
18e0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
18f0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
1900: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
1910: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
1920: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
1930: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 65 tr;. char *ve
1940: 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 r, *type;. BI
1950: 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 O *bio;. char
1960: 20 62 75 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a buffer[15000];.
1970: 20 20 20 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 buffer[0] =
1980: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
1990: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
19a0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 if (statePtr->ca
19b0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f llback == (Tcl_O
19c0: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 bj*)NULL)..retur
19d0: 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76 n;.. switch(v
19e0: 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 20 4f 50 ersion) {.#if OP
19f0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
1a00: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
1a10: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
1a20: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
1a30: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
1a40: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 53 53 SL2). case SS
1a50: 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 L2_VERSION:..ver
1a60: 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 65 = "SSLv2";..bre
1a70: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
1a80: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
1a90: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
1aa0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 NSSL_NO_SSL3).
1ab0: 20 20 63 61 73 65 20 53 53 4c 33 5f 56 45 52 53 case SSL3_VERS
1ac0: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c ION:..ver = "SSL
1ad0: 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e v3";..break;.#en
1ae0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53 dif. case TLS
1af0: 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 1_VERSION:..ver
1b00: 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 61 = "TLSv1";..brea
1b10: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 k;. case TLS1
1b20: 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 _1_VERSION:..ver
1b30: 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 62 = "TLSv1.1";..b
1b40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
1b50: 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 LS1_2_VERSION:..
1b60: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 3b ver = "TLSv1.2";
1b70: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1b80: 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e e TLS1_3_VERSION
1b90: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e :..ver = "TLSv1.
1ba0: 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 3";..break;.
1bb0: 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20 20 20 case 0:.
1bc0: 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 ver = "none";..b
1bd0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c reak;. defaul
1be0: 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f t:..ver = "unkno
1bf0: 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 wn";..break;.
1c00: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 }.. switch (
1c10: 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a content_type) {.
1c20: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 case SSL3_RT
1c30: 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d _HEADER:..type =
1c40: 20 22 48 65 61 64 65 72 22 3b 0a 20 20 20 20 20 "Header";.
1c50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 break;. ca
1c60: 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52 se SSL3_RT_INNER
1c70: 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09 _CONTENT_TYPE:..
1c80: 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f type = "Inner Co
1c90: 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a 20 20 20 ntent Type";.
1ca0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
1cb0: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 case SSL3_RT_CHA
1cc0: 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a NGE_CIPHER_SPEC:
1cd0: 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65 ..type = "Change
1ce0: 20 43 69 70 68 65 72 22 3b 0a 20 20 20 20 20 20 Cipher";.
1cf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 break;. cas
1d00: 65 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a e SSL3_RT_ALERT:
1d10: 0a 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22 ..type = "Alert"
1d20: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b ;. break;
1d30: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1d40: 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79 T_HANDSHAKE:..ty
1d50: 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22 pe = "Handshake"
1d60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b ;. break;
1d70: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1d80: 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41 T_APPLICATION_DA
1d90: 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70 TA:..type = "App
1da0: 20 44 61 74 61 22 3b 0a 20 20 20 20 20 20 20 20 Data";.
1db0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1dc0: 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45 DTLS1_RT_HEARTBE
1dd0: 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 AT:..type = "Hea
1de0: 72 74 62 65 61 74 22 3b 0a 20 20 20 20 20 20 20 rtbeat";.
1df0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 break;. defa
1e00: 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e ult:..type = "un
1e10: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 known";. }..
1e20: 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 /* Needs comp
1e30: 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 ile time option
1e40: 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 "enable-ssl-trac
1e50: 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 e". */. if ((
1e60: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 bio = BIO_new(BI
1e70: 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e O_s_mem())) != N
1e80: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 ULL) {..int n;..
1e90: 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f SSL_trace(write_
1ea0: 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 p, version, cont
1eb0: 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c ent_type, buf, l
1ec0: 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a en, ssl, (void *
1ed0: 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f )bio);..n = BIO_
1ee0: 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 read(bio, buffer
1ef0: 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e , min(BIO_pendin
1f00: 67 28 62 69 6f 29 2c 20 31 34 39 39 39 29 29 3b g(bio), 14999));
1f10: 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20 ..n = (n<0) ? 0
1f20: 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20 : n;..buffer[n]
1f30: 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f = 0;..(void)BIO_
1f40: 66 6c 75 73 68 28 62 69 6f 29 3b 0a 20 09 42 49 flush(bio);. .BI
1f50: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 O_free(bio);.
1f60: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 }.. /* Create
1f70: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c command to eval
1f80: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
1f90: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
1fa0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c j(statePtr->call
1fb0: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c back);. Tcl_L
1fc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1fd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1fe0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
1ff0: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 gObj("message",
2000: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
2010: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2020: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2030: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
2040: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
2050: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
2060: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
2070: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2080: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2090: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
20a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
20b0: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 (write_p ? "Sent
20c0: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 " : "Received",
20d0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
20e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
20f0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2100: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2110: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 Obj(ver, -1));.
2120: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2130: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2140: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
2150: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 NewStringObj(typ
2160: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c e, -1));. Tcl
2170: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2180: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
2190: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
21a0: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d ingObj(buffer, -
21b0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 1));.. /* Eva
21c0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
21d0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
21e0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
21f0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
2200: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
2210: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
2220: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
2230: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a ount(cmdPtr);.}.
2240: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d #endif.../*. *--
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2290: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 -. *. * VerifyCa
22a0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 llback --. *. *.
22b0: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 Monitors SSL cer
22c0: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 tificate validat
22d0: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 ion process. Use
22e0: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 d to control the
22f0: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 . *.behavior whe
2300: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 n the SSL_VERIFY
2310: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 _PEER flag is se
2320: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 t. This is calle
2330: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 d. *.whenever a
2340: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 certificate is i
2350: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 nspected or deci
2360: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c ded invalid. Cal
2370: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 led for. *.each
2380: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 certificate in t
2390: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 he cert chain..
23a0: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 *. * Checks:. *.
23b0: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69 certificate chai
23c0: 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61 n is checked sta
23d0: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64 rting with the d
23e0: 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c eepest nesting l
23f0: 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72 evel. *. (the r
2400: 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61 oot CA certifica
2410: 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75 te) and worked u
2420: 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65 pward to the pee
2430: 72 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e r's certificate.
2440: 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72 . *.All signatur
2450: 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75 es are valid, cu
2460: 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69 rrent time is wi
2470: 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c thin first and l
2480: 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d ast validity tim
2490: 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74 e.. *.Check that
24a0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
24b0: 20 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68 is issued by th
24c0: 65 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69 e issuer certifi
24d0: 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09 cate issuer.. *.
24e0: 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61 Check the revoca
24f0: 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20 tion status for
2500: 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65 each certificate
2510: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76 .. *.Check the v
2520: 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67 alidity of the g
2530: 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65 iven CRL and the
2540: 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e cert revocation
2550: 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63 status.. *.Chec
2560: 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f k the policies o
2570: 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66 f all the certif
2580: 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67 icates. *. * Arg
2590: 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f s. *.preverify_o
25a0: 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 k indicates whet
25b0: 68 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63 her the certific
25c0: 61 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e ate verification
25d0: 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e passed (1) or n
25e0: 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73 ot (0). *. * Res
25f0: 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 ults:. *.A callb
2600: 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 ack bound to the
2610: 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 socket may retu
2620: 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 rn one of:. *.
2630: 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 0...- the cert
2640: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 ificate is deeme
2650: 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20 d invalid, send
2660: 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09 verification. *.
2670: 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65 ... failure ale
2680: 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20 rt to peer, and
2690: 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68 terminate handsh
26a0: 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09 ake.. *. 1...
26b0: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 - the certificat
26c0: 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69 e is deemed vali
26d0: 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 d, continue with
26e0: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 handshake.. *.
26f0: 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09 empty string.
2700: 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 - no change to c
2710: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 ertificate valid
2720: 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 ation. *. * Side
2730: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 effects:. *.The
2740: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 err field of th
2750: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 e currently oper
2760: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 ative State is s
2770: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 et. *. to a str
2780: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 ing describing t
2790: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 he SSL negotiati
27a0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f on failure reaso
27b0: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d n. *. *---------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
2800: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79 tatic int.Verify
2810: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c Callback(int ok,
2820: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20 X509_STORE_CTX
2830: 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f *ctx) {. Tcl_
2840: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
2850: 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 SSL *ssl..= (
2860: 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f SSL*)X509_STORE_
2870: 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 CTX_get_ex_data(
2880: 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f ctx, SSL_get_ex_
2890: 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f data_X509_STORE_
28a0: 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 CTX_idx());.
28b0: 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 X509 *cert..= X
28c0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 509_STORE_CTX_ge
28d0: 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 t_current_cert(c
28e0: 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a tx);. State *
28f0: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 statePtr.= (Stat
2900: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 e*)SSL_get_app_d
2910: 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 ata(ssl);. Tc
2920: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
2930: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
2940: 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70 erp;. int dep
2950: 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 th..= X509_STORE
2960: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64 _CTX_get_error_d
2970: 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69 epth(ctx);. i
2980: 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53 nt err..= X509_S
2990: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 TORE_CTX_get_err
29a0: 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70 or(ctx);.. dp
29b0: 72 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25 rintf("Verify: %
29c0: 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 d", ok);.. if
29d0: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 (statePtr->vcmd
29e0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
29f0: 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65 LL) {..if (state
2a00: 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 Ptr->vflags & SS
2a10: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 L_VERIFY_FAIL_IF
2a20: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b _NO_PEER_CERT) {
2a30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b .. return ok;
2a40: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
2a50: 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 return 1;..}.
2a60: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 } else if (cert
2a70: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 == NULL || ssl
2a80: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
2a90: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 rn 0;. }..
2aa0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
2ab0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
2ac0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
2ad0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
2ae0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
2af0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2b00: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2b10: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
2b20: 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 wStringObj("veri
2b30: 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 fy", -1));. T
2b40: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2b50: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2b60: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 cmdPtr,..Tcl_New
2b70: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 StringObj(Tcl_Ge
2b80: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
2b90: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
2ba0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2bb0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2bc0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2bd0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 Tcl_NewIntObj(d
2be0: 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f epth));. Tcl_
2bf0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2c00: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
2c10: 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 Ptr, Tls_NewX509
2c20: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 Obj(interp, cert
2c30: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2c40: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2c50: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2c60: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f Tcl_NewIntObj(o
2c70: 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 k));. Tcl_Lis
2c80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2c90: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2ca0: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 ,..Tcl_NewString
2cb0: 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f Obj((char*)X509_
2cc0: 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f verify_cert_erro
2cd0: 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d r_string(err), -
2ce0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 1));.. /* Pre
2cf0: 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 vent I/O while c
2d00: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72 allback is in pr
2d10: 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a ogress */. /*
2d20: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 statePtr->flags
2d30: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c |= TLS_TCL_CALL
2d40: 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a BACK; */.. /*
2d50: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 Eval callback c
2d60: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 ommand */. Tc
2d70: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
2d80: 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d mdPtr);. ok =
2d90: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e EvalCallback(in
2da0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
2db0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c cmdPtr);. Tcl
2dc0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
2dd0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 dPtr);.. /* s
2de0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
2df0: 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c = ~(TLS_TCL_CALL
2e00: 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 BACK); */. re
2e10: 74 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 turn(ok);./* By
2e20: 64 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 default, leave v
2e30: 65 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 erification unch
2e40: 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a anged. */.}.../*
2e50: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e90: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
2ea0: 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 _Error --. *. *.
2eb0: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 Calls callback w
2ec0: 69 74 68 20 6c 69 73 74 20 6f 66 20 65 72 72 6f ith list of erro
2ed0: 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 rs.. *. * Side e
2ee0: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 ffects:. *.The e
2ef0: 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 rr field of the
2f00: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 currently operat
2f10: 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 ive State is set
2f20: 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e . *. to a strin
2f30: 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 g describing the
2f40: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e SSL negotiation
2f50: 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a failure reason.
2f60: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
2fb0: 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 d.Tls_Error(Stat
2fc0: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 e *statePtr, cha
2fd0: 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 r *msg) {. Tc
2fe0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
2ff0: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
3000: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
3010: 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 *cmdPtr, *listP
3020: 74 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 tr;. unsigned
3030: 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 long err;. s
3040: 74 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d tatePtr->err = m
3050: 73 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 sg;.. dprintf
3060: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
3070: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
3080: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f allback == (Tcl_
3090: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 Obj*)NULL)..retu
30a0: 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 rn;.. /* Crea
30b0: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
30c0: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 al */. cmdPtr
30d0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
30e0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
30f0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c llback);. Tcl
3100: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3110: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3120: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
3130: 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 ingObj("error",
3140: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
3150: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
3160: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
3170: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
3180: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
3190: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
31a0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
31b0: 29 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21 );. if (msg !
31c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c = NULL) {..Tcl_L
31d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
31e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
31f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
3200: 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a gObj(msg, -1));.
3210: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
3220: 28 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 (msg = Tcl_GetSt
3230: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f ringFromObj(Tcl_
3240: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 GetObjResult(int
3250: 65 72 70 29 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 erp), NULL)) !=
3260: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 NULL) {..Tcl_Lis
3270: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3280: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3290: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
32a0: 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 bj(msg, -1));..
32b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73 } else {..lis
32c0: 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 tPtr = Tcl_NewLi
32d0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
32e0: 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 45 .while ((err = E
32f0: 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 20 RR_get_error())
3300: 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c != 0) {.. Tcl
3310: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3320: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 ement(interp, li
3330: 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 stPtr, Tcl_NewSt
3340: 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 73 ringObj(ERR_reas
3350: 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 on_error_string(
3360: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 err), -1));..}..
3370: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
3380: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
3390: 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 72 cmdPtr, listPtr
33a0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
33b0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 Eval callback c
33c0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 ommand */. Tc
33d0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
33e0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c mdPtr);. Eval
33f0: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c Callback(interp,
3400: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 statePtr, cmdPt
3410: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 r);. Tcl_Decr
3420: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
3430: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
3480: 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 *. * KeyLogCallb
3490: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 ack --. *. *.Wri
34a0: 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 20 te received key
34b0: 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65 data to log file
34c0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
34d0: 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ects:. *.none. *
34e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3520: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 ------. */.void
3530: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 KeyLogCallback(c
3540: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 onst SSL *ssl, c
3550: 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 onst char *line)
3560: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 {. char *str
3570: 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 = getenv(SSLKEY
3580: 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 LOGFILE);. FI
3590: 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72 LE *fd;.. dpr
35a0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
35b0: 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a . if (str) {.
35c0: 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c .fd = fopen(str,
35d0: 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 "a");..fprintf(
35e0: 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 fd, "%s\n",line)
35f0: 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 ;..fclose(fd);.
3600: 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d }.}.../*. *--
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3650: 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 -. *. * Password
3660: 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a Callback --. *.
3670: 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 *.Called when a
3680: 20 70 61 73 73 77 6f 72 64 20 66 6f 72 20 61 20 password for a
3690: 70 72 69 76 61 74 65 20 6b 65 79 20 6c 6f 61 64 private key load
36a0: 69 6e 67 2f 73 74 6f 72 69 6e 67 20 61 20 50 45 ing/storing a PE
36b0: 4d 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74 65 M. *.certificate
36c0: 20 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e with encryption
36d0: 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b . Evals callback
36e0: 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75 script and retu
36f0: 72 6e 73 0a 20 2a 09 74 68 65 20 72 65 73 75 6c rns. *.the resul
3700: 74 20 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 t as the passwor
3710: 64 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e d string in buf.
3720: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
3730: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
3740: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
3750: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
3760: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
3770: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 Returns:. *.Pas
3780: 73 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 sword size in by
3790: 74 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e tes or -1 for an
37a0: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d error.. *. *---
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37f0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
3800: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b PasswordCallback
3810: 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 (char *buf, int
3820: 73 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 size, int rwflag
3830: 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b , void *udata) {
3840: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
3850: 65 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 ePtr.= (State *)
3860: 20 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f udata;. Tcl_
3870: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d Interp *interp.=
3880: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
3890: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
38a0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 cmdPtr;. int
38b0: 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e code;.. dprin
38c0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
38d0: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c /* If no call
38e0: 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c back, use defaul
38f0: 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 t callback */.
3900: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
3910: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c password == NULL
3920: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 ) {..if (Tcl_Eva
3930: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 lEx(interp, "tls
3940: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c ::password", -1,
3950: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
3960: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) == TCL_OK) {..
3970: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 char *ret =
3980: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
3990: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 StringResult(int
39a0: 65 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 erp);.. strnc
39b0: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 py(buf, ret, (si
39c0: 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 ze_t) size);..
39d0: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 return (int)st
39e0: 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c rlen(ret);..} el
39f0: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e se {.. return
3a00: 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 -1;..}. }..
3a10: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
3a20: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a mand to eval */.
3a30: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
3a40: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
3a50: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
3a60: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
3a70: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3a80: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3a90: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
3aa0: 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 29 ("password", -1)
3ab0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
3ac0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3ad0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3ae0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77 Tcl_NewIntObj(rw
3af0: 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f flag));. Tcl_
3b00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3b10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3b20: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
3b30: 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20 bj(size));..
3b40: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c Tcl_Preserve((Cl
3b50: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 ientData) interp
3b60: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 );. Tcl_Prese
3b70: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 rve((ClientData)
3b80: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 statePtr);..
3b90: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 /* Eval callbac
3ba0: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 k command */.
3bb0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
3bc0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 t(cmdPtr);. c
3bd0: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 ode = Tcl_EvalOb
3be0: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 jEx(interp, cmdP
3bf0: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f tr, TCL_EVAL_GLO
3c00: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f BAL);. if (co
3c10: 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a de != TCL_OK) {.
3c20: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 #if (TCL_MAJOR_V
3c30: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 ERSION == 8) &&
3c40: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 (TCL_MINOR_VERSI
3c50: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 ON < 6)..Tcl_Bac
3c60: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 kgroundError(int
3c70: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c erp);.#else..Tcl
3c80: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 _BackgroundExcep
3c90: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 tion(interp, cod
3ca0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d e);.#endif. }
3cb0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
3cc0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a Count(cmdPtr);..
3cd0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
3ce0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
3cf0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 tePtr);.. /*
3d00: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 If successful, p
3d10: 61 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f 72 ass back passwor
3d20: 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72 75 d string and tru
3d30: 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e ncate if too lon
3d40: 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 g */. if (cod
3d50: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 e == TCL_OK) {..
3d60: 69 6e 74 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a int len;..char *
3d70: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 ret = (char *) T
3d80: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
3d90: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 Obj(Tcl_GetObjRe
3da0: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c sult(interp), &l
3db0: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 en);..if (len >
3dc0: 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c size-1) {.. l
3dd0: 65 6e 20 3d 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a en = size-1;..}.
3de0: 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 .strncpy(buf, re
3df0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 t, (size_t) len)
3e00: 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c ;..buf[len] = '\
3e10: 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 0';..Tcl_Release
3e20: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
3e30: 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 6c terp);..return(l
3e40: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 en);. }. T
3e50: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
3e60: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
3e70: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a . return -1;.
3e80: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
3ed0: 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 * Session Callb
3ee0: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 ack for Clients
3ef0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
3f00: 77 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 when a new sessi
3f10: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 on is added to t
3f20: 68 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 he cache. In TLS
3f30: 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 1.3. *.this may
3f40: 20 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c be received mul
3f50: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 tiple times afte
3f60: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e r the handshake.
3f70: 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 For. *.earlier
3f80: 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 versions, this w
3f90: 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 ill be received
3fa0: 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 during the hands
3fb0: 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 hake.. *.This is
3fc0: 20 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77 the preferred w
3fd0: 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 ay to obtain a r
3fe0: 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e esumable session
3ff0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
4000: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
4010: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
4020: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
4030: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
4040: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
4050: 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 *.0 = error whe
4060: 72 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 re session will
4070: 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 be immediately r
4080: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 emoved from the
4090: 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a internal cache..
40a0: 20 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 *.1 = success w
40b0: 68 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 here app retains
40c0: 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 session in sess
40d0: 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d ion cache, and m
40e0: 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 ust call SSL_SES
40f0: 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e SION_free() when
4100: 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d done.. *. *----
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4150: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
4160: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 essionCallback(c
4170: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53 onst SSL *ssl, S
4180: 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 SL_SESSION *sess
4190: 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 ion) {. State
41a0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
41b0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 ate*)SSL_get_app
41c0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c _data((SSL *)ssl
41d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 );. Tcl_Inter
41e0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
41f0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
4200: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
4210: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 r;. const uns
4220: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b igned char *tick
4230: 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e et;. const un
4240: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 signed char *ses
4250: 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a sion_id;. siz
4260: 65 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e e_t len2;. un
4270: 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b signed int ulen;
4280: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
4290: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
42a0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
42b0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
42c0: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
42d0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
42e0: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 _OK;. } else
42f0: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 if (ssl == NULL)
4300: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
4310: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
4320: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
4330: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
4340: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 eval */. cmd
4350: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
4360: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
4370: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 >callback);.
4380: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
4390: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
43a0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
43b0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 StringObj("sessi
43c0: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 on", -1));. T
43d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
43e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
43f0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
4400: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
4410: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
4420: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
4430: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 , -1));.. /*
4440: 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 Session id */.
4450: 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 session_id = S
4460: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 SL_SESSION_get_i
4470: 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e d(session, &ulen
4480: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
4490: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
44a0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
44b0: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 Tcl_NewByteArray
44c0: 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 Obj(session_id,
44d0: 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 (int) ulen));..
44e0: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 /* Session ti
44f0: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f cket */. SSL_
4500: 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 SESSION_get0_tic
4510: 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 ket(session, &ti
4520: 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 cket, &len2);.
4530: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
4540: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
4550: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
4560: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 ewByteArrayObj(t
4570: 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e icket, (int) len
4580: 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 2));.. /* Lif
4590: 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f etime - number o
45a0: 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 f seconds */.
45b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
45c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
45d0: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e , cmdPtr,..Tcl_N
45e0: 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 ewLongObj((long)
45f0: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
4600: 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 _ticket_lifetime
4610: 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 _hint(session)))
4620: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
4630: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
4640: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
4650: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
4660: 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 . EvalCallbac
4670: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
4680: 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 tr, cmdPtr);.
4690: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
46a0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 t(cmdPtr);. r
46b0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a eturn 0;.}.../*.
46c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
46d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4700: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e -----. *. * ALPN
4710: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 Callback for Se
4720: 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 rvers and NPN Ca
4730: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e llback for Clien
4740: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 ts --. *. *.Perf
4750: 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 orm protocol (ht
4760: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 tp/1.1, h2, h3,
4770: 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 etc.) selection
4780: 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d for the. *.incom
4790: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 ing connection.
47a0: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c Called after Hel
47b0: 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 lo and server ca
47c0: 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 llbacks.. *.Wher
47d0: 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 e 'out' is selec
47e0: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 ted protocol and
47f0: 20 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 'in' is the pee
4800: 72 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 r advertised lis
4810: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 t.. *. * Results
4820: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.None. *. *
4830: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
4840: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 .Calls callback
4850: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a (if defined). *.
4860: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a * Return codes:
4870: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
4880: 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 RR_OK: ALPN prot
4890: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 ocol selected. T
48a0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
48b0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f ntinues.. *.SSL_
48c0: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 TLSEXT_ERR_ALERT
48d0: 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 _FATAL: There wa
48e0: 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 s no overlap bet
48f0: 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 ween the client'
4900: 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 s. *. supplie
4910: 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 d list and the s
4920: 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 erver configurat
4930: 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ion. The connect
4940: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 ion will be abor
4950: 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ted.. *.SSL_TLSE
4960: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c XT_ERR_NOACK: AL
4970: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 PN protocol not
4980: 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 selected, e.g.,
4990: 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a because no ALPN.
49a0: 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 *. protocols
49b0: 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 are configured
49c0: 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 for this connect
49d0: 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ion. The connect
49e0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
49f0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
4a40: 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 ic int.ALPNCallb
4a50: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
4a60: 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e sl, const unsign
4a70: 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 ed char **out, u
4a80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 nsigned char *ou
4a90: 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 tlen,..const uns
4aa0: 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 igned char *in,
4ab0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c unsigned int inl
4ac0: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b en, void *arg) {
4ad0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
4ae0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
4af0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
4b00: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
4b10: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
4b20: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
4b30: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
4b40: 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 , res;.. dpri
4b50: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
4b60: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e if (ssl == N
4b70: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 ULL || arg == NU
4b80: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
4b90: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
4ba0: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f CK;. }.. /
4bb0: 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f * Select protoco
4bc0: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c l */. if (SSL
4bd0: 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f _select_next_pro
4be0: 74 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 to(out, outlen,
4bf0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
4c00: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 , statePtr->prot
4c10: 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c os_len,..in, inl
4c20: 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e en) == OPENSSL_N
4c30: 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b PN_NEGOTIATED) {
4c40: 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 ../* Match found
4c50: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 */..res = SSL_T
4c60: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 LSEXT_ERR_OK;.
4c70: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f } else {../* O
4c80: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 PENSSL_NPN_NO_OV
4c90: 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c ERLAP = No overl
4ca0: 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 ap, so use first
4cb0: 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e item from clien
4cc0: 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 t protocol list
4cd0: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c */..res = SSL_TL
4ce0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4cf0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
4d00: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d tatePtr->vcmd ==
4d10: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 (Tcl_Obj*)NULL)
4d20: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a {..return res;.
4d30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
4d40: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
4d50: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
4d60: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
4d70: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
4d80: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
4d90: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4da0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4db0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
4dc0: 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 gObj("alpn", -1)
4dd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
4de0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
4df0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
4e00: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
4e10: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 ngObj(Tcl_GetCha
4e20: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
4e30: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a r->self), -1));.
4e40: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4e50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4e60: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
4e70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f _NewStringObj(*o
4e80: 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 ut, -1));. Tc
4e90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4ea0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4eb0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f mdPtr, Tcl_NewBo
4ec0: 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 oleanObj(res ==
4ed0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
4ee0: 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 K));.. /* Eva
4ef0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
4f00: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
4f10: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
4f20: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 r);. if ((cod
4f30: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b e = EvalCallback
4f40: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
4f50: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 r, cmdPtr)) > 1)
4f60: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
4f70: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4f80: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
4f90: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 ode == 1) {..res
4fa0: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 = SSL_TLSEXT_ER
4fb0: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 R_OK;. } else
4fc0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
4fd0: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 SEXT_ERR_ALERT_F
4fe0: 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ATAL;. }.
4ff0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
5000: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 (cmdPtr);. re
5010: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a turn res;.}.../*
5020: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5060: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 ------. *. * Adv
5070: 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 ertise Protocols
5080: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 Callback for Ne
5090: 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f xt Protocol Nego
50a0: 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e tiation (NPN) in
50b0: 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a ServerHello --.
50c0: 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 *. *.called whe
50d0: 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e n a TLS server n
50e0: 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73 eeds a list of s
50f0: 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f upported protoco
5100: 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 ls for Next. *.P
5110: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 rotocol Negotiat
5120: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ion.. *. * Resul
5130: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
5140: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
5150: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
5160: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
5170: 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 T_ERR_OK: NPN pr
5180: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e otocol selected.
5190: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
51a0: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
51b0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
51c0: 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c CK: NPN protocol
51d0: 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54 not selected. T
51e0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
51f0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d ntinues.. *. *--
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5240: 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 -. */.#ifdef USE
5250: 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a _NPN.static int.
5260: 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 NPNCallback(cons
5270: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 t SSL *ssl, cons
5280: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
5290: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 **out, unsigned
52a0: 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 int *outlen, voi
52b0: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 d *arg) {. St
52c0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
52d0: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 (State*)arg;..
52e0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
52f0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 d");.. if (ss
5300: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 l == NULL || arg
5310: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
5320: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
5330: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
5340: 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 . /* Set prot
5350: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 ocols list */.
5360: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
5370: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 protos != NULL)
5380: 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 {..*out = stateP
5390: 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 tr->protos;..*ou
53a0: 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d tlen = statePtr-
53b0: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 >protos_len;.
53c0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 } else {..*out
53d0: 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e = NULL;..*outlen
53e0: 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 = 0;..return SS
53f0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
5400: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 CK;. }. re
5410: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
5420: 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 ERR_OK;.}.#endif
5430: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
5440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
5480: 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 * SNI Callback f
5490: 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a or Servers --. *
54a0: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 . *.Perform serv
54b0: 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 er-side SNI host
54c0: 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 name selection a
54d0: 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 fter receiving S
54e0: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 NI extension. *.
54f0: 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e in Client Hello.
5500: 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 Called after he
5510: 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 llo callback but
5520: 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c before ALPN cal
5530: 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
5540: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
5550: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
5560: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
5570: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
5580: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
5590: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 des:. *.SSL_TLSE
55a0: 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 XT_ERR_OK: SNI h
55b0: 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 ostname is accep
55c0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
55d0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
55e0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
55f0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e _ALERT_FATAL: SN
5600: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
5610: 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 t accepted. The
5620: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 connection. *.
5630: 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 is aborted. De
5640: 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 fault for alert
5650: 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f is SSL_AD_UNRECO
5660: 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 GNIZED_NAME.. *.
5670: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5680: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e LERT_WARNING: SN
5690: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
56a0: 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e t accepted, warn
56b0: 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 ing alert. *.
56c0: 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f sent (not suppo
56d0: 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 rted in TLSv1.3)
56e0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
56f0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
5700: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
5710: 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d ACK: SNI hostnam
5720: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 e is not accepte
5730: 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 d and not acknow
5740: 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 ledged,. *. e
5750: 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e .g. if SNI has n
5760: 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 ot been configur
5770: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
5780: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
5790: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
57e0: 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 c int.SNICallbac
57f0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
5800: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f , int *alert, vo
5810: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
5820: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
5830: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
5840: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
5850: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
5860: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
5870: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
5880: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
5890: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 . char *serve
58a0: 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 rname = NULL;..
58b0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
58c0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
58d0: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 sl == NULL || ar
58e0: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 g == NULL) {..re
58f0: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
5900: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
5910: 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f .. /* Only wo
5920: 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 rks for TLS 1.2
5930: 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 and earlier */.
5940: 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 servername =
5950: 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 SSL_get_serverna
5960: 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e me(ssl, TLSEXT_N
5970: 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d AMETYPE_host_nam
5980: 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72 e);. if (!ser
5990: 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 vername || serve
59a0: 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 rname[0] == '\0'
59b0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
59c0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
59d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
59e0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 (statePtr->vcmd
59f0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
5a00: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
5a10: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
5a20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
5a30: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
5a40: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
5a50: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
5a60: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
5a70: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
5a80: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5a90: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5aa0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
5ab0: 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 gObj("sni", -1))
5ac0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
5ad0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5ae0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
5af0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
5b00: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
5b10: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
5b20: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
5b30: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5b40: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5b50: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
5b60: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 NewStringObj(ser
5b70: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a vername , -1));.
5b80: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
5b90: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
5ba0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
5bb0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
5bc0: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 if ((code = E
5bd0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
5be0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
5bf0: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 dPtr)) > 1) {..r
5c00: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
5c10: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e ERR_ALERT_WARNIN
5c20: 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c G;..*alert = SSL
5c30: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 _AD_UNRECOGNIZED
5c40: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 _NAME; /* Not su
5c50: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 pported by TLS 1
5c60: 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 .3 */. } else
5c70: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
5c80: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
5c90: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
5ca0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
5cb0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5cc0: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c LERT_FATAL;..*al
5cd0: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 ert = SSL_AD_UNR
5ce0: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 ECOGNIZED_NAME;
5cf0: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 /* Not supported
5d00: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 by TLS 1.3 */.
5d10: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
5d20: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
5d30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 );. return re
5d40: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d s;.}.../*. *----
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
5d90: 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c *. * ClientHell
5da0: 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c o Handshake Call
5db0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 back for Servers
5dc0: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 --. *. *.Used b
5dd0: 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d y server to exam
5de0: 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e ine the server n
5df0: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 ame indication (
5e00: 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 SNI) extension.
5e10: 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 *.provided by th
5e20: 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 e client in orde
5e30: 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 r to select an a
5e40: 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 ppropriate certi
5e50: 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 ficate to. *.pre
5e60: 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f sent, and make o
5e70: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 ther configurati
5e80: 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 on adjustments r
5e90: 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 elevant to that
5ea0: 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 server. *.name a
5eb0: 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 nd its configura
5ec0: 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 tion. This inclu
5ed0: 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 des swapping out
5ee0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a the associated.
5ef0: 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 *.SSL_CTX point
5f00: 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 er, modifying th
5f10: 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 e server's list
5f20: 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 of permitted TLS
5f30: 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 versions,. *.ch
5f40: 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 anging the serve
5f50: 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 r's cipher list
5f60: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 in response to t
5f70: 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 he client's ciph
5f80: 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a er list, etc.. *
5f90: 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 .Called before S
5fa0: 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c NI and ALPN call
5fb0: 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 backs.. *. * Res
5fc0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
5fd0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
5fe0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
5ff0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
6000: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
6010: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 des:. *.SSL_CLIE
6020: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 NT_HELLO_RETRY:
6030: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 suspend the hand
6040: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 shake, and the h
6050: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f andshake functio
6060: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d n will return im
6070: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c mediately. *.SSL
6080: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6090: 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 ROR: failure, te
60a0: 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 rminate connecti
60b0: 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f on. Set alert to
60c0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 error code.. *.
60d0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
60e0: 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 _SUCCESS: succes
60f0: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d s. *. *---------
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
6140: 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 tatic int.HelloC
6150: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
6160: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
6170: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
6180: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
6190: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
61a0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
61b0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
61c0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
61d0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
61e0: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
61f0: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 , res;. const
6200: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
6210: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
6220: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 igned char *p;.
6230: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 size_t len, r
6240: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 emaining;.. d
6250: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
6260: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
6270: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 Ptr->vcmd == (Tc
6280: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
6290: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
62a0: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b T_HELLO_SUCCESS;
62b0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
62c0: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 ssl == (const SS
62d0: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 L *)NULL || arg
62e0: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 == (void *)NULL)
62f0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 {..return SSL_C
6300: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6310: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6320: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 Get names */.
6330: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e if (!SSL_clien
6340: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 t_hello_get0_ext
6350: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 (ssl, TLSEXT_TYP
6360: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 E_server_name, &
6370: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c p, &remaining) |
6380: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 | remaining <= 2
6390: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
63a0: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f L_R_SSLV3_ALERT_
63b0: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 ILLEGAL_PARAMETE
63c0: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 R;..return SSL_C
63d0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
63e0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
63f0: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e Extract the len
6400: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c gth of the suppl
6410: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 ied list of name
6420: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 s. */. len =
6430: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 (*(p++) << 8);.
6440: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 len += *(p++)
6450: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 ;. if (len +
6460: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 2 != remaining)
6470: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
6480: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c R_SSLV3_ALERT_IL
6490: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b LEGAL_PARAMETER;
64a0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
64b0: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
64c0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 . }. remai
64d0: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 ning = len;..
64e0: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 /* The list in
64f0: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 practice only ha
6500: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 s a single eleme
6510: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 nt, so we only c
6520: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 onsider the firs
6530: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 t one. */. if
6540: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 (remaining == 0
6550: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 || *p++ != TLSE
6560: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 XT_NAMETYPE_host
6570: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 _name) {..*alert
6580: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
6590: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
65a0: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c ROR;..return SSL
65b0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
65c0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
65d0: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 emaining--;..
65e0: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 /* Now we can f
65f0: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 inally pull out
6600: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 the byte array w
6610: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 ith the actual h
6620: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 ostname. */.
6630: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d if (remaining <=
6640: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 2) {..*alert =
6650: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
6660: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 T_INTERNAL_ERROR
6670: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
6680: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
6690: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 ;. }. len
66a0: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b = (*(p++) << 8);
66b0: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b . len += *(p+
66c0: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 +);. if (len
66d0: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 + 2 > remaining)
66e0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
66f0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
6700: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
6710: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6720: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
6730: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
6740: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 ng = len;. se
6750: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 rvername = (cons
6760: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 t char *)p;..
6770: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
6780: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
6790: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
67a0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
67b0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
67c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
67d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
67e0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
67f0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c wStringObj("hell
6800: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 o", -1));. Tc
6810: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
6820: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
6830: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
6840: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
6850: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
6860: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
6870: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
6880: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
6890: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
68a0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
68b0: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c gObj(servername,
68c0: 20 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 0a 20 (int) len));..
68d0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
68e0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 ack command */.
68f0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
6900: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
6910: 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 if ((code = Eva
6920: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
6930: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
6940: 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 tr)) > 1) {..res
6950: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 = SSL_CLIENT_HE
6960: 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 6c 65 LLO_RETRY;..*ale
6970: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 rt = SSL_R_TLSV1
6980: 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 41 4e 43 _ALERT_USER_CANC
6990: 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65 6c 73 ELLED;. } els
69a0: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 e if (code == 1)
69b0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c {..res = SSL_CL
69c0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 IENT_HELLO_SUCCE
69d0: 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b SS;. } else {
69e0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 ..res = SSL_CLIE
69f0: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
6a00: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f .*alert = SSL_R_
6a10: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 TLSV1_ALERT_INTE
6a20: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 RNAL_ERROR;.
6a30: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 }. Tcl_DecrRe
6a40: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
6a50: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a return res;.
6a60: 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a }.../***********
6a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f *********/./* Co
6a80: 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 20 20 2a mmands *
6a90: 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /./*************
6aa0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d *******/../*. *-
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6af0: 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 --. *. * Ciphers
6b00: 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 ObjCmd -- list a
6b10: 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 vailable ciphers
6b20: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
6b30: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
6b40: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 to process the
6b50: 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 "tls::ciphers" c
6b60: 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 ommand. *.to lis
6b70: 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 t available ciph
6b80: 65 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 ers, based upon
6b90: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 protocol selecte
6ba0: 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 d.. *. * Results
6bb0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
6bc0: 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e Tcl result list.
6bd0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
6be0: 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 cts:. *.construc
6bf0: 74 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 ts and destroys
6c00: 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 SSL context (CTX
6c10: 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ). *. *---------
6c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
6c60: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
6c70: 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 *protocols[] =
6c80: 7b 0a 09 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 {.."ssl2", "ssl3
6c90: 22 2c 20 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 ", "tls1", "tls1
6ca0: 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 .1", "tls1.2", "
6cb0: 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b tls1.3", NULL.};
6cc0: 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b .enum protocol {
6cd0: 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 . TLS_SSL2, T
6ce0: 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 LS_SSL3, TLS_TLS
6cf0: 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 1, TLS_TLS1_1, T
6d00: 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 LS_TLS1_2, TLS_T
6d10: 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a LS1_3, TLS_NONE.
6d20: 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 };..static int.C
6d30: 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69 iphersObjCmd(Cli
6d40: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
6d50: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
6d60: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
6d70: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
6d80: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
6d90: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d cl_Obj *objPtr =
6da0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 NULL;. SSL_C
6db0: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a TX *ctx = NULL;.
6dc0: 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e SSL *ssl = N
6dd0: 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f ULL;. STACK_O
6de0: 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 F(SSL_CIPHER) *s
6df0: 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c k;. char *cp,
6e00: 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 buf[BUFSIZ];.
6e10: 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 int index, ver
6e20: 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 bose = 0, use_su
6e30: 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 0a 20 20 pported = 0;..
6e40: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
6e50: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f d");.. if ((o
6e60: 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a bjc < 2) || (obj
6e70: 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 c > 4)) {..Tcl_W
6e80: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
6e90: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 rp, 1, objv, "pr
6ea0: 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f otocol ?verbose?
6eb0: 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a ?supported?");.
6ec0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
6ed0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
6ee0: 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f (Tcl_GetIndexFro
6ef0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
6f00: 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c v[1], protocols,
6f10: 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 "protocol", 0,
6f20: 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f &index) != TCL_O
6f30: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
6f40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
6f50: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 32 29 if ((objc > 2)
6f60: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 && Tcl_GetBoole
6f70: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 anFromObj(interp
6f80: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62 , objv[2], &verb
6f90: 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ose) != TCL_OK)
6fa0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
6fb0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
6fc0: 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 26 26 f ((objc > 3) &&
6fd0: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 Tcl_GetBooleanF
6fe0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
6ff0: 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75 70 bjv[3], &use_sup
7000: 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c 5f 4f ported) != TCL_O
7010: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
7020: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
7030: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 ERR_clear_err
7040: 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 or();.. switc
7050: 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f h ((enum protoco
7060: 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 65 l)index) {..case
7070: 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f TLS_SSL2:.#if O
7080: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
7090: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 UMBER >= 0x10100
70a0: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 000L || defined(
70b0: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 NO_SSL2) || defi
70c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
70d0: 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 SL2).. Tcl_Ap
70e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
70f0: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
7100: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
7110: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
7120: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
7130: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
7140: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 else.. ctx =
7150: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 SSL_CTX_new(SSLv
7160: 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 2_method()); bre
7170: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
7180: 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 TLS_SSL3:.#if d
7190: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
71a0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
71b0: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 SL_NO_SSL3) || d
71c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
71d0: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 O_SSL3_METHOD)..
71e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
71f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
7200: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
7210: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
7220: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
7230: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
7240: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
7250: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 ctx = SSL_CT
7260: 58 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65 74 68 X_new(SSLv3_meth
7270: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 od()); break;.#e
7280: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
7290: 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 LS1:.#if defined
72a0: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 (NO_TLS1) || def
72b0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
72c0: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 TLS1) || defined
72d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
72e0: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 _METHOD).. Tc
72f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
7300: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
7310: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
7320: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
7330: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
7340: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
7350: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 R;.#else.. ct
7360: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 x = SSL_CTX_new(
7370: 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 29 3b TLSv1_method());
7380: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
7390: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a case TLS_TLS1_1:
73a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
73b0: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
73c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
73d0: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
73e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
73f0: 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 _1_METHOD)..
7400: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7410: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
7420: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
7430: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
7440: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
7450: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
7460: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
7470: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
7480: 77 28 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 w(TLSv1_1_method
7490: 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 ()); break;.#end
74a0: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
74b0: 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 1_2:.#if defined
74c0: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 (NO_TLS1_2) || d
74d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
74e0: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 O_TLS1_2) || def
74f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
7500: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 TLS1_2_METHOD)..
7510: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
7520: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
7530: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
7540: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
7550: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
7560: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
7570: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
7580: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 ctx = SSL_CT
7590: 58 5f 6e 65 77 28 54 4c 53 76 31 5f 32 5f 6d 65 X_new(TLSv1_2_me
75a0: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a thod()); break;.
75b0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 #endif..case TLS
75c0: 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 _TLS1_3:.#if def
75d0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
75e0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
75f0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 SL_NO_TLS1_3)..
7600: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
7610: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
7620: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
7630: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
7640: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
7650: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
7660: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
7670: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
7680: 5f 6e 65 77 28 54 4c 53 5f 6d 65 74 68 6f 64 28 _new(TLS_method(
7690: 29 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 ));.. SSL_CTX
76a0: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 _set_min_proto_v
76b0: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
76c0: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 _3_VERSION);..
76d0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 SSL_CTX_set_ma
76e0: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 x_proto_version(
76f0: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 ctx, TLS1_3_VERS
7700: 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b ION);.. break
7710: 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c ;.#endif..defaul
7720: 74 3a 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 t:.. break;.
7730: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 74 78 }. if (ctx
7740: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c == NULL) {..Tcl
7750: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
7760: 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 terp, REASON(),
7770: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
7780: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
7790: 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e . ssl = SSL_n
77a0: 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20 ew(ctx);. if
77b0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl == NULL) {.
77c0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
77d0: 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e t(interp, REASON
77e0: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f (), NULL);..SSL_
77f0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
7800: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7810: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
7820: 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 Use list and ord
7830: 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 er as would be s
7840: 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 ent in a ClientH
7850: 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 ello or all avai
7860: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a 2f lable ciphers */
7870: 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75 70 . if (use_sup
7880: 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 ported) {..sk =
7890: 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 SSL_get1_support
78a0: 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b ed_ciphers(ssl);
78b0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 . } else {..s
78c0: 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 k = SSL_get_ciph
78d0: 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a ers(ssl);. }.
78e0: 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e . if (sk != N
78f0: 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 72 ULL) {..if (!ver
7900: 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f 62 6a bose) {.. obj
7910: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
7920: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 tObj(0, NULL);..
7930: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d for (int i =
7940: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 0; i < sk_SSL_C
7950: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 IPHER_num(sk); i
7960: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 ++) {...const SS
7970: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b L_CIPHER *c = sk
7980: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 _SSL_CIPHER_valu
7990: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 e(sk, i);...if (
79a0: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 c == NULL) conti
79b0: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 nue;..../* ciphe
79c0: 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 r name or (NONE)
79d0: 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 */...cp = SSL_C
79e0: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 IPHER_get_name(c
79f0: 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e );...if (cp == N
7a00: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 ULL) break;...Tc
7a10: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
7a20: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
7a30: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
7a40: 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 ringObj(cp, -1))
7a50: 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 ;.. }...} els
7a60: 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 e {.. objPtr
7a70: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f = Tcl_NewStringO
7a80: 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 bj("",0);.. f
7a90: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 or (int i = 0; i
7aa0: 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 < sk_SSL_CIPHER
7ab0: 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b _num(sk); i++) {
7ac0: 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 ...const SSL_CIP
7ad0: 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f HER *c = sk_SSL_
7ae0: 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c CIPHER_value(sk,
7af0: 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 i);...if (c ==
7b00: 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a NULL) continue;.
7b10: 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 .../* textual de
7b20: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 scription of the
7b30: 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 cipher */...if
7b40: 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 (SSL_CIPHER_desc
7b50: 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 ription(c, buf,
7b60: 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 sizeof(buf)) !=
7b70: 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 NULL) {... Tc
7b80: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 l_AppendToObj(ob
7b90: 6a 50 74 72 2c 20 62 75 66 2c 20 28 69 6e 74 29 jPtr, buf, (int)
7ba0: 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 strlen(buf));..
7bb0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 .} else {...
7bc0: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 Tcl_AppendToObj(
7bd0: 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e objPtr, "UNKNOWN
7be0: 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 \n", 8);...}..
7bf0: 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f }..}..if (use_
7c00: 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 supported) {..
7c10: 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f sk_SSL_CIPHER_
7c20: 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 free(sk);..}.
7c30: 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 }. SSL_free(
7c40: 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 ssl);. SSL_CT
7c50: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 X_free(ctx);..
7c60: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
7c70: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
7c80: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
7c90: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
7ca0: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
7cb0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
7d00: 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a . * ProtocolsObj
7d10: 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 Cmd -- list avai
7d20: 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 0a lable protocols.
7d30: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
7d40: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
7d50: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
7d60: 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 tls::protocols"
7d70: 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 command. *.to li
7d80: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f st available pro
7d90: 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 tocols.. *. * Re
7da0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
7db0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 dard Tcl result
7dc0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 list.. *. * Side
7dd0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e effects:. *.non
7de0: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
7df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
7e30: 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f 63 tatic int.Protoc
7e40: 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 olsObjCmd(Client
7e50: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
7e60: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
7e70: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
7e80: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
7e90: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
7ea0: 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 Obj *objPtr;..
7eb0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
7ec0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
7ed0: 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f jc != 1) {..Tcl_
7ee0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
7ef0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 erp, 1, objv, ""
7f00: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
7f10: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
7f20: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 ERR_clear_error
7f30: 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 ();.. objPtr
7f40: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
7f50: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 (0, NULL);..#if
7f60: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
7f70: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
7f80: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 000L && !defined
7f90: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 (NO_SSL2) && !de
7fa0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7fb0: 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c _SSL2). Tcl_L
7fc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
7fd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
7fe0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
7ff0: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
8000: 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a LS_SSL2], -1));.
8010: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
8020: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 ned(NO_SSL3) &&
8030: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
8040: 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 _NO_SSL3) && !de
8050: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8060: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 _SSL3_METHOD).
8070: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
8080: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
8090: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
80a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
80b0: 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c ocols[TLS_SSL3],
80c0: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 -1));.#endif.#i
80d0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
80e0: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
80f0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
8100: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
8110: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 NSSL_NO_TLS1_MET
8120: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 HOD). Tcl_Lis
8130: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
8140: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
8150: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
8160: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
8170: 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 _TLS1], -1));.#e
8180: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
8190: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 d(NO_TLS1_1) &&
81a0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
81b0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 _NO_TLS1_1) && !
81c0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
81d0: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 NO_TLS1_1_METHOD
81e0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
81f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
8200: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
8210: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
8220: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
8230: 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e S1_1], -1));.#en
8240: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
8250: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 (NO_TLS1_2) && !
8260: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8270: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
8280: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
8290: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 O_TLS1_2_METHOD)
82a0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
82b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
82c0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
82d0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
82e0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 rotocols[TLS_TLS
82f0: 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 1_2], -1));.#end
8300: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
8310: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
8320: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
8330: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 O_TLS1_3). Tc
8340: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
8350: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
8360: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
8370: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
8380: 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d s[TLS_TLS1_3], -
8390: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 1));.#endif..
83a0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
83b0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
83c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
83d0: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 L_OK;..clientDat
83e0: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a a = clientData;.
83f0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
8400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
8440: 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 * HandshakeObjC
8450: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 md --. *. *.This
8460: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 command is used
8470: 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 68 to verify wheth
8480: 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 er the handshake
8490: 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 is complete. *.
84a0: 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 or not.. *. * Re
84b0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
84c0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
84d0: 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 1 means handsha
84e0: 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d ke complete, 0 m
84f0: 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a eans pending.. *
8500: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
8510: 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 :. *.May force S
8520: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 SL negotiation t
8530: 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a o take place.. *
8540: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
8550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8580: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
8590: 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f c int HandshakeO
85a0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
85b0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
85c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
85d0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
85e0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
85f0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ) {. Tcl_Chan
8600: 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 20 nel chan;
8610: 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 /* The channel
8620: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e to set a mode on
8630: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a . */. State *
8640: 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20 20 statePtr;
8650: 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 /* client state
8660: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 for ssl socket
8670: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 */. const cha
8680: 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c r *errStr = NULL
8690: 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20 ;. int ret =
86a0: 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 1;. int err =
86b0: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 0;.. dprintf
86c0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
86d0: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 if (objc != 2)
86e0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
86f0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
8700: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b bjv, "channel");
8710: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
8720: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
8730: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
8740: 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 );.. chan = T
8750: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
8760: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
8770: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
8780: 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 1], NULL), NULL)
8790: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
87a0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
87b0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 NULL) {..return(
87c0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
87d0: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 }.. /* Make s
87e0: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f ure to operate o
87f0: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 n the topmost ch
8800: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 annel */. cha
8810: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
8820: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 annel(chan);.
8830: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
8840: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
8850: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
8860: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e ()) {..Tcl_Appen
8870: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
8880: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
8890: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
88a0: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 Name(chan),..
88b0: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 "\": not a TLS
88c0: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
88d0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
88e0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
88f0: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 , "HANDSHAKE", "
8900: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c CHANNEL", "INVAL
8910: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ID", (char *) NU
8920: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c LL);..return(TCL
8930: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 _ERROR);. }.
8940: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 statePtr = (S
8950: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
8960: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
8970: 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 a(chan);.. dp
8980: 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 rintf("Calling T
8990: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 ls_WaitForConnec
89a0: 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 t");. ret = T
89b0: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 ls_WaitForConnec
89c0: 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 t(statePtr, &err
89d0: 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 , 1);. dprint
89e0: 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f f("Tls_WaitForCo
89f0: 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 nnect returned:
8a00: 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 %i", ret);..
8a10: 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 if (ret < 0 && (
8a20: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
8a30: 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 & TLS_TCL_ASYNC
8a40: 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 ) && (err == EAG
8a50: 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 AIN))) {..dprint
8a60: 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 f("Async set and
8a70: 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b err = EAGAIN");
8a80: 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d ..ret = 0;. }
8a90: 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 else if (ret <
8aa0: 30 29 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 73 0) {..errStr = s
8ab0: 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 tatePtr->err;..T
8ac0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 cl_ResetResult(i
8ad0: 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 nterp);..Tcl_Set
8ae0: 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 Errno(err);...if
8af0: 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 (!errStr || (*e
8b00: 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 rrStr == 0)) {..
8b10: 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c errStr = Tcl
8b20: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 _PosixError(inte
8b30: 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 rp);..}...Tcl_Ap
8b40: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
8b50: 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 p, "handshake fa
8b60: 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c iled: ", errStr,
8b70: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
8b80: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
8b90: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
8ba0: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 , "HANDSHAKE", "
8bb0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
8bc0: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 ) NULL);..dprint
8bd0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c f("Returning TCL
8be0: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 _ERROR with hand
8bf0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 shake failed: %s
8c00: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 ", errStr);..ret
8c10: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
8c20: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 } else {..if
8c30: 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 (err != 0) {..
8c40: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 dprintf("Got
8c50: 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 an error with a
8c60: 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 completed handsh
8c70: 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 ake: err = %i",
8c80: 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 err);..}..ret =
8c90: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 1;. }.. dp
8ca0: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
8cb0: 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 TCL_OK with dat
8cc0: 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b a \"%i\"", ret);
8cd0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
8ce0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
8cf0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 l_NewIntObj(ret)
8d00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 );. return(TC
8d10: 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61 L_OK);..clientDa
8d20: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
8d30: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
8d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
8d80: 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 * ImportObjCmd
8d90: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
8da0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
8db0: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 ed to process th
8dc0: 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a e "ssl" command.
8dd0: 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f *. *.The ssl co
8de0: 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c mmand pushes SSL
8df0: 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 over a (newly c
8e00: 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f onnected) tcp so
8e10: 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c cket. *. * Resul
8e20: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
8e30: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
8e40: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
8e50: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 :. *.May modify
8e60: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 the behavior of
8e70: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 an IO channel..
8e80: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ec0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
8ed0: 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a ic int.ImportObj
8ee0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
8ef0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
8f00: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
8f10: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
8f20: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
8f30: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
8f40: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
8f50: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
8f60: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 mode on. */.
8f70: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
8f80: 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 ;../* client sta
8f90: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 te for ssl socke
8fa0: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 t */. SSL_CTX
8fb0: 20 2a 63 74 78 09 20 20 20 20 20 20 20 20 3d 20 *ctx. =
8fc0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
8fd0: 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20 20 20 j *script.
8fe0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 = NULL;. Tc
8ff0: 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 l_Obj *password.
9000: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
9010: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d Tcl_Obj *vcm
9020: 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c d. = NULL
9030: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
9040: 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 g upperChannelTr
9050: 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 anslation, upper
9060: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c ChannelBlocking,
9070: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 upperChannelEnc
9080: 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e oding, upperChan
9090: 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 nelEOFChar;.
90a0: 69 6e 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 int idx, len;.
90b0: 20 20 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 int flags..
90c0: 20 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 = TLS_TCL_I
90d0: 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 NIT;. int ser
90e0: 76 65 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 ver.. = 0
90f0: 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 ;./* is connecti
9100: 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f on incoming or o
9110: 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 utgoing? */.
9120: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 char *keyfile.
9130: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
9140: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 char *certfile
9150: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
9160: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
9170: 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c ar *key .= NULL
9180: 3b 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 ;. int key_le
9190: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 n
91a0: 20 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 = 0;. unsig
91b0: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 20 20 ned char *cert
91c0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
91d0: 20 20 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 20 int cert_len
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d =
91f0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 0;. char *ci
9200: 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 phers. =
9210: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
9220: 63 69 70 68 65 72 73 75 69 74 65 73 09 20 20 20 ciphersuites.
9230: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
9240: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 20 20 char *CAfile.
9250: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
9260: 20 20 63 68 61 72 20 2a 43 41 64 69 72 09 09 20 char *CAdir..
9270: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
9280: 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d char *DHparam
9290: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c s. = NULL
92a0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 ;. char *mode
92b0: 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c l.. = NUL
92c0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 L;. char *ser
92d0: 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20 20 20 vername.
92e0: 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e = NULL;./* hostn
92f0: 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e ame for Server N
9300: 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a ame Indication *
9310: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 /. const unsi
9320: 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 gned char *sessi
9330: 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 on_id = NULL;.
9340: 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 Tcl_Obj *alpn.
9350: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 .= NULL;. int
9360: 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 ssl2 = 0, ssl3
9370: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 = 0;. int tls
9380: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 1 = 1, tls1_1 =
9390: 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 1, tls1_2 = 1, t
93a0: 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 ls1_3 = 1;. i
93b0: 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 nt proto = 0, le
93c0: 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e vel = -1;. in
93d0: 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 t verify = 0, re
93e0: 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 quire = 0, reque
93f0: 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e st = 1, post_han
9400: 64 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 dshake = 0;..
9410: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
9420: 22 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c ");..#if OPENSSL
9430: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
9440: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 < 0x10100000L &&
9450: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
9460: 4c 5f 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 L_NO_SSL2) && !d
9470: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
9480: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 && defined(NO_SS
9490: 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e L3) && defined(N
94a0: 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66 69 6e O_TLS1) && defin
94b0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
94c0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
94d0: 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e _2) && defined(N
94e0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 73 73 O_TLS1_3). ss
94f0: 6c 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 l2 = 1;.#endif.#
9500: 69 66 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e if !defined(OPEN
9510: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 SSL_NO_SSL3) &&
9520: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 !defined(NO_SSL3
9530: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f ) && defined(NO_
9540: 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e 65 64 SSL2) && defined
9550: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66 (NO_TLS1) && def
9560: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
9570: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
9580: 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64 S1_2) && defined
9590: 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 (NO_TLS1_3).
95a0: 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e 64 69 66 ssl3 = 1;.#endif
95b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
95c0: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 TLS1) || defined
95d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
95e0: 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a ). tls1 = 0;.
95f0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
9600: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
9610: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
9620: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 _NO_TLS1_1).
9630: 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 tls1_1 = 0;.#end
9640: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
9650: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 O_TLS1_2) || def
9660: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
9670: 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 TLS1_2). tls1
9680: 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 _2 = 0;.#endif.#
9690: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
96a0: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_3) || defined
96b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
96c0: 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d _3). tls1_3 =
96d0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 0;.#endif..
96e0: 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a if (objc < 2) {.
96f0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
9700: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
9710: 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 v, "channel ?opt
9720: 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e ions?");..return
9730: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
9740: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
9750: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 _error();.. c
9760: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
9770: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
9780: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
9790: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 j(objv[1], NULL)
97a0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 , NULL);. if
97b0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
97c0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
97d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
97e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
97f0: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
9800: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
9810: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
9820: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
9830: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
9840: 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 );.. for (idx
9850: 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 = 2; idx < objc
9860: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 ; idx++) {..char
9870: 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 *opt = Tcl_GetS
9880: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
9890: 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a v[idx], NULL);..
98a0: 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 .if (opt[0] != '
98b0: 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a -').. break;.
98c0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 ..OPTOBJ("-alpn"
98d0: 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 , alpn);..OPTSTR
98e0: 28 22 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 ("-cadir", CAdir
98f0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 );..OPTSTR("-caf
9900: 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 ile", CAfile);..
9910: 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c OPTBYTE("-cert",
9920: 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 cert, cert_len)
9930: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 ;..OPTSTR("-cert
9940: 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 file", certfile)
9950: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 ;..OPTSTR("-ciph
9960: 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 er", ciphers);..
9970: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 OPTSTR("-ciphers
9980: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 ", ciphers);..OP
9990: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 TSTR("-ciphersui
99a0: 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 tes", ciphersuit
99b0: 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 es);..OPTOBJ("-c
99c0: 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 ommand", script)
99d0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 ;..OPTSTR("-dhpa
99e0: 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 rams", DHparams)
99f0: 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 ;..OPTBYTE("-key
9a00: 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 ", key, key_len)
9a10: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 ;..OPTSTR("-keyf
9a20: 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a ile", keyfile);.
9a30: 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 .OPTSTR("-model"
9a40: 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 , model);..OPTOB
9a50: 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 J("-password", p
9a60: 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f assword);..OPTBO
9a70: 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 OL("-post_handsh
9a80: 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 ake", post_hands
9a90: 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 hake);..OPTBOOL(
9aa0: 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 "-request", requ
9ab0: 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 est);..OPTBOOL("
9ac0: 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 -require", requi
9ad0: 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 re);..OPTINT("-s
9ae0: 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 6c ecuritylevel", l
9af0: 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 evel);..OPTBOOL(
9b00: 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 "-server", serve
9b10: 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 r);..OPTSTR("-se
9b20: 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 rvername", serve
9b30: 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 rname);..OPTSTR(
9b40: 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 "-session_id", s
9b50: 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 ession_id);..OPT
9b60: 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 BOOL("-ssl2", ss
9b70: 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d l2);..OPTBOOL("-
9b80: 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f ssl3", ssl3);..O
9b90: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 PTBOOL("-tls1",
9ba0: 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 tls1);..OPTBOOL(
9bb0: 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f "-tls1.1", tls1_
9bc0: 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 1);..OPTBOOL("-t
9bd0: 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b ls1.2", tls1_2);
9be0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 ..OPTBOOL("-tls1
9bf0: 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f .3", tls1_3);..O
9c00: 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 PTOBJ("-validate
9c10: 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b command", vcmd);
9c20: 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 ..OPTOBJ("-vcmd"
9c30: 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 , vcmd);...OPTBA
9c40: 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c D("option", "-al
9c50: 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 pn, -cadir, -caf
9c60: 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 ile, -cert, -cer
9c70: 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 tfile, -cipher,
9c80: 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 2d -ciphersuites, -
9c90: 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 command, -dhpara
9ca0: 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 ms, -key, -keyfi
9cb0: 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 le, -model, -pas
9cc0: 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e sword, -post_han
9cd0: 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 74 dshake, -request
9ce0: 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 63 , -require, -sec
9cf0: 75 72 69 74 79 6c 65 76 65 6c 2c 20 2d 73 65 72 uritylevel, -ser
9d00: 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 ver, -servername
9d10: 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d , -session_id, -
9d20: 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c ssl2, -ssl3, -tl
9d30: 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c s1, -tls1.1, -tl
9d40: 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f s1.2, -tls1.3, o
9d50: 72 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 r -validatecomma
9d60: 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 nd");...return T
9d70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
9d80: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 29 if (request)
9d90: 09 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f ..verify |= SSL_
9da0: 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e VERIFY_CLIENT_ON
9db0: 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f CE | SSL_VERIFY_
9dc0: 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 PEER;. if (re
9dd0: 71 75 65 73 74 20 26 26 20 72 65 71 75 69 72 65 quest && require
9de0: 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f ).verify |= SSL_
9df0: 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e VERIFY_FAIL_IF_N
9e00: 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 O_PEER_CERT;.
9e10: 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 if (request &&
9e20: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 post_handshake).
9e30: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 verify |= SSL_VE
9e40: 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 RIFY_POST_HANDSH
9e50: 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72 AKE;. if (ver
9e60: 69 66 79 20 3d 3d 20 30 29 09 09 76 65 72 69 66 ify == 0)..verif
9e70: 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e y = SSL_VERIFY_N
9e80: 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 ONE;.. proto
9e90: 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 |= (ssl2 ? TLS_P
9ea0: 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a ROTO_SSL2 : 0);.
9eb0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 proto |= (ss
9ec0: 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 l3 ? TLS_PROTO_S
9ed0: 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 SL3 : 0);. pr
9ee0: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 oto |= (tls1 ? T
9ef0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 LS_PROTO_TLS1 :
9f00: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
9f10: 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 (tls1_1 ? TLS_P
9f20: 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 ROTO_TLS1_1 : 0)
9f30: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
9f40: 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f tls1_2 ? TLS_PRO
9f50: 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a TO_TLS1_2 : 0);.
9f60: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
9f70: 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f s1_3 ? TLS_PROTO
9f80: 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 _TLS1_3 : 0);..
9f90: 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e /* reset to N
9fa0: 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 ULL if blank str
9fb0: 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a ing provided */.
9fc0: 20 20 20 20 69 66 20 28 63 65 72 74 20 26 26 20 if (cert &&
9fd0: 21 2a 63 65 72 74 29 09 09 20 20 20 20 20 20 20 !*cert)..
9fe0: 20 63 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 cert. =
9ff0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 NULL;. if (ke
a000: 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 y && !*key)..
a010: 20 20 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 key.
a020: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
a030: 28 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 (certfile && !*c
a040: 65 72 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 ertfile)
a050: 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c certfile.= NULL
a060: 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c ;. if (keyfil
a070: 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 e && !*keyfile).
a080: 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 .keyfile.
a090: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
a0a0: 28 63 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 (ciphers && !*ci
a0b0: 70 68 65 72 73 29 09 20 20 20 20 20 20 20 20 63 phers). c
a0c0: 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d iphers. =
a0d0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
a0e0: 69 70 68 65 72 73 75 69 74 65 73 20 26 26 20 21 iphersuites && !
a0f0: 2a 63 69 70 68 65 72 73 75 69 74 65 73 29 20 63 *ciphersuites) c
a100: 69 70 68 65 72 73 75 69 74 65 73 20 20 20 20 3d iphersuites =
a110: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 NULL;. if (C
a120: 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c Afile && !*CAfil
a130: 65 29 09 20 20 20 20 20 20 20 20 43 41 66 69 6c e). CAfil
a140: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
a150: 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69 72 20 ;. if (CAdir
a160: 26 26 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 && !*CAdir).
a170: 20 20 20 20 43 41 64 69 72 09 20 20 20 20 20 20 CAdir.
a180: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
a190: 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a (DHparams && !*
a1a0: 44 48 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 DHparams).
a1b0: 20 20 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 DHparams
a1c0: 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f = NULL;.. /
a1d0: 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 * new SSL state
a1e0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 */. statePtr.
a1f0: 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 .= (State *) cka
a200: 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 lloc((unsigned)
a210: 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a sizeof(State));.
a220: 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 memset(state
a230: 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 Ptr, 0, sizeof(S
a240: 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 tate));.. sta
a250: 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 tePtr->flags.= f
a260: 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 lags;. stateP
a270: 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 tr->interp.= int
a280: 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 erp;. statePt
a290: 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 r->vflags.= veri
a2a0: 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 fy;. statePtr
a2b0: 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 ->err.= "";..
a2c0: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 /* allocate scr
a2d0: 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 ipt */. if (s
a2e0: 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 cript) {..(void)
a2f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
a300: 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c omObj(script, &l
a310: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b en);..if (len) {
a320: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
a330: 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 callback = scrip
a340: 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 t;.. Tcl_Incr
a350: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
a360: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d r->callback);..}
a370: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 . }.. /* a
a380: 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 llocate password
a390: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 */. if (pass
a3a0: 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 word) {..(void)
a3b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
a3c0: 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 mObj(password, &
a3d0: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 len);..if (len)
a3e0: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d {.. statePtr-
a3f0: 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 >password = pass
a400: 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 word;.. Tcl_I
a410: 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ncrRefCount(stat
a420: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b ePtr->password);
a430: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
a440: 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 * allocate valid
a450: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 ate command */.
a460: 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 if (vcmd) {..
a470: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 (void) Tcl_GetSt
a480: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 ringFromObj(vcmd
a490: 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 , &len);..if (le
a4a0: 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 n) {.. stateP
a4b0: 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b tr->vcmd = vcmd;
a4c0: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
a4d0: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
a4e0: 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d >vcmd);..}. }
a4f0: 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 .. if (model
a500: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 != NULL) {..int
a510: 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 mode;../* Get th
a520: 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 e "model" contex
a530: 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c t */..chan = Tcl
a540: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
a550: 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 rp, model, &mode
a560: 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 );..if (chan ==
a570: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
a580: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 LL) {.. Tls_F
a590: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
a5a0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
a5b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
a5c0: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 }.../*.. * Make
a5d0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
a5e0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
a5f0: 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 hannel.. */..cha
a600: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
a610: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 annel(chan);..if
a620: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
a630: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
a640: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
a650: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
a660: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
a670: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
a680: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
a690: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 lName(chan),..."
a6a0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
a6b0: 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 annel", NULL);..
a6c0: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
a6d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
a6e0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 S", "IMPORT", "C
a6f0: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
a700: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
a710: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
a720: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
a730: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
a740: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
a750: 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a .ctx = ((State *
a760: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 )Tcl_GetChannelI
a770: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e nstanceData(chan
a780: 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 ))->ctx;. } e
a790: 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 lse {..if ((ctx
a7a0: 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 = CTX_Init(state
a7b0: 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f Ptr, server, pro
a7c0: 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 to, keyfile, cer
a7d0: 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 tfile, key, cert
a7e0: 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 , key_len,..
a7f0: 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c cert_len, CAdir,
a800: 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 CAfile, ciphers
a810: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 , ciphersuites,
a820: 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 level, DHparams)
a830: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 ) == NULL) {..
a840: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
a850: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
a860: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
a870: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a RROR;..}. }..
a880: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 statePtr->ct
a890: 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a x = ctx;.. /*
a8a0: 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 . * We need
a8b0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 to make sure tha
a8c0: 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f t the channel wo
a8d0: 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 rks in binary (f
a8e0: 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e or the. * en
a8f0: 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 cryption not to
a900: 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a get goofed up)..
a910: 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 * We only w
a920: 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 ant to adjust th
a930: 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 e buffering in p
a940: 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 re-v2 channels,
a950: 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 where. * eac
a960: 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 h channel in the
a970: 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 stack maintaine
a980: 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 d its own buffer
a990: 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 s.. */. T
a9a0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
a9b0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
a9c0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 slation);. Tc
a9d0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
a9e0: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
a9f0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ing);. Tcl_DS
aa00: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
aa10: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
aa20: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
aa30: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
aa40: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 elEncoding);.
aa50: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
aa60: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
aa70: 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 an, "-eofchar",
aa80: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
aa90: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 Char);. Tcl_G
aaa0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
aab0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
aac0: 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 encoding", &uppe
aad0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
aae0: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
aaf0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
ab00: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e rp, chan, "-tran
ab10: 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 slation", &upper
ab20: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
ab30: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 on);. Tcl_Get
ab40: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
ab50: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c terp, chan, "-bl
ab60: 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 ocking", &upperC
ab70: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b hannelBlocking);
ab80: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
ab90: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
aba0: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c , chan, "-transl
abb0: 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 ation", "binary"
abc0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
abd0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
abe0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 rp, chan, "-bloc
abf0: 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a king", "true");.
ac00: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e dprintf("Con
ac10: 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e suming Tcl chann
ac20: 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 el %s", Tcl_GetC
ac30: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
ac40: 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d );. statePtr-
ac50: 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 >self = Tcl_Stac
ac60: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c kChannel(interp,
ac70: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
ac80: 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 (), (ClientData)
ac90: 20 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f statePtr, (TCL_
aca0: 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 READABLE | TCL_W
acb0: 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b RITABLE), chan);
acc0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 . dprintf("Cr
acd0: 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 eated channel na
ace0: 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 med %s", Tcl_Get
acf0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
ad00: 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 ePtr->self));.
ad10: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
ad20: 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 self == (Tcl_Cha
ad30: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f nnel) NULL) {../
ad40: 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 *.. * No use of
ad50: 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 Tcl_EventuallyFr
ad60: 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f ee because no po
ad70: 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 ssible Tcl_Prese
ad80: 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 rve... */..Tls_F
ad90: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
ada0: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 tePtr);..return
adb0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
adc0: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 .. Tcl_SetCha
add0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
ade0: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
adf0: 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e f, "-translation
ae00: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 ", Tcl_DStringVa
ae10: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 lue(&upperChanne
ae20: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a lTranslation));.
ae30: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
ae40: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
ae50: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
ae60: 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 "-encoding", Tc
ae70: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
ae80: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
ae90: 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f ding));. Tcl_
aea0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
aeb0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
aec0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 r->self, "-eofch
aed0: 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 ar", Tcl_DString
aee0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
aef0: 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 nelEOFChar));.
af00: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
af10: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 Option(interp, s
af20: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 tatePtr->self, "
af30: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f -blocking", Tcl_
af40: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
af50: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 perChannelBlocki
af60: 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ng));.. /*.
af70: 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c * SSL Initial
af80: 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a ization. */.
af90: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 statePtr->ss
afa0: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 l = SSL_new(stat
afb0: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 ePtr->ctx);.
afc0: 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 if (!statePtr->s
afd0: 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 sl) {../* SSL li
afe0: 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 brary error */..
aff0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
b000: 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e (interp, "couldn
b010: 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 't construct ssl
b020: 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41 session: ", REA
b030: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
b040: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
b050: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
b060: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
b070: 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 ORT", "INIT", "F
b080: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
b090: 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 NULL);..Tls_Fre
b0a0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
b0b0: 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 Ptr);..return TC
b0c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
b0d0: 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 /* Set host
b0e0: 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 server name */.
b0f0: 20 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d if (servernam
b100: 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68 e) {../* Sets th
b110: 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e e server name in
b120: 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 69 dication (SNI) i
b130: 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 n ClientHello ex
b140: 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 tension */../* P
b150: 65 72 20 52 46 43 20 36 30 36 36 2c 20 68 6f 73 er RFC 6066, hos
b160: 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43 49 49 tname is a ASCII
b170: 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2e encoded string.
b180: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 */..if (!SSL_se
b190: 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 t_tlsext_host_na
b1a0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c me(statePtr->ssl
b1b0: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 , servername) &&
b1c0: 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 require) {..
b1d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
b1e0: 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 t(interp, "setti
b1f0: 6e 67 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 ng TLS host name
b200: 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 extension faile
b210: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
b220: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
b230: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
b240: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
b250: 22 2c 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 ", "SNI", "FAILE
b260: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
b270: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
b280: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
b290: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
b2a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
b2b0: 0a 09 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 73 ../* Configure s
b2c0: 65 72 76 65 72 20 68 6f 73 74 20 6e 61 6d 65 20 erver host name
b2d0: 63 68 65 63 6b 73 20 69 6e 20 74 68 65 20 53 53 checks in the SS
b2e0: 4c 20 63 6c 69 65 6e 74 2e 20 53 65 74 20 44 4e L client. Set DN
b2f0: 53 20 68 6f 73 74 6e 61 6d 65 20 74 6f 0a 09 20 S hostname to..
b300: 20 20 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 name for peer
b310: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 65 63 certificate chec
b320: 6b 73 2e 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 ks. SSL_set1_hos
b330: 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e t has limitation
b340: 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f s. */..if (!SSL_
b350: 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 add1_host(stateP
b360: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e tr->ssl, servern
b370: 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c ame)) {.. Tcl
b380: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
b390: 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 44 terp, "setting D
b3a0: 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66 61 69 NS host name fai
b3b0: 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e led", (char *) N
b3c0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
b3d0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
b3e0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
b3f0: 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c RT", "HOSTNAME",
b400: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
b410: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
b420: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
b430: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
b440: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
b450: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
b460: 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73 /* Resume sess
b470: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 ion id */. if
b480: 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 (session_id &&
b490: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 strlen(session_i
b4a0: 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 d) <= SSL_MAX_SI
b4b0: 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a D_CTX_LENGTH) {.
b4c0: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 ./* SSL_set_sess
b4d0: 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 ion() */..if (!S
b4e0: 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f SL_SESSION_set1_
b4f0: 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 id_context(SSL_g
b500: 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65 et_session(state
b510: 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69 Ptr->ssl), sessi
b520: 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 on_id, (unsigned
b530: 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 int) strlen(ses
b540: 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 sion_id))) {..
b550: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
b560: 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 lt(interp, "Resu
b570: 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 22 2c me session id ",
b580: 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 22 20 66 session_id, " f
b590: 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 ailed", (char *)
b5a0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c NULL);.. Tcl
b5b0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
b5c0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
b5d0: 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 PORT", "SESSION"
b5e0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
b5f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 r *) NULL);.
b600: 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 65 65 Tls_Free
b610: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
b620: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 tr);.
b630: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
b640: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 R;..}. }..
b650: 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a if (alpn) {../*
b660: 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 6c Convert a TCL l
b670: 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f ist into a proto
b680: 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 col-list in wire
b690: 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 -format */..unsi
b6a0: 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f gned char *proto
b6b0: 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 s, *p;..unsigned
b6c0: 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 int protos_len
b6d0: 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 6e = 0;..int i, len
b6e0: 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20 , cnt;..Tcl_Obj
b6f0: 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 **list;...if (Tc
b700: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d l_ListObjGetElem
b710: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 ents(interp, alp
b720: 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 n, &cnt, &list)
b730: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
b740: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
b750: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
b760: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
b770: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 RROR;..}.../* De
b780: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f termine the memo
b790: 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 ry required for
b7a0: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 the protocol-lis
b7b0: 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 t */..for (i = 0
b7c0: 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 ; i < cnt; i++)
b7d0: 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74 {.. Tcl_GetSt
b7e0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 ringFromObj(list
b7f0: 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 [i], &len);..
b800: 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 if (len > 255)
b810: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {...Tcl_AppendRe
b820: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c sult(interp, "AL
b830: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 PN protocol name
b840: 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 too long", (cha
b850: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 r *) NULL);...Tc
b860: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
b870: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
b880: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 MPORT", "ALPN",
b890: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
b8a0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f *) NULL);...Tls_
b8b0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
b8c0: 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 atePtr);...retur
b8d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
b8e0: 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f }.. protos_
b8f0: 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e 3b 0a len += 1 + len;.
b900: 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 .}.../* Build th
b910: 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f e complete proto
b920: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f col-list */..pro
b930: 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 tos = ckalloc(pr
b940: 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 otos_len);../* p
b950: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f rotocol-lists co
b960: 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c nsist of 8-bit l
b970: 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20 ength-prefixed,
b980: 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a byte strings */.
b990: 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 70 20 3d .for (i = 0, p =
b9a0: 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63 6e 74 protos; i < cnt
b9b0: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 ; i++) {.. ch
b9c0: 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 ar *str = Tcl_Ge
b9d0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c tStringFromObj(l
b9e0: 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 ist[i], &len);..
b9f0: 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e 3b 0a *p++ = len;.
ba00: 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 . memcpy(p, s
ba10: 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 tr, len);.. p
ba20: 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a += len;..}.../*
ba30: 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 SSL_set_alpn_pr
ba40: 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 otos makes a cop
ba50: 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f y of the protoco
ba60: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f l-list */../* No
ba70: 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f te: This functio
ba80: 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 65 20 ns reverses the
ba90: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e return value con
baa0: 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 vention */..if (
bab0: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f SSL_set_alpn_pro
bac0: 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 tos(statePtr->ss
bad0: 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f l, protos, proto
bae0: 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 s_len)) {.. T
baf0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
bb00: 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65 64 20 interp, "failed
bb10: 74 6f 20 73 65 74 20 41 4c 50 4e 20 70 72 6f 74 to set ALPN prot
bb20: 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20 2a 29 ocols", (char *)
bb30: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c NULL);.. Tcl
bb40: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
bb50: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
bb60: 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 PORT", "ALPN", "
bb70: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
bb80: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c ) NULL);.. Tl
bb90: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
bba0: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
bbb0: 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a ckfree(protos);.
bbc0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
bbd0: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 ERROR;..}.../* S
bbe0: 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c tore protocols l
bbf0: 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 ist */..statePtr
bc00: 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f ->protos = proto
bc10: 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 s;..statePtr->pr
bc20: 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f otos_len = proto
bc30: 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 s_len;. } els
bc40: 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 e {..statePtr->p
bc50: 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 rotos = NULL;..s
bc60: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f tatePtr->protos_
bc70: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a len = 0;. }..
bc80: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 /*. * SS
bc90: 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 L Callbacks.
bca0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f */. SSL_set_
bcb0: 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 app_data(statePt
bcc0: 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 r->ssl, (void *)
bcd0: 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f statePtr);./* po
bce0: 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a int back to us *
bcf0: 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 /. SSL_set_ve
bd00: 72 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 rify(statePtr->s
bd10: 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 sl, verify, Veri
bd20: 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 fyCallback);.
bd30: 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 SSL_set_info_ca
bd40: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d llback(statePtr-
bd50: 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 >ssl, InfoCallba
bd60: 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c ck);.. /* Cal
bd70: 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 lback for observ
bd80: 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 ing protocol mes
bd90: 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 sages */.#ifndef
bda0: 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f OPENSSL_NO_SSL_
bdb0: 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 TRACE. /* voi
bdc0: 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 d SSL_CTX_set_ms
bdd0: 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 g_callback_arg(s
bde0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 tatePtr->ctx, (v
bdf0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
be00: 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 . void SSL_CT
be10: 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 X_set_msg_callba
be20: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ck(statePtr->ctx
be30: 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 , MessageCallbac
be40: 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 k); */. SSL_s
be50: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f et_msg_callback_
be60: 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 arg(statePtr->ss
be70: 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 l, (void *)state
be80: 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 Ptr);. SSL_se
be90: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 t_msg_callback(s
bea0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 tatePtr->ssl, Me
beb0: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a ssageCallback);.
bec0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 #endif.. /* C
bed0: 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 reate Tcl_Channe
bee0: 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f l BIO Handler */
bef0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 . statePtr->p
bf00: 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 _bio.= BIO_new_t
bf10: 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f cl(statePtr, BIO
bf20: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 _NOCLOSE);. s
bf30: 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 tatePtr->bio.= B
bf40: 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c IO_new(BIO_f_ssl
bf50: 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 ());.. if (se
bf60: 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 rver) {../* Serv
bf70: 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a er callbacks */.
bf80: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 .SSL_CTX_set_tls
bf90: 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 ext_servername_a
bfa0: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 rg(statePtr->ctx
bfb0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
bfc0: 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 tr);..SSL_CTX_se
bfd0: 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e t_tlsext_servern
bfe0: 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 ame_callback(sta
bff0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 tePtr->ctx, SNIC
c000: 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 allback);..SSL_C
c010: 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 TX_set_client_he
c020: 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d llo_cb(statePtr-
c030: 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 >ctx, HelloCallb
c040: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
c050: 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 tePtr);..if (sta
c060: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d tePtr->protos !=
c070: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 NULL) {.. SS
c080: 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 L_CTX_set_alpn_s
c090: 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 elect_cb(statePt
c0a0: 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c r->ctx, ALPNCall
c0b0: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 back, (void *)st
c0c0: 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 atePtr);.#ifdef
c0d0: 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 USE_NPN.. if
c0e0: 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 (tls1_2 == 0 &&
c0f0: 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 tls1_3 == 0) {..
c100: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 .SSL_CTX_set_nex
c110: 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 t_protos_adverti
c120: 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d sed_cb(statePtr-
c130: 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 >ctx, NPNCallbac
c140: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
c150: 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e Ptr);.. }.#en
c160: 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 dif..}.../* Enab
c170: 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e le server to sen
c180: 64 20 63 65 72 74 20 72 65 71 75 65 73 74 20 61 d cert request a
c190: 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 fter handshake (
c1a0: 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f TLS 1.3 only) */
c1b0: 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 ../* A write ope
c1c0: 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 ration must take
c1d0: 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 place for the C
c1e0: 65 72 74 69 66 69 63 61 74 65 20 52 65 71 75 65 ertificate Reque
c1f0: 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e st to be.. sen
c200: 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c t to the client,
c210: 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e this can be don
c220: 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 e with SSL_do_ha
c230: 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 ndshake(). */..i
c240: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f f (request && po
c250: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a st_handshake) {.
c260: 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66 79 5f . SSL_verify_
c270: 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 client_post_hand
c280: 73 68 61 6b 65 28 73 74 61 74 65 50 74 72 2d 3e shake(statePtr->
c290: 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 ssl);..}.../* Se
c2a0: 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f t server mode */
c2b0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
c2c0: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 s |= TLS_TCL_SER
c2d0: 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 VER;..SSL_set_ac
c2e0: 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 cept_state(state
c2f0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
c300: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 else {../* Clie
c310: 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a nt callbacks */.
c320: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 #ifdef USE_NPN..
c330: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 if (statePtr->pr
c340: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 otos != NULL &&
c350: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 tls1_2 == 0 && t
c360: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 ls1_3 == 0) {..
c370: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e SSL_CTX_set_n
c380: 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 ext_proto_select
c390: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
c3a0: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c x, ALPNCallback,
c3b0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
c3c0: 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 r);..}.#endif...
c3d0: 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69 /* Session cachi
c3e0: 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 ng */..SSL_CTX_s
c3f0: 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 et_session_cache
c400: 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e _mode(statePtr->
c410: 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 ctx, SSL_SESS_CA
c420: 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c CHE_CLIENT | SSL
c430: 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 _SESS_CACHE_NO_I
c440: 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a NTERNAL_STORE);.
c450: 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 .SSL_CTX_sess_se
c460: 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 t_new_cb(statePt
c470: 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 r->ctx, SessionC
c480: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 allback);.../* E
c490: 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 nable post hands
c4a0: 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74 hake Authenticat
c4b0: 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 ion extension. T
c4c0: 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 LS 1.3 only, not
c4d0: 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 http/2. */..if
c4e0: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 (request && post
c4f0: 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 _handshake) {..
c500: 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f SSL_set_post_
c510: 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73 handshake_auth(s
c520: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 tatePtr->ssl, 1)
c530: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c ;..}.../* Set cl
c540: 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 ient mode */..SS
c550: 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 L_set_connect_st
c560: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ate(statePtr->ss
c570: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 l);. }. SS
c580: 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 L_set_bio(stateP
c590: 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 tr->ssl, statePt
c5a0: 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 r->p_bio, stateP
c5b0: 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 tr->p_bio);.
c5c0: 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 BIO_set_ssl(stat
c5d0: 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 ePtr->bio, state
c5e0: 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f Ptr->ssl, BIO_NO
c5f0: 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a CLOSE);.. /*.
c600: 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 * End of SS
c610: 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 L Init. */.
c620: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
c630: 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 rning %s", Tcl_G
c640: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
c650: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a atePtr->self));.
c660: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
c670: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 t(interp, (char
c680: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *) Tcl_GetChanne
c690: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
c6a0: 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 self), TCL_VOLAT
c6b0: 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 ILE);.. retur
c6c0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e n TCL_OK;..clien
c6d0: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
c6e0: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ta;.}.../*. *---
c6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c730: 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f . *. * UnimportO
c740: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 bjCmd --. *. *.T
c750: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
c760: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f invoked to remo
c770: 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 ve the topmost c
c780: 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 hannel filter..
c790: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
c7a0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
c7b0: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
c7c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d de effects:. *.M
c7d0: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 ay modify the be
c7e0: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 havior of an IO
c7f0: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d channel.. *. *--
c800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c840: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
c850: 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 .UnimportObjCmd(
c860: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
c870: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
c880: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
c890: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
c8a0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
c8b0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
c8c0: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e an;../* The chan
c8d0: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
c8e0: 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 e on. */.. dp
c8f0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
c900: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
c910: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
c920: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
c930: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
c940: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 el");..return TC
c950: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
c960: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
c970: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
c980: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 , Tcl_GetString(
c990: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b objv[1]), NULL);
c9a0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
c9b0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
c9c0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
c9d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
c9e0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
c9f0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
ca00: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
ca10: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
ca20: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
ca30: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 nel(chan);..
ca40: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
ca50: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
ca60: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
ca70: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
ca80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
ca90: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
caa0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
cab0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
cac0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
cad0: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 nel", NULL);..
cae0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
caf0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
cb00: 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 , "UNIMPORT", "C
cb10: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
cb20: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
cb30: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
cb40: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
cb50: 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 if (Tcl_Unstac
cb60: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c kChannel(interp,
cb70: 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 chan) == TCL_ER
cb80: 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ROR) {..return T
cb90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
cba0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
cbb0: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 OK;..clientData
cbc0: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a = clientData;.}.
cbd0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
cbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
cc20: 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e CTX_Init -- con
cc30: 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 struct a SSL_CTX
cc40: 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 instance. *. *
cc50: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 Results:. *.A va
cc60: 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 lid SSL_CTX inst
cc70: 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a ance or NULL.. *
cc80: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
cc90: 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 :. *.constructs
cca0: 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 SSL context (CTX
ccb0: 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ). *. *---------
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ccf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
cd00: 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a tatic SSL_CTX *.
cd10: 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a CTX_Init(State *
cd20: 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 statePtr, int is
cd30: 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 Server, int prot
cd40: 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 o, char *keyfile
cd50: 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 , char *certfile
cd60: 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ,. unsigned c
cd70: 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e har *key, unsign
cd80: 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69 ed char *cert, i
cd90: 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 nt key_len, int
cda0: 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a cert_len, char *
cdb0: 43 41 64 69 72 2c 0a 20 20 20 20 63 68 61 72 20 CAdir,. char
cdc0: 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 *CAfile, char *c
cdd0: 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 iphers, char *ci
cde0: 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 phersuites, int
cdf0: 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 level, char *DHp
ce00: 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c arams) {. Tcl
ce10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 _Interp *interp
ce20: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
ce30: 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 rp;. SSL_CTX
ce40: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *ctx = NULL;.
ce50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b Tcl_DString ds;
ce60: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
ce70: 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 ds1;. int of
ce80: 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c f = 0;. int l
ce90: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b oad_private_key;
cea0: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d . const SSL_M
ceb0: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a ETHOD *method;..
cec0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
ced0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
cee0: 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 !proto) {..Tcl_A
cef0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
cf00: 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 rp, "no valid pr
cf10: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 otocol selected"
cf20: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
cf30: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
cf40: 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 /* create SSL
cf50: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f context */.#if O
cf60: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
cf70: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 UMBER >= 0x10100
cf80: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 000L || defined(
cf90: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 NO_SSL2) || defi
cfa0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
cfb0: 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 SL2). if (ENA
cfc0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
cfd0: 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 PROTO_SSL2)) {..
cfe0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
cff0: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 (interp, "SSL2 p
d000: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
d010: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
d020: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
d030: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
d040: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c fined(NO_SSL3) |
d050: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
d060: 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 L_NO_SSL3). i
d070: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
d080: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 , TLS_PROTO_SSL3
d090: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
d0a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d0b0: 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f SSL3 protocol no
d0c0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
d0d0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
d0e0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
d0f0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
d100: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
d110: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
d120: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
d130: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
d140: 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f O_TLS1)) {..Tcl_
d150: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d160: 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 erp, "TLS 1.0 pr
d170: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d180: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 rted", NULL);..r
d190: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
d1a0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 }.#endif.#if def
d1b0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
d1c0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
d1d0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 SL_NO_TLS1_1).
d1e0: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
d1f0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
d200: 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 LS1_1)) {..Tcl_A
d210: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
d220: 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f rp, "TLS 1.1 pro
d230: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
d240: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ted", NULL);..re
d250: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
d260: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
d270: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c ned(NO_TLS1_2) |
d280: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
d290: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 L_NO_TLS1_2).
d2a0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
d2b0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
d2c0: 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 S1_2)) {..Tcl_Ap
d2d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
d2e0: 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 p, "TLS 1.2 prot
d2f0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
d300: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
d310: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
d320: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
d330: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
d340: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
d350: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
d360: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
d370: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
d380: 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 1_3)) {..Tcl_App
d390: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
d3a0: 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f , "TLS 1.3 proto
d3b0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
d3c0: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 d", NULL);..retu
d3d0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
d3e0: 65 6e 64 69 66 0a 0a 20 20 20 20 73 77 69 74 63 endif.. switc
d3f0: 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 h (proto) {.#if
d400: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
d410: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
d420: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 000L && !defined
d430: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 (NO_SSL2) && !de
d440: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d450: 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 _SSL2). case
d460: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a TLS_PROTO_SSL2:.
d470: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
d480: 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 er ? SSLv2_serve
d490: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c r_method() : SSL
d4a0: 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 v2_client_method
d4b0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
d4c0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
d4d0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
d4e0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d4f0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
d500: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
d510: 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 3_METHOD). ca
d520: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c se TLS_PROTO_SSL
d530: 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 3:..method = isS
d540: 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 erver ? SSLv3_se
d550: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 rver_method() :
d560: 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 SSLv3_client_met
d570: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 hod();..break;.#
d580: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
d590: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 ed(NO_TLS1) && !
d5a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d5b0: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 NO_TLS1) && !def
d5c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d5d0: 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 TLS1_METHOD).
d5e0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
d5f0: 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 TLS1:..method =
d600: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 isServer ? TLSv1
d610: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
d620: 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f : TLSv1_client_
d630: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
d640: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
d650: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
d660: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d670: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 NSSL_NO_TLS1_1)
d680: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
d690: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 SSL_NO_TLS1_1_ME
d6a0: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 THOD). case T
d6b0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a LS_PROTO_TLS1_1:
d6c0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
d6d0: 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 ver ? TLSv1_1_se
d6e0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 rver_method() :
d6f0: 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d TLSv1_1_client_m
d700: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
d710: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
d720: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
d730: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
d740: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 SSL_NO_TLS1_2) &
d750: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d760: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 SL_NO_TLS1_2_MET
d770: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
d780: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a S_PROTO_TLS1_2:.
d790: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
d7a0: 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 er ? TLSv1_2_ser
d7b0: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 ver_method() : T
d7c0: 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 LSv1_2_client_me
d7d0: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
d7e0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
d7f0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
d800: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d810: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
d820: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
d830: 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 _TLS1_3:../* Use
d840: 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74 the generic met
d850: 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 hod and constrai
d860: 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 63 nt range after c
d870: 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 65 ontext is create
d880: 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 d */..method = i
d890: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 sServer ? TLS_se
d8a0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 rver_method() :
d8b0: 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f TLS_client_metho
d8c0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
d8d0: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a dif. default:
d8e0: 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 ../* Negotiate h
d8f0: 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 ighest available
d900: 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e SSL/TLS version
d910: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 */..method = is
d920: 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 Server ? TLS_ser
d930: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 ver_method() : T
d940: 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 LS_client_method
d950: 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f ();.#if OPENSSL_
d960: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
d970: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 0x10100000L &&
d980: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 !defined(NO_SSL2
d990: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d9a0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 ENSSL_NO_SSL2)..
d9b0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
d9c0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
d9d0: 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 _SSL2) ? 0 : S
d9e0: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b SL_OP_NO_SSLv2);
d9f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
da00: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 ined(NO_SSL3) &&
da10: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
da20: 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 L_NO_SSL3)..off
da30: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
da40: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c o, TLS_PROTO_SSL
da50: 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 3) ? 0 : SSL_O
da60: 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e P_NO_SSLv3);.#en
da70: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
da80: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 (NO_TLS1) && !de
da90: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
daa0: 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 _TLS1)..off |= (
dab0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
dac0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 LS_PROTO_TLS1)
dad0: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
dae0: 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a _TLSv1);.#endif.
daf0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
db00: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
db10: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
db20: 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 LS1_1)..off |= (
db30: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
db40: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 LS_PROTO_TLS1_1)
db50: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
db60: 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 _TLSv1_1);.#endi
db70: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
db80: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
db90: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
dba0: 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d _TLS1_2)..off |=
dbb0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
dbc0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
dbd0: 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 2) ? 0 : SSL_OP_
dbe0: 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e NO_TLSv1_2);.#en
dbf0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
dc00: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 (NO_TLS1_3) && !
dc10: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
dc20: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 NO_TLS1_3)..off
dc30: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
dc40: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
dc50: 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 1_3) ? 0 : SSL_O
dc60: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 P_NO_TLSv1_3);.#
dc70: 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 endif..break;.
dc80: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
dc90: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
dca0: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e ctx = SSL_CTX_n
dcb0: 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 ew(method);.
dcc0: 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 if (!ctx) {..ret
dcd0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d urn(NULL);. }
dce0: 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 .. if (getenv
dcf0: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 (SSLKEYLOGFILE))
dd00: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
dd10: 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 keylog_callback(
dd20: 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 ctx, KeyLogCallb
dd30: 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 ack);. }..#if
dd40: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
dd50: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
dd60: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
dd70: 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 _3). if (prot
dd80: 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 o == TLS_PROTO_T
dd90: 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 LS1_3) {..SSL_CT
dda0: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f X_set_min_proto_
ddb0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 version(ctx, TLS
ddc0: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 1_3_VERSION);..S
ddd0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
dde0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
ddf0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
de00: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a );. }.#endif.
de10: 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 . /* Force ci
de20: 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f pher selection o
de30: 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a rder by server *
de40: 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72 /. if (!isSer
de50: 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f ver) {..SSL_CTX_
de60: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c set_options(ctx,
de70: 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 SSL_OP_CIPHER_S
de80: 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 ERVER_PREFERENCE
de90: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53 53 );. }.. SS
dea0: 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 L_CTX_set_app_da
deb0: 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 ta(ctx, (void*)i
dec0: 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d nterp);./* remem
ded0: 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 ber the interpre
dee0: 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 ter */. SSL_C
def0: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 TX_set_options(c
df00: 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b tx, SSL_OP_ALL);
df10: 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 ./* all SSL bug
df20: 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 workarounds */.
df30: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f SSL_CTX_set_o
df40: 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 ptions(ctx, off)
df50: 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 ;../* disable pr
df60: 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 otocol versions
df70: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 */.#if OPENSSL_V
df80: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
df90: 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20 0x10101000L.
dfa0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 SSL_CTX_set_mode
dfb0: 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 (ctx, SSL_MODE_A
dfc0: 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 UTO_RETRY);./* h
dfd0: 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 andle new handsh
dfe0: 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 akes in backgrou
dff0: 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66 61 75 6c nd. On by defaul
e000: 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 t in OpenSSL 1.1
e010: 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 .1. */.#endif.
e020: 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 SSL_CTX_sess_s
e030: 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 et_cache_size(ct
e040: 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a x, 128);.. /*
e050: 20 53 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 Set user define
e060: 64 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 d ciphers, ciphe
e070: 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 r suites, and se
e080: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a curity level */.
e090: 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 if ((ciphers
e0a0: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 != NULL) && !SS
e0b0: 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 L_CTX_set_cipher
e0c0: 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 _list(ctx, ciphe
e0d0: 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 rs)) {..Tcl_Appe
e0e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
e0f0: 20 22 53 65 74 20 63 69 70 68 65 72 73 20 66 61 "Set ciphers fa
e100: 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 iled: No valid c
e110: 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a iphers", (char *
e120: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
e130: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
e140: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
e150: 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 . if ((cipher
e160: 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 suites != NULL)
e170: 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f && !SSL_CTX_set_
e180: 63 69 70 68 65 72 73 75 69 74 65 73 28 63 74 78 ciphersuites(ctx
e190: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29 29 , ciphersuites))
e1a0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
e1b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 sult(interp, "Se
e1c0: 74 20 63 69 70 68 65 72 20 73 75 69 74 65 73 20 t cipher suites
e1d0: 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 failed: No valid
e1e0: 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 ciphers", (char
e1f0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f *) NULL);..SSL_
e200: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
e210: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
e220: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 }.. /* Set s
e230: 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f ecurity level */
e240: 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e . if (level >
e250: 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 -1 && level < 6
e260: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f ) {../* SSL_set_
e270: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a security_level *
e280: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 /..SSL_CTX_set_s
e290: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 ecurity_level(ct
e2a0: 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d x, level);. }
e2b0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d .. /* set som
e2c0: 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 e callbacks */.
e2d0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 SSL_CTX_set_d
e2e0: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 efault_passwd_cb
e2f0: 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 (ctx, PasswordCa
e300: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c llback);. SSL
e310: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 _CTX_set_default
e320: 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 _passwd_cb_userd
e330: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a ata(ctx, (void *
e340: 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 )statePtr);..
e350: 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 /* read a Diffi
e360: 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 e-Hellman parame
e370: 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 ters file, or us
e380: 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f e the built-in o
e390: 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 ne */.#ifdef OPE
e3a0: 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 NSSL_NO_DH. i
e3b0: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e f (DHparams != N
e3c0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
e3d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
e3e0: 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 "DH parameter s
e3f0: 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c upport not avail
e400: 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 able", (char *)
e410: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f NULL);..SSL_CTX_
e420: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 free(ctx);..retu
e430: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
e440: 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 else. {..DH*
e450: 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d dh;..if (DHparam
e460: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 s != NULL) {..
e470: 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 BIO *bio;..
e480: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
e490: 28 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 (&ds);.. bio
e4a0: 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 = BIO_new_file(F
e4b0: 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 2N(DHparams, &ds
e4c0: 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 ), "r");.. if
e4d0: 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f (!bio) {...Tcl_
e4e0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
e4f0: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 ;...Tcl_AppendRe
e500: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f sult(interp, "Co
e510: 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 uld not find DH
e520: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 parameters file"
e530: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
e540: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
e550: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
e560: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 NULL;.. }...
e570: 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 dh = PEM_read
e580: 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 _bio_DHparams(bi
e590: 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e o, NULL, NULL, N
e5a0: 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 ULL);.. BIO_f
e5b0: 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 ree(bio);.. T
e5c0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
e5d0: 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 ds);.. if (!d
e5e0: 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e h) {...Tcl_Appen
e5f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
e600: 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 "Could not read
e610: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 DH parameters fr
e620: 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 om file", (char
e630: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f *) NULL);...SSL_
e640: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
e650: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 .return NULL;..
e660: 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 }..} else {..
e670: 20 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50 dh = get_dhP
e680: 61 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c arams();..}..SSL
e690: 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 _CTX_set_tmp_dh(
e6a0: 63 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 ctx, dh);..DH_fr
e6b0: 65 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 ee(dh);. }.#e
e6c0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 ndif.. /* set
e6d0: 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65 our certificate
e6e0: 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 */. load_pri
e6f0: 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 vate_key = 0;.
e700: 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 if (certfile !
e710: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f = NULL) {..load_
e720: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b private_key = 1;
e730: 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e ...Tcl_DStringIn
e740: 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 it(&ds);...if (S
e750: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 SL_CTX_use_certi
e760: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c ficate_file(ctx,
e770: 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 F2N(certfile, &
e780: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ds), SSL_FILETYP
e790: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 E_PEM) <= 0) {..
e7a0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
e7b0: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 ree(&ds);.. T
e7c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e7d0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
e7e0: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 to set certifica
e7f0: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 te file ", certf
e800: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 ile, ": ",....
e810: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 REASON(), (ch
e820: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
e830: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
e840: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
e850: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 NULL;..}. }
e860: 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d else if (cert !=
e870: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 NULL) {..load_p
e880: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a rivate_key = 1;.
e890: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 .if (SSL_CTX_use
e8a0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e _certificate_ASN
e8b0: 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 1(ctx, cert_len,
e8c0: 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 cert) <= 0) {..
e8d0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
e8e0: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 ree(&ds);.. T
e8f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e900: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
e910: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 to set certifica
e920: 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 te: ",.... R
e930: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
e940: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 ) NULL);.. SS
e950: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
e960: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
e970: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 L;..}. } else
e980: 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 {..certfile = (
e990: 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 char*)X509_get_d
e9a0: 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 efault_cert_file
e9b0: 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 ();...if (SSL_CT
e9c0: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 X_use_certificat
e9d0: 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 e_file(ctx, cert
e9e0: 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 file, SSL_FILETY
e9f0: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a PE_PEM) <= 0) {.
ea00: 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 #if 0.. Tcl_D
ea10: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
ea20: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
ea30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
ea40: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 unable to use de
ea50: 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 fault certificat
ea60: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 e file ", certfi
ea70: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 le, ": ",....
ea80: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 REASON(), (cha
ea90: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
eaa0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
eab0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
eac0: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a NULL;.#endif..}.
ead0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 }.. /* se
eae0: 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 t our private ke
eaf0: 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 y */. if (loa
eb00: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b d_private_key) {
eb10: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d ..if (keyfile ==
eb20: 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 NULL && key ==
eb30: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 NULL) {.. key
eb40: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b file = certfile;
eb50: 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c ..}...if (keyfil
eb60: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 e != NULL) {..
eb70: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 /* get the pri
eb80: 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 vate key associa
eb90: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 ted with this ce
eba0: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 rtificate */..
ebb0: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d if (keyfile ==
ebc0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 NULL) {...keyfi
ebd0: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 le = certfile;..
ebe0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 }... if (
ebf0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 SSL_CTX_use_Priv
ec00: 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c ateKey_file(ctx,
ec10: 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 F2N(keyfile, &d
ec20: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 s), SSL_FILETYPE
ec30: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 _PEM) <= 0) {...
ec40: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
ec50: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 &ds);.../* flush
ec60: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 the passphrase
ec70: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c which might be l
ec80: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c eft in the resul
ec90: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 t */...Tcl_SetRe
eca0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c sult(interp, NUL
ecb0: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a L, TCL_STATIC);.
ecc0: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
ecd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 lt(interp, "unab
ece0: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 le to set public
ecf0: 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 key file ", key
ed00: 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 file, " ",....
ed10: 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c REASON(),
ed20: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
ed30: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
ed40: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e ctx);...return N
ed50: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 ULL;.. }..
ed60: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
ed70: 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 (&ds);...} else
ed80: 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 if (key != NULL)
ed90: 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f {.. if (SSL_
eda0: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b CTX_use_PrivateK
edb0: 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 ey_ASN1(EVP_PKEY
edc0: 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b _RSA, ctx, key,k
edd0: 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a ey_len) <= 0) {.
ede0: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
edf0: 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 e(&ds);.../* flu
ee00: 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 sh the passphras
ee10: 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 e which might be
ee20: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 left in the res
ee30: 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 ult */...Tcl_Set
ee40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e Result(interp, N
ee50: 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 ULL, TCL_STATIC)
ee60: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 ;...Tcl_AppendRe
ee70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e sult(interp, "un
ee80: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c able to set publ
ee90: 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f ic key: ", REASO
eea0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
eeb0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
eec0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
eed0: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a rn NULL;.. }.
eee0: 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e .}../* Now we kn
eef0: 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e ow that a key an
ef00: 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e d cert have been
ef10: 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a set against.. *
ef20: 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 the SSL context
ef30: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 */..if (!SSL_CT
ef40: 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f X_check_private_
ef50: 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 key(ctx)) {..
ef60: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
ef70: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 t(interp, "priva
ef80: 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 te key does not
ef90: 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 match the certif
efa0: 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 icate public key
efb0: 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 ",.... (char
efc0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
efd0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
efe0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
eff0: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ULL;..}. }..
f000: 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69 /* Set verifi
f010: 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 cation CAs */.
f020: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
f030: 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f t(&ds);. Tcl_
f040: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 DStringInit(&ds1
f050: 29 3b 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f );. if (!SSL_
f060: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f CTX_load_verify_
f070: 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 locations(ctx, F
f080: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 2N(CAfile, &ds),
f090: 20 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 F2N(CAdir, &ds1
f0a0: 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f )) ||..!SSL_CTX_
f0b0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 set_default_veri
f0c0: 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b fy_paths(ctx)) {
f0d0: 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 .#if 0..Tcl_DStr
f0e0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 ingFree(&ds);..T
f0f0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
f100: 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 ds1);../* Don't
f110: 63 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 currently care i
f120: 66 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a f this fails */.
f130: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
f140: 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 t(interp, "SSL d
f150: 65 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 efault verify pa
f160: 74 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 ths: ", REASON()
f170: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
f180: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
f190: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ctx);..return NU
f1a0: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d LL;.#endif. }
f1b0: 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f .. /* https:/
f1c0: 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 /sourceforge.net
f1d0: 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 /p/tls/bugs/57/
f1e0: 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f */. /* XXX:TO
f1f0: 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 DO: Let the user
f200: 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 supply values h
f210: 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 ere instead of s
f220: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 omething that ex
f230: 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 ists on the file
f240: 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 system */. if
f250: 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c (CAfile != NULL
f260: 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 ) {..STACK_OF(X5
f270: 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 09_NAME) *certNa
f280: 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 mes = SSL_load_c
f290: 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 lient_CA_file(F2
f2a0: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b N(CAfile, &ds));
f2b0: 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 ..if (certNames
f2c0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
f2d0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 SSL_CTX_set_clie
f2e0: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 nt_CA_list(ctx,
f2f0: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 certNames);..}.
f300: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
f310: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
f320: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
f330: 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 ree(&ds1);. r
f340: 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f eturn ctx;.}.../
f350: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
f360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f390: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 -------. *. * St
f3a0: 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 atusObjCmd -- re
f3b0: 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 turn certificate
f3c0: 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 for connected p
f3d0: 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c eer.. *. * Resul
f3e0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
f3f0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
f400: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
f410: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
f420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f460: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
f470: 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 nt.StatusObjCmd(
f480: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
f490: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
f4a0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
f4b0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
f4c0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
f4d0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
f4e0: 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 r;. X509 *pee
f4f0: 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a r;. Tcl_Obj *
f500: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f objPtr;. Tcl_
f510: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 Channel chan;.
f520: 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e char *channelN
f530: 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 ame, *ciphers;.
f540: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 int mode;.
f550: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
f560: 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 char *proto;.
f570: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 unsigned int le
f580: 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 3b 0a n;. int nid;.
f590: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
f5a0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 77 69 lled");.. swi
f5b0: 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 tch (objc) {..ca
f5c0: 73 65 20 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e se 2:.. chann
f5d0: 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 elName = Tcl_Get
f5e0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 StringFromObj(ob
f5f0: 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 jv[1], NULL);..
f600: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 break;...case
f610: 20 33 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 3:.. if (!st
f620: 72 63 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 rcmp (Tcl_GetStr
f630: 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 ing (objv[1]), "
f640: 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 -local")) {...ch
f650: 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f annelName = Tcl_
f660: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
f670: 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b (objv[2], NULL);
f680: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d ...break;.. }
f690: 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 .. /* else fa
f6a0: 6c 6c 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20 2a ll-through ... *
f6b0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f /.#if defined(__
f6c0: 47 4e 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 GNUC__).. __a
f6d0: 74 74 72 69 62 75 74 65 5f 5f 28 28 66 61 6c 6c ttribute__((fall
f6e0: 74 68 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64 69 through));.#endi
f6f0: 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 f..default:..
f700: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 Tcl_WrongNumArg
f710: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
f720: 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 v, "?-local? cha
f730: 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74 nnel");.. ret
f740: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
f750: 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d }.. chan =
f760: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
f770: 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e interp, channelN
f780: 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 ame, &mode);.
f790: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
f7a0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
f7b0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
f7c0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
f7d0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
f7e0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
f7f0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
f800: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
f810: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
f820: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 han);. if (Tc
f830: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
f840: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
f850: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
f860: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
f870: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
f880: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
f890: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
f8a0: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 an),..."\": not
f8b0: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 a TLS channel",
f8c0: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 NULL);..Tcl_SetE
f8d0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
f8e0: 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 "TLS", "STATUS"
f8f0: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e , "CHANNEL", "IN
f900: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 VALID", (char *)
f910: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
f920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
f930: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 . statePtr =
f940: 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 (State *) Tcl_Ge
f950: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 tChannelInstance
f960: 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 Data(chan);..
f970: 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 /* Get certific
f980: 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 ate for peer or
f990: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 self */. if (
f9a0: 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 objc == 2) {..pe
f9b0: 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 er = SSL_get_pee
f9c0: 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 r_certificate(st
f9d0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
f9e0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 } else {..peer
f9f0: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 = SSL_get_certi
fa00: 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d ficate(statePtr-
fa10: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 >ssl);. }.
fa20: 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 /* Get X509 cer
fa30: 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f tificate info */
fa40: 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b . if (peer) {
fa50: 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e ..objPtr = Tls_N
fa60: 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 ewX509Obj(interp
fa70: 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 , peer);..if (ob
fa80: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 jc == 2) {..
fa90: 58 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b X509_free(peer);
faa0: 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c .. peer = NUL
fab0: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 L;..}. } else
fac0: 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c {..objPtr = Tcl
fad0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
fae0: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ULL);. }..
faf0: 20 2f 2a 20 50 65 65 72 20 63 65 72 74 20 63 68 /* Peer cert ch
fb00: 61 69 6e 20 28 63 6c 69 65 6e 74 20 6f 6e 6c 79 ain (client only
fb10: 29 20 2a 2f 0a 20 20 20 20 53 54 41 43 4b 5f 4f ) */. STACK_O
fb20: 46 28 58 35 30 39 29 2a 20 73 73 6c 5f 63 65 72 F(X509)* ssl_cer
fb30: 74 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 ts = SSL_get_pee
fb40: 72 5f 63 65 72 74 5f 63 68 61 69 6e 28 73 74 61 r_cert_chain(sta
fb50: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
fb60: 20 69 66 20 28 73 73 6c 5f 63 65 72 74 73 20 3d if (ssl_certs =
fb70: 3d 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35 30 = NULL || sk_X50
fb80: 39 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 74 73 29 9_num(ssl_certs)
fb90: 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 5f 53 65 == 0) {..Tcl_Se
fba0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
fbb0: 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 p, "TLS", "STATU
fbc0: 53 22 2c 20 22 43 45 52 54 49 46 49 43 41 54 45 S", "CERTIFICATE
fbd0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
fbe0: 29 3b 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 );..Tcl_IncrRefC
fbf0: 6f 75 6e 74 28 6f 62 6a 50 74 72 29 3b 0a 09 54 ount(objPtr);..T
fc00: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
fc10: 6f 62 6a 50 74 72 29 3b 0a 09 72 65 74 75 72 6e objPtr);..return
fc20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
fc30: 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e }.. /* Peer n
fc40: 61 6d 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c ame */. Tcl_L
fc50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
fc60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
fc70: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
fc80: 67 4f 62 6a 28 22 70 65 65 72 6e 61 6d 65 22 2c gObj("peername",
fc90: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
fca0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
fcb0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
fcc0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
fcd0: 67 4f 62 6a 28 53 53 4c 5f 67 65 74 30 5f 70 65 gObj(SSL_get0_pe
fce0: 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d ername(statePtr-
fcf0: 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 >ssl), -1));..
fd00: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
fd10: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
fd20: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
fd30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 62 69 ewStringObj("sbi
fd40: 74 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 ts", -1));. T
fd50: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
fd60: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
fd70: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 objPtr, Tcl_NewI
fd80: 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69 ntObj(SSL_get_ci
fd90: 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 pher_bits(stateP
fda0: 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 tr->ssl, NULL)))
fdb0: 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d ;.. ciphers =
fdc0: 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f (char*)SSL_get_
fdd0: 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d cipher(statePtr-
fde0: 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 28 >ssl);. if ((
fdf0: 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 ciphers != NULL)
fe00: 20 26 26 20 28 73 74 72 63 6d 70 28 63 69 70 68 && (strcmp(ciph
fe10: 65 72 73 2c 20 22 28 4e 4f 4e 45 29 22 29 20 21 ers, "(NONE)") !
fe20: 3d 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 = 0)) {..Tcl_Lis
fe30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
fe40: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
fe50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
fe60: 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29 bj("cipher", -1)
fe70: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
fe80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
fe90: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
fea0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 69 _NewStringObj(ci
feb0: 70 68 65 72 73 2c 20 2d 31 29 29 3b 0a 20 20 20 phers, -1));.
fec0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 }.. /* Verif
fed0: 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 y the X509 certi
fee0: 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 ficate presented
fef0: 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a by the peer */.
ff00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
ff10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
ff20: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
ff30: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 _NewStringObj("v
ff40: 65 72 69 66 79 52 65 73 75 6c 74 22 2c 20 2d 31 erifyResult", -1
ff50: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
ff60: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
ff70: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
ff80: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f ..Tcl_NewStringO
ff90: 62 6a 28 58 35 30 39 5f 76 65 72 69 66 79 5f 63 bj(X509_verify_c
ffa0: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 ert_error_string
ffb0: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f (SSL_get_verify_
ffc0: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d result(statePtr-
ffd0: 3e 73 73 6c 29 29 2c 20 2d 31 29 29 3b 0a 0a 20 >ssl)), -1));..
ffe0: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 /* Verify mod
fff0: 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 e */. Tcl_Lis
10000 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10010 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10020 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10030 62 6a 28 22 76 65 72 69 66 79 4d 6f 64 65 22 2c bj("verifyMode",
10040 20 2d 31 29 29 3b 0a 20 20 20 20 2f 2a 20 53 53 -1));. /* SS
10050 4c 5f 43 54 58 5f 67 65 74 5f 76 65 72 69 66 79 L_CTX_get_verify
10060 5f 6d 6f 64 65 28 63 74 78 29 20 2a 2f 0a 20 20 _mode(ctx) */.
10070 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 mode = SSL_get
10080 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 _verify_mode(sta
10090 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
100a0 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c if (mode && SSL
100b0 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a _VERIFY_NONE) {.
100c0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
100d0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
100e0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
100f0 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 6f 6e 65 wStringObj("none
10100 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 ", -1));. } e
10110 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a lse {..Tcl_Obj *
10120 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c listObjPtr = Tcl
10130 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
10140 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 ULL);..if (mode
10150 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 && SSL_VERIFY_PE
10160 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c ER) {.. Tcl_L
10170 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10180 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
10190 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ObjPtr, Tcl_NewS
101a0 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c tringObj("peer",
101b0 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d -1));..}..if (m
101c0 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
101d0 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 Y_FAIL_IF_NO_PEE
101e0 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 54 R_CERT) {.. T
101f0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10200 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10210 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f listObjPtr, Tcl_
10220 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 NewStringObj("fa
10230 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 65 il if no peer ce
10240 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 rt", -1));..}..i
10250 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 f (mode && SSL_V
10260 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 ERIFY_CLIENT_ONC
10270 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 E) {.. Tcl_Li
10280 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
10290 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f nt(interp, listO
102a0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
102b0 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 ringObj("client
102c0 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a once", -1));..}.
102d0 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c .if (mode && SSL
102e0 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e _VERIFY_POST_HAN
102f0 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 DSHAKE) {.. T
10300 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10310 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10320 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f listObjPtr, Tcl_
10330 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f NewStringObj("po
10340 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d st handshake", -
10350 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 1));..}..Tcl_Lis
10360 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10370 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10380 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 3b 0a 20 , listObjPtr);.
10390 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 }.. /* Ver
103a0 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 2a ify mode depth *
103b0 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 /. Tcl_ListOb
103c0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
103d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
103e0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
103f0 22 76 65 72 69 66 79 44 65 70 74 68 22 2c 20 2d "verifyDepth", -
10400 31 29 29 3b 0a 20 20 20 20 2f 2a 20 53 53 4c 5f 1));. /* SSL_
10410 43 54 58 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 CTX_get_verify_d
10420 65 70 74 68 28 63 74 78 29 20 2a 2f 0a 20 20 20 epth(ctx) */.
10430 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
10440 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10450 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
10460 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f wIntObj(SSL_get_
10470 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 74 61 verify_depth(sta
10480 74 65 50 74 72 2d 3e 73 73 6c 29 29 29 3b 0a 0a tePtr->ssl)));..
10490 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 /* Report th
104a0 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
104b0 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
104c0 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 of the negotiati
104d0 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 on */. SSL_ge
104e0 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 t0_alpn_selected
104f0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
10500 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 &proto, &len);.
10510 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
10520 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10530 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
10540 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c NewStringObj("al
10550 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 pn", -1));. T
10560 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10570 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10580 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
10590 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a tringObj((char *
105a0 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 )proto, (int) le
105b0 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 n));. Tcl_Lis
105c0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
105d0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
105e0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
105f0 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d bj("protocol", -
10600 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
10610 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10620 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10630 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10640 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 bj(SSL_get_versi
10650 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c on(statePtr->ssl
10660 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a ), -1));.. /*
10670 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 Valid for non-R
10680 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 SA signature and
10690 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 TLS 1.3 */.
106a0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
106b0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
106c0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
106d0 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 67 6e 61 StringObj("signa
106e0 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 tureHashAlgorith
106f0 6d 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 m", -1));. if
10700 20 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 53 53 (objc == 2 ? SS
10710 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 L_get_peer_signa
10720 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 ture_nid(statePt
10730 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20 r->ssl, &nid) :
10740 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 SSL_get_signatur
10750 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
10760 73 73 6c 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54 ssl, &nid)) {..T
10770 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10780 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10790 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
107a0 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 tringObj(OBJ_nid
107b0 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 2ln(nid), -1));.
107c0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
107d0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
107e0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
107f0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
10800 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 ringObj("", -1))
10810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
10820 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10830 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
10840 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10850 6e 67 4f 62 6a 28 22 73 69 67 6e 61 74 75 72 65 ngObj("signature
10860 54 79 70 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 Type", -1));.
10870 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 20 3f if (objc == 2 ?
10880 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 SSL_get_peer_si
10890 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 gnature_type_nid
108a0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
108b0 26 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65 74 5f &nid) : SSL_get_
108c0 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e signature_type_n
108d0 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c id(statePtr->ssl
108e0 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54 63 6c 5f , &nid)) {..Tcl_
108f0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10900 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
10910 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10920 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e ngObj(OBJ_nid2ln
10930 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 20 20 20 (nid), -1));.
10940 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c } else {..Tcl_L
10950 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10960 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
10970 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
10980 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 20 gObj("", -1));.
10990 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 }.. Tcl_Se
109a0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
109b0 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
109c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
109d0 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
109e0 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
109f0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
10a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a30 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e -----. *. * Conn
10a40 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 ectionInfoObjCmd
10a50 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 -- return conne
10a60 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 ction info from
10a70 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 OpenSSL.. *. * R
10a80 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 esults:. *.A lis
10a90 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 t of connection
10aa0 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d info. *. *-----
10ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
10af0 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 */..static int C
10b00 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a onnectionInfoObj
10b10 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
10b20 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
10b30 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
10b40 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
10b50 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
10b60 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
10b70 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
10b80 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
10b90 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 mode on. */.
10ba0 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
10bb0 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 ;../* client sta
10bc0 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 te for ssl socke
10bd0 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a t */. Tcl_Obj
10be0 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 63 6f *objPtr;. co
10bf0 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 nst SSL *ssl;.
10c00 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 const SSL_CIPH
10c10 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 ER *cipher;.
10c20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f const SSL_SESSIO
10c30 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 N *session;.
10c40 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
10c50 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 har *proto;.
10c60 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 long mode;..
10c70 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b if (objc != 2) {
10c80 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
10c90 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
10ca0 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a jv, "channel");.
10cb0 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
10cc0 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 R);. }.. c
10cd0 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
10ce0 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
10cf0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
10d00 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 j(objv[1], NULL)
10d10 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 , NULL);. if
10d20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
10d30 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
10d40 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
10d50 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
10d60 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
10d70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
10d80 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a most channel */.
10d90 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
10da0 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
10db0 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f n);. if (Tcl_
10dc0 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
10dd0 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
10de0 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 nelType()) {..Tc
10df0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
10e00 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
10e10 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
10e20 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
10e30 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 ),.. "\": not
10e40 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
10e50 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 NULL);..Tcl_Set
10e60 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
10e70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 , "TLS", "CONNEC
10e80 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 TION", "CHANNEL"
10e90 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
10ea0 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
10eb0 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
10ec0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 . }.. objP
10ed0 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
10ee0 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 Obj(0, NULL);..
10ef0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e /* Connection
10f00 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 info */. sta
10f10 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
10f20 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 )Tcl_GetChannelI
10f30 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e nstanceData(chan
10f40 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 );. ssl = sta
10f50 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 tePtr->ssl;.
10f60 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 if (ssl != NULL)
10f70 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f {../* connectio
10f80 6e 20 73 74 61 74 65 20 2a 2f 0a 09 54 63 6c 5f n state */..Tcl_
10f90 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10fa0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
10fb0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10fc0 6e 67 4f 62 6a 28 22 73 74 61 74 65 22 2c 20 2d ngObj("state", -
10fd0 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
10fe0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10ff0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
11000 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
11010 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 SSL_state_string
11020 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 _long(ssl), -1))
11030 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 ;.../* Get SNI r
11040 65 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20 equested server
11050 6e 61 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 name */..Tcl_Lis
11060 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
11070 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
11080 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
11090 62 6a 28 22 73 65 72 76 65 72 6e 61 6d 65 22 2c bj("servername",
110a0 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
110b0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
110c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
110d0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
110e0 6a 28 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 j(SSL_get_server
110f0 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 name(ssl, TLSEXT
11100 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e _NAMETYPE_host_n
11110 61 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a ame), -1));.../*
11120 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f Get protocol */
11130 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
11140 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
11150 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
11160 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f ewStringObj("pro
11170 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 tocol", -1));..T
11180 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
11190 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
111a0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
111b0 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 tringObj(SSL_get
111c0 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d _version(ssl), -
111d0 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 1));.../* Renego
111e0 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 tiation allowed
111f0 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
11200 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
11210 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
11220 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 _NewStringObj("r
11230 65 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20 2d enegotiation", -
11240 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
11250 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
11260 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
11270 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
11280 0a 09 20 20 20 20 53 53 4c 5f 67 65 74 5f 73 65 .. SSL_get_se
11290 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 cure_renegotiati
112a0 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 20 on_support(ssl)
112b0 3f 20 22 73 75 70 70 6f 72 74 65 64 22 20 3a 20 ? "supported" :
112c0 22 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c "not supported",
112d0 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 -1));.../* Get
112e0 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a security level *
112f0 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
11300 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
11310 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
11320 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 NewStringObj("se
11330 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 2d 31 curitylevel", -1
11340 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
11350 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
11360 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
11370 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f l_NewIntObj(SSL_
11380 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 get_security_lev
11390 65 6c 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 el(ssl)));.../*
113a0 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a Session info */.
113b0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
113c0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
113d0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
113e0 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 wStringObj("sess
113f0 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d 31 29 ion_reused", -1)
11400 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
11410 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
11420 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
11430 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 _NewBooleanObj(S
11440 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 SL_session_reuse
11450 64 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 49 d(ssl)));.../* I
11460 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f s server info */
11470 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
11480 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
11490 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
114a0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 73 5f ewStringObj("is_
114b0 73 65 72 76 65 72 22 2c 20 2d 31 29 29 3b 0a 09 server", -1));..
114c0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
114d0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
114e0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
114f0 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f 69 BooleanObj(SSL_i
11500 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 29 3b s_server(ssl)));
11510 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
11520 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 ipher info */.
11530 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 cipher = SSL_g
11540 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 et_current_ciphe
11550 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 r(ssl);. if (
11560 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 cipher != NULL)
11570 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 {..char buf[BUFS
11580 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 IZ] = {0};..int
11590 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a bits, alg_bits;.
115a0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
115b0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
115c0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
115d0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 ewStringObj("cip
115e0 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c her", -1));..Tcl
115f0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
11600 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
11610 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
11620 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 ingObj(SSL_CIPHE
11630 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 R_get_name(ciphe
11640 72 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c r), -1));..Tcl_L
11650 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
11660 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
11670 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
11680 67 4f 62 6a 28 22 73 74 61 6e 64 61 72 64 5f 6e gObj("standard_n
11690 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ame", -1));..Tcl
116a0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
116b0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
116c0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
116d0 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 ingObj(SSL_CIPHE
116e0 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 R_standard_name(
116f0 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a cipher), -1));..
11700 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 .bits = SSL_CIPH
11710 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 ER_get_bits(ciph
11720 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a er, &alg_bits);.
11730 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11740 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11750 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
11760 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 72 wStringObj("secr
11770 65 74 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a et_bits", -1));.
11780 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11790 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
117a0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
117b0 77 49 6e 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a wIntObj(bits));.
117c0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
117d0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
117e0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
117f0 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 67 6f wStringObj("algo
11800 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 2d 31 29 rithm_bits", -1)
11810 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
11820 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
11830 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
11840 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6c 67 5f 62 _NewIntObj(alg_b
11850 69 74 73 29 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 its));../* alg_b
11860 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65 its is actual ke
11870 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49 y secret bits. I
11880 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73 f use bits and s
11890 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d ecret (algorithm
118a0 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09 ) bits differ,..
118b0 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 the rest of t
118c0 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65 he bits are fixe
118d0 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 d, i.e. for limi
118e0 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65 ted export ciphe
118f0 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a rs (bits < 56) *
11900 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
11910 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
11920 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
11930 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69 NewStringObj("mi
11940 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 29 n_version", -1))
11950 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
11960 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
11970 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
11980 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c NewStringObj(SSL
11990 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 _CIPHER_get_vers
119a0 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 ion(cipher), -1)
119b0 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e );.../* Get Open
119c0 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c SSL-specific ID,
119d0 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a not IANA ID */.
119e0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
119f0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11a00 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
11a10 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 64 22 2c wStringObj("id",
11a20 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
11a30 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
11a40 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11a50 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 Tcl_NewIntObj((
11a60 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f int) SSL_CIPHER_
11a70 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 29 get_id(cipher)))
11a80 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 ;...if (SSL_CIPH
11a90 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 ER_description(c
11aa0 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 ipher, buf, size
11ab0 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c of(buf)) != NULL
11ac0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
11ad0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
11ae0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
11af0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
11b00 62 6a 28 22 64 65 73 63 72 69 70 74 69 6f 6e 22 bj("description"
11b10 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54 63 6c , -1));.. Tcl
11b20 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
11b30 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
11b40 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
11b50 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29 ingObj(buf, -1))
11b60 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
11b70 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 /* Session info
11b80 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d */. session =
11b90 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e SSL_get_session
11ba0 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 (ssl);. if (s
11bb0 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 ession != NULL)
11bc0 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 {..const unsigne
11bd0 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a d char *ticket;.
11be0 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 .size_t len2;..u
11bf0 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e nsigned int ulen
11c00 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 ;..const unsigne
11c10 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f d char *session_
11c20 69 64 3b 0a 09 63 68 61 72 20 62 75 66 66 65 72 id;..char buffer
11c30 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f [SSL_MAX_MASTER_
11c40 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f KEY_LENGTH];.../
11c50 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c * Report the sel
11c60 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
11c70 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 s a result of th
11c80 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 e ALPN negotiati
11c90 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 on */..SSL_SESSI
11ca0 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c ON_get0_alpn_sel
11cb0 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 ected(session, &
11cc0 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 proto, &len2);..
11cd0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
11ce0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
11cf0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
11d00 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 StringObj("alpn"
11d10 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
11d20 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
11d30 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
11d40 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
11d50 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f bj((char *)proto
11d60 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a , (int) len2));.
11d70 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 ../* Report the
11d80 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f selected protoco
11d90 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 l as a result of
11da0 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 the NPN negotia
11db0 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 tion */.#ifdef U
11dc0 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 SE_NPN..SSL_get0
11dd0 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f _next_proto_nego
11de0 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f tiated(ssl, &pro
11df0 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 54 63 6c to, &ulen);..Tcl
11e00 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
11e10 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
11e20 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
11e30 69 6e 67 4f 62 6a 28 22 6e 70 6e 22 2c 20 2d 31 ingObj("npn", -1
11e40 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
11e50 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
11e60 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
11e70 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 l_NewStringObj((
11e80 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 char *)proto, (i
11e90 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 23 65 6e 64 nt) ulen));.#end
11ea0 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c if.../* Resumabl
11eb0 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 54 63 e session */..Tc
11ec0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
11ed0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
11ee0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
11ef0 72 69 6e 67 4f 62 6a 28 22 72 65 73 75 6d 61 62 ringObj("resumab
11f00 6c 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f le", -1));..Tcl_
11f10 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
11f20 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
11f30 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
11f40 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 bj(SSL_SESSION_i
11f50 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73 s_resumable(sess
11f60 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 ion)));.../* Ses
11f70 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20 sion start time
11f80 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 (seconds since e
11f90 70 6f 63 68 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 poch) */..Tcl_Li
11fa0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
11fb0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
11fc0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
11fd0 4f 62 6a 28 22 73 74 61 72 74 5f 74 69 6d 65 22 Obj("start_time"
11fe0 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
11ff0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
12000 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
12010 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a , Tcl_NewLongObj
12020 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 (SSL_SESSION_get
12030 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 29 _time(session)))
12040 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 ;.../* Timeout v
12050 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 alue - SSL_CTX_g
12060 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 et_timeout (in s
12070 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f econds) */..Tcl_
12080 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
12090 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
120a0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
120b0 6e 67 4f 62 6a 28 22 74 69 6d 65 6f 75 74 22 2c ngObj("timeout",
120c0 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
120d0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
120e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
120f0 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 Tcl_NewLongObj(
12100 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
12110 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 timeout(session)
12120 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e ));.../* Session
12130 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 ticket lifetime
12140 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 hint (in second
12150 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f s) */..Tcl_ListO
12160 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
12170 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12180 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
12190 28 22 6c 69 66 65 74 69 6d 65 22 2c 20 2d 31 29 ("lifetime", -1)
121a0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
121b0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
121c0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
121d0 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f _NewLongObj(SSL_
121e0 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b SESSION_get_tick
121f0 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 et_lifetime_hint
12200 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f (session)));.../
12210 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 * Session id - T
12220 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 LSv1.2 and below
12230 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f only */..sessio
12240 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 n_id = SSL_SESSI
12250 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f ON_get_id(sessio
12260 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 54 63 6c 5f n, &ulen);..Tcl_
12270 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
12280 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
12290 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
122a0 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 69 ngObj("session_i
122b0 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c d", -1));..Tcl_L
122c0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
122d0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
122e0 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 tr, Tcl_NewByteA
122f0 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f rrayObj(session_
12300 69 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 id, (int) ulen))
12310 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 ;.../* Session c
12320 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 ontext */..sessi
12330 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 on_id = SSL_SESS
12340 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 ION_get0_id_cont
12350 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c ext(session, &ul
12360 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 en);..Tcl_ListOb
12370 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
12380 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
12390 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
123a0 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 "session_context
123b0 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
123c0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
123d0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
123e0 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 r, Tcl_NewByteAr
123f0 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 rayObj(session_i
12400 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b d, (int) ulen));
12410 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 .../* Session ti
12420 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e cket - client on
12430 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 ly */..SSL_SESSI
12440 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 ON_get0_ticket(s
12450 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c ession, &ticket,
12460 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 &len2);..Tcl_Li
12470 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
12480 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
12490 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
124a0 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 74 69 63 Obj("session_tic
124b0 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ket", -1));..Tcl
124c0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
124d0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
124e0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 jPtr, Tcl_NewByt
124f0 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 eArrayObj(ticket
12500 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a , (int) len2));.
12510 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 ../* Ticket app
12520 64 61 74 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 data */..SSL_SES
12530 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
12540 5f 61 70 70 64 61 74 61 28 73 65 73 73 69 6f 6e _appdata(session
12550 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 , &ticket, &len2
12560 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
12570 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
12580 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
12590 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 _NewStringObj("t
125a0 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c icket_app_data",
125b0 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
125c0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
125d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
125e0 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 Tcl_NewByteArra
125f0 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e yObj(ticket, (in
12600 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 t) len2));.../*
12610 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a Get master key *
12620 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 /..len2 = SSL_SE
12630 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 SSION_get_master
12640 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 _key(session, bu
12650 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 ffer, SSL_MAX_MA
12660 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 STER_KEY_LENGTH)
12670 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
12680 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
12690 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
126a0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61 NewStringObj("ma
126b0 73 74 65 72 5f 6b 65 79 22 2c 20 2d 31 29 29 3b ster_key", -1));
126c0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
126d0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
126e0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
126f0 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 62 ewByteArrayObj(b
12700 75 66 66 65 72 2c 20 28 69 6e 74 29 20 6c 65 6e uffer, (int) len
12710 32 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2));. }..
12720 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 /* Compression i
12730 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 nfo */. if (s
12740 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 sl != NULL) {.#i
12750 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f fdef HAVE_SSL_CO
12760 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 MPRESSION..const
12770 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f COMP_METHOD *co
12780 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 mp, *expn;..comp
12790 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 = SSL_get_curre
127a0 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 nt_compression(s
127b0 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c sl);..expn = SSL
127c0 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 _get_current_exp
127d0 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 54 ansion(ssl);...T
127e0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
127f0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
12800 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
12810 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 tringObj("compre
12820 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 ssion", -1));..T
12830 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
12840 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
12850 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
12860 74 72 69 6e 67 4f 62 6a 28 63 6f 6d 70 20 3f 20 tringObj(comp ?
12870 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d SSL_COMP_get_nam
12880 65 28 63 6f 6d 70 29 20 3a 20 22 4e 4f 4e 45 22 e(comp) : "NONE"
12890 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
128a0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
128b0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
128c0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
128d0 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 bj("expansion",
128e0 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
128f0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
12900 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12910 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
12920 28 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 (expn ? SSL_COMP
12930 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 _get_name(expn)
12940 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a : "NONE", -1));.
12950 23 65 6c 73 65 0a 09 54 63 6c 5f 4c 69 73 74 4f #else..Tcl_ListO
12960 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
12970 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12980 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
12990 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 ("compression",
129a0 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
129b0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
129c0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
129d0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
129e0 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 ("NONE", -1));..
129f0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
12a00 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
12a10 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
12a20 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e StringObj("expan
12a30 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 sion", -1));..Tc
12a40 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
12a50 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
12a60 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
12a70 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 ringObj("NONE",
12a80 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 -1));.#endif.
12a90 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 }.. /* Serve
12aa0 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 6d 6f r info */. mo
12ab0 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 de = SSL_CTX_get
12ac0 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d _session_cache_m
12ad0 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ode(statePtr->ct
12ae0 78 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 x);. if (mode
12af0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
12b00 45 5f 4f 46 46 29 20 7b 0a 09 70 72 6f 74 6f 20 E_OFF) {..proto
12b10 3d 20 22 6f 66 66 22 3b 0a 20 20 20 20 7d 20 65 = "off";. } e
12b20 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 lse if (mode & S
12b30 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c SL_SESS_CACHE_CL
12b40 49 45 4e 54 29 20 7b 0a 09 70 72 6f 74 6f 20 3d IENT) {..proto =
12b50 20 22 63 6c 69 65 6e 74 22 3b 0a 20 20 20 20 7d "client";. }
12b60 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 else if (mode &
12b70 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
12b80 53 45 52 56 45 52 29 20 7b 0a 09 70 72 6f 74 6f SERVER) {..proto
12b90 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 20 20 20 = "server";.
12ba0 20 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 } else if (mode
12bb0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
12bc0 45 5f 42 4f 54 48 29 20 7b 0a 09 70 72 6f 74 6f E_BOTH) {..proto
12bd0 20 3d 20 22 62 6f 74 68 22 3b 0a 20 20 20 20 7d = "both";. }
12be0 20 65 6c 73 65 20 7b 0a 09 70 72 6f 74 6f 20 3d else {..proto =
12bf0 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 "unknown";.
12c00 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 }. Tcl_ListOb
12c10 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
12c20 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
12c30 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
12c40 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d "session_cache_m
12c50 6f 64 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ode", -1));.
12c60 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
12c70 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
12c80 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
12c90 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 2c StringObj(proto,
12ca0 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f -1));.. Tcl_
12cb0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
12cc0 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
12cd0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
12ce0 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
12cf0 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
12d00 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
12d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d40 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 -------. *. * Ve
12d50 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 rsionObjCmd -- r
12d60 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 eturn version st
12d70 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 ring from OpenSS
12d80 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 L.. *. * Results
12d90 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
12da0 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
12db0 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
12dc0 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
12dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e10 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
12e20 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 .VersionObjCmd(C
12e30 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
12e40 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
12e50 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
12e60 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
12e70 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
12e80 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
12e90 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
12ea0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f Called");.. o
12eb0 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 bjPtr = Tcl_NewS
12ec0 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c tringObj(OPENSSL
12ed0 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d _VERSION_TEXT, -
12ee0 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 1);. Tcl_SetO
12ef0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
12f00 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 objPtr);.. r
12f10 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
12f20 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
12f30 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 ntData;..objc =
12f40 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 objc;..objv = ob
12f50 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d jv;.}.../*. *---
12f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12fa0 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d . *. * MiscObjCm
12fb0 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e d -- misc comman
12fc0 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 ds. *. * Results
12fd0 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
12fe0 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
12ff0 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
13000 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
13010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13050 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
13060 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 .MiscObjCmd(Clie
13070 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
13080 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
13090 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
130a0 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
130b0 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 objv[]) {. st
130c0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
130d0 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b *commands [] = {
130e0 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 "req", "strreq"
130f0 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e , NULL };. en
13100 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 um command { C_R
13110 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f EQ, C_STRREQ, C_
13120 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 DUMMY };. int
13130 20 63 6d 64 2c 20 69 73 53 74 72 3b 0a 20 20 20 cmd, isStr;.
13140 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 char buffer[163
13150 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 84];.. dprint
13160 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
13170 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 if (objc < 2)
13180 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
13190 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
131a0 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 bjv, "subcommand
131b0 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 ?args?");..retu
131c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
131d0 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f }. if (Tcl_
131e0 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 GetIndexFromObj(
131f0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c interp, objv[1],
13200 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d commands, "comm
13210 61 6e 64 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d and", 0,&cmd) !=
13220 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
13230 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
13240 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
13250 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
13260 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d isStr = (cmd ==
13270 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 C_STRREQ);.
13280 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f switch ((enum co
13290 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 mmand) cmd) {..c
132a0 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 ase C_REQ:..case
132b0 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 C_STRREQ: {..
132c0 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 EVP_PKEY *pkey
132d0 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 =NULL;.. X509
132e0 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 *cert=NULL;..
132f0 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d X509_NAME *nam
13300 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c e=NULL;.. Tcl
13310 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 _Obj **listv;..
13320 20 20 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a int listc,i;.
13330 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e .. BIO *out=N
13340 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 ULL;... char
13350 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 *k_C="",*k_ST=""
13360 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 ,*k_L="",*k_O=""
13370 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d ,*k_OU="",*k_CN=
13380 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a "",*k_Email="";.
13390 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 . char *keyou
133a0 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a t,*pemout,*str;.
133b0 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 . int keysize
133c0 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 ,serial=0,days=3
133d0 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 65;..#if OPENSSL
133e0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
133f0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 < 0x30000000L..
13400 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d BIGNUM *bne =
13410 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 NULL;.. RSA
13420 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c *rsa = NULL;.#el
13430 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 se.. EVP_PKEY
13440 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
13450 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 ;.#endif... i
13460 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 f ((objc<5) || (
13470 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c objc>6)) {...Tcl
13480 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
13490 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 terp, 2, objv, "
134a0 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 keysize keyfile
134b0 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 certfile ?info?"
134c0 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
134d0 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 ERROR;.. }...
134e0 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 if (Tcl_GetI
134f0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
13500 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 , objv[2], &keys
13510 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ize) != TCL_OK)
13520 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {...return TCL_E
13530 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 RROR;.. }..
13540 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 keyout=Tcl_Get
13550 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b String(objv[3]);
13560 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c .. pemout=Tcl
13570 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
13580 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 4]);.. if (is
13590 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 Str) {...Tcl_Set
135a0 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
135b0 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 t,"",0);...Tcl_S
135c0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d etVar(interp,pem
135d0 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 out,"",0);..
135e0 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 }... if (objc
135f0 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c >=6) {...if (Tcl
13600 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 _ListObjGetEleme
13610 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 nts(interp, objv
13620 5b 35 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 [5],....&listc,
13630 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f &listv) != TCL_O
13640 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 K) {... retur
13650 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
13660 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 ....if ((listc%2
13670 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 ) != 0) {...
13680 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
13690 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f terp,"Informatio
136a0 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 n list must have
136b0 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 even number of
136c0 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 arguments",NULL)
136d0 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
136e0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 CL_ERROR;...}...
136f0 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 for (i=0; i<list
13700 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 c; i+=2) {...
13710 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 str=Tcl_GetStri
13720 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 ng(listv[i]);...
13730 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 if (strcmp(s
13740 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b tr,"days")==0) {
13750 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
13760 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
13770 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 ,listv[i+1],&day
13780 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 s)!=TCL_OK)....
13790 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
137a0 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 ROR;... } els
137b0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
137c0 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b ,"serial")==0) {
137d0 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
137e0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
137f0 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 ,listv[i+1],&ser
13800 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 ial)!=TCL_OK)...
13810 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
13820 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 ERROR;... } e
13830 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
13840 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 tr,"C")==0) {...
13850 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 .k_C=Tcl_GetStri
13860 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
13870 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
13880 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 (strcmp(str,"ST"
13890 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d )==0) {....k_ST=
138a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
138b0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
138c0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
138d0 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 mp(str,"L")==0)
138e0 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 {....k_L=Tcl_Get
138f0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
13900 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
13910 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
13920 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "O")==0) {....k_
13930 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 O=Tcl_GetString(
13940 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
13950 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
13960 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d rcmp(str,"OU")==
13970 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 0) {....k_OU=Tcl
13980 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
13990 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
139a0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
139b0 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a str,"CN")==0) {.
139c0 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 ...k_CN=Tcl_GetS
139d0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
139e0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
139f0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
13a00 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 Email")==0) {...
13a10 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 .k_Email=Tcl_Get
13a20 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
13a30 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
13a40 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 {....Tcl_SetRes
13a50 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e ult(interp,"Unkn
13a60 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e own parameter",N
13a70 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 ULL);....return
13a80 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
13a90 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 }...}.. }..#
13aa0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
13ab0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
13ac0 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 000000L.. bne
13ad0 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 = BN_new();..
13ae0 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 rsa = RSA_new(
13af0 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 );.. pkey = E
13b00 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 VP_PKEY_new();..
13b10 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e if (bne == N
13b20 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 ULL || rsa == NU
13b30 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 LL || pkey == NU
13b40 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f LL || !BN_set_wo
13b50 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c rd(bne,RSA_F4) |
13b60 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 |...!RSA_generat
13b70 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 e_key_ex(rsa, ke
13b80 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c ysize, bne, NULL
13b90 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 ) || !EVP_PKEY_a
13ba0 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 ssign_RSA(pkey,
13bb0 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b rsa)) {...EVP_PK
13bc0 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 EY_free(pkey);..
13bd0 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 ./* RSA_free(rsa
13be0 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f ); freed by EVP_
13bf0 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 PKEY_free */...B
13c00 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c N_free(bne);.#el
13c10 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 se.. pkey = E
13c20 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 VP_RSA_gen((unsi
13c30 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a gned int) keysiz
13c40 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 e);.. ctx = E
13c50 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 VP_PKEY_CTX_new(
13c60 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 pkey,NULL);..
13c70 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c if (pkey == NUL
13c80 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c L || ctx == NULL
13c90 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 || !EVP_PKEY_ke
13ca0 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c ygen_init(ctx) |
13cb0 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 |...!EVP_PKEY_CT
13cc0 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e X_set_rsa_keygen
13cd0 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 _bits(ctx, keysi
13ce0 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 ze) || !EVP_PKEY
13cf0 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b _keygen(ctx, &pk
13d00 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 ey)) {...EVP_PKE
13d10 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 Y_free(pkey);...
13d20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 EVP_PKEY_CTX_fre
13d30 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 e(ctx);.#endif..
13d40 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
13d50 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e nterp,"Error gen
13d60 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 erating private
13d70 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 key",NULL);...re
13d80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13d90 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
13da0 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
13db0 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
13dc0 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
13dd0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
13de0 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c _PrivateKey(out,
13df0 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 pkey,NULL,NULL,0
13e00 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ,NULL,NULL);...
13e10 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 i=BIO_read(ou
13e20 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 t,buffer,sizeof(
13e30 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 buffer)-1);...
13e40 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 i=(i<0) ? 0 :
13e50 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b i;... buffer[
13e60 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 i]='\0';... T
13e70 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
13e80 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 ,keyout,buffer,0
13e90 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 );... BIO_flu
13ea0 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 sh(out);... B
13eb0 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 IO_free(out);...
13ec0 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f } else {... o
13ed0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
13ee0 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 _file());...
13ef0 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
13f00 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a me(out,keyout);.
13f10 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
13f20 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f bio_PrivateKey(o
13f30 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c ut,pkey,NULL,NUL
13f40 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a L,0,NULL,NULL);.
13f50 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 .. /* PEM_wri
13f60 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 te_bio_RSAPrivat
13f70 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e eKey(out, rsa, N
13f80 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 ULL, NULL, 0, NU
13f90 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 LL, NULL); */...
13fa0 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c BIO_free_all
13fb0 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 (out);.. .}....i
13fc0 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 f ((cert=X509_ne
13fd0 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 w())==NULL) {...
13fe0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
13ff0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
14000 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 generating certi
14010 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c ficate request",
14020 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 NULL);... EVP
14030 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
14040 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
14050 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
14060 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 x30000000L...
14070 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 BN_free(bne);.#
14080 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 endif... retu
14090 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 rn(TCL_ERROR);..
140a0 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 .}....X509_set_v
140b0 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a ersion(cert,2);.
140c0 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 ..ASN1_INTEGER_s
140d0 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 et(X509_get_seri
140e0 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 alNumber(cert),s
140f0 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 erial);...X509_g
14100 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
14110 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 etm_notBefore(ce
14120 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 rt),0);...X509_g
14130 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
14140 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 etm_notAfter(cer
14150 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 t),(long)60*60*2
14160 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 4*days);...X509_
14170 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c set_pubkey(cert,
14180 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 pkey);....name=X
14190 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 509_get_subject_
141a0 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 name(cert);....X
141b0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
141c0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
141d0 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 C", MBSTRING_ASC
141e0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
141f0 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d d char *) k_C, -
14200 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
14210 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
14220 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 _by_txt(name,"ST
14230 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
14240 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
14250 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d char *) k_ST, -
14260 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
14270 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
14280 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 _by_txt(name,"L"
14290 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
142a0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
142b0 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c char *) k_L, -1,
142c0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
142d0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
142e0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 y_txt(name,"O",
142f0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
14300 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
14310 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d ar *) k_O, -1, -
14320 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
14330 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
14340 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d txt(name,"OU", M
14350 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
14360 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
14370 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d r *) k_OU, -1, -
14380 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
14390 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
143a0 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d txt(name,"CN", M
143b0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
143c0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
143d0 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d r *) k_CN, -1, -
143e0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
143f0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
14400 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 txt(name,"Email"
14410 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
14420 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
14430 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c char *) k_Email,
14440 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 -1, -1, 0);....
14450 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 X509_set_subject
14460 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 _name(cert,name)
14470 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 ;....if (!X509_s
14480 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 ign(cert,pkey,EV
14490 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 P_sha256())) {..
144a0 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 . X509_free(c
144b0 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f ert);... EVP_
144c0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
144d0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
144e0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
144f0 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 30000000L...
14500 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
14510 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 ndif... Tcl_S
14520 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
14530 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 "Error signing c
14540 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c ertificate",NULL
14550 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 );... return
14560 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a TCL_ERROR;...}..
14570 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 ..if (isStr) {..
14580 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
14590 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 (BIO_s_mem());..
145a0 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
145b0 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
145c0 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 );... i=BIO_r
145d0 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 ead(out,buffer,s
145e0 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 izeof(buffer)-1)
145f0 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 ;... i=(i<0)
14600 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 ? 0 : i;... b
14610 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 uffer[i]='\0';..
14620 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 . Tcl_SetVar(
14630 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 interp,pemout,bu
14640 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 ffer,0);... B
14650 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 IO_flush(out);..
14660 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 . BIO_free(ou
14670 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 t);...} else {..
14680 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
14690 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a (BIO_s_file());.
146a0 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f .. BIO_write_
146b0 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d filename(out,pem
146c0 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f out);... PEM_
146d0 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f write_bio_X509(o
146e0 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ut,cert);...
146f0 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 BIO_free_all(out
14700 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 );...}....X509_f
14710 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 ree(cert);...EVP
14720 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
14730 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
14740 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
14750 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f x30000000L...BN_
14760 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 free(bne);.#endi
14770 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 f.. }..}..bre
14780 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a ak;. default:
14790 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 ..break;. }.
147a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
147b0 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
147c0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
147d0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
147e0 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 *****/./* Init
147f0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a */./*
14800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14810 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ***/../*. *-----
14820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
14860 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d *. * Tls_Free --
14870 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
14880 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 edure cleans up
14890 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
148a0 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
148b0 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 *.is closed and
148c0 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 its reference c
148d0 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 ount falls below
148e0 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 1. *. * Results
148f0 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.none. *. *
14900 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
14910 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 .Frees all the s
14920 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d tate. *. *------
14930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
14970 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 /.void.Tls_Free(
14980 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 char *blockPtr)
14990 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
149a0 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
149b0 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 )blockPtr;..
149c0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
149d0 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 );.. Tls_Clea
149e0 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 n(statePtr);.
149f0 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 ckfree(blockPtr
14a00 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
14a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
14a50 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 *. * Tls_Clean
14a60 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
14a70 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 ocedure cleans u
14a80 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 p when a SSL soc
14a90 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
14aa0 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 l. *.is closed a
14ab0 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 nd its reference
14ac0 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c count falls bel
14ad0 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 ow 1. This shou
14ae0 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 ld. *.be called
14af0 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 synchronously by
14b00 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 the CloseProc,
14b10 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 not in the. *.Ev
14b20 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c entuallyFree cal
14b30 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
14b40 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ults:. *.none. *
14b50 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
14b60 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 :. *.Frees all t
14b70 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d he state. *. *--
14b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14bc0 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 -. */.void Tls_C
14bd0 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 lean(State *stat
14be0 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 ePtr) {. dpri
14bf0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
14c00 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 /*. * we
14c10 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 're assuming her
14c20 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e e that we're sin
14c30 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 gle-threaded.
14c40 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 */. if (sta
14c50 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 tePtr->timer !=
14c60 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
14c70 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 NULL) {..Tcl_De
14c80 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 leteTimerHandler
14c90 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
14ca0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 );..statePtr->ti
14cb0 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 mer = NULL;.
14cc0 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
14cd0 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 Ptr->protos) {..
14ce0 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d ckfree(statePtr-
14cf0 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 >protos);..state
14d00 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 Ptr->protos = NU
14d10 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
14d20 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 (statePtr->bio)
14d30 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c {../* This will
14d40 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f call SSL_shutdo
14d50 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 wn. Bug 1414045
14d60 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f */..dprintf("BIO
14d70 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 _free_all(%p)",
14d80 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a statePtr->bio);.
14d90 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 .BIO_free_all(st
14da0 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 atePtr->bio);..s
14db0 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e tatePtr->bio = N
14dc0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
14dd0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c f (statePtr->ssl
14de0 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 ) {..dprintf("SS
14df0 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 L_free(%p)", sta
14e00 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 tePtr->ssl);..SS
14e10 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d L_free(statePtr-
14e20 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 >ssl);..statePtr
14e30 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->ssl = NULL;.
14e40 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
14e50 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 ePtr->ctx) {..SS
14e60 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 L_CTX_free(state
14e70 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 Ptr->ctx);..stat
14e80 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c ePtr->ctx = NULL
14e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
14ea0 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
14eb0 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 ck) {..Tcl_DecrR
14ec0 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
14ed0 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 ->callback);..st
14ee0 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
14ef0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
14f00 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
14f10 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 >password) {..Tc
14f20 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
14f30 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
14f40 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 d);..statePtr->p
14f50 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a assword = NULL;.
14f60 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
14f70 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a atePtr->vcmd) {.
14f80 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
14f90 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 t(statePtr->vcmd
14fa0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63 );..statePtr->vc
14fb0 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d md = NULL;. }
14fc0 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
14fd0 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a eturning");.}...
14fe0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
14ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15020 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
15030 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a ls_Init --. *. *
15040 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 .This is a packa
15050 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f ge initializatio
15060 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 n procedure, whi
15070 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 ch is called. *.
15080 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 by Tcl when this
15090 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 package is to b
150a0 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e e added to an in
150b0 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a terpreter.. *. *
150c0 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 Results: Ssl c
150d0 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f onfigured and lo
150e0 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 aded. *. * Side
150f0 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 effects:. *. cre
15100 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d ate the ssl comm
15110 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 and, initialize
15120 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 ssl context. *.
15130 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
15140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15170 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f ----. */.DLLEXPO
15180 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 RT int Tls_Init(
15190 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
151a0 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 rp) {. const
151b0 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 char tlsTclInitS
151c0 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 cript[] = {.#inc
151d0 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 lude "tls.tcl.h"
151e0 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 ..0x00. };..
151f0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
15200 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ed");.. /*.
15210 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 * We only sup
15220 70 6f 72 74 20 54 63 6c 20 38 2e 34 20 6f 72 20 port Tcl 8.4 or
15230 6e 65 77 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20 newer. */.
15240 20 20 69 66 20 28 0a 23 69 66 64 65 66 20 55 53 if (.#ifdef US
15250 45 5f 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c E_TCL_STUBS..Tcl
15260 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 _InitStubs(inter
15270 70 2c 20 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c p, "8.4", 0).#el
15280 73 65 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 se..Tcl_PkgRequi
15290 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 re(interp, "Tcl"
152a0 2c 20 22 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e , "8.4-", 0).#en
152b0 64 69 66 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b dif.. == NULL) {
152c0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
152d0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
152e0 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 f (TlsLibInit(0)
152f0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 != TCL_OK) {..T
15300 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
15310 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e interp, "could n
15320 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 ot initialize SS
15330 4c 20 6c 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c L library", NULL
15340 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
15350 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
15360 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
15370 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
15380 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 ls::ciphers", Ci
15390 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c phersObjCmd, (Cl
153a0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
153b0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
153c0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
153d0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
153e0 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
153f0 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f :connection", Co
15400 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 nnectionInfoObjC
15410 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
15420 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
15430 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
15440 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
15450 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
15460 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b , "tls::handshak
15470 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a e", HandshakeObj
15480 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
15490 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
154a0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
154b0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
154c0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
154d0 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 p, "tls::import"
154e0 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 , ImportObjCmd,
154f0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
15500 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
15510 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
15520 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
15530 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
15540 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 ls::unimport", U
15550 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 nimportObjCmd, (
15560 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
15570 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
15580 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
15590 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
155a0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
155b0 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 s::status", Stat
155c0 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e usObjCmd, (Clien
155d0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
155e0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
155f0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
15600 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
15610 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 interp, "tls::ve
15620 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f rsion", VersionO
15630 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
15640 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
15650 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
15660 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
15670 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
15680 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 erp, "tls::misc"
15690 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 , MiscObjCmd, (C
156a0 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
156b0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
156c0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
156d0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
156e0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
156f0 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 ::protocols", Pr
15700 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 otocolsObjCmd, (
15710 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
15720 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
15730 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 c *) NULL);..
15740 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 if (interp) {..
15750 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c Tcl_Eval(interp,
15760 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 tlsTclInitScrip
15770 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 t);. }.. r
15780 65 74 75 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f eturn(Tcl_PkgPro
15790 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 74 6c vide(interp, "tl
157a0 73 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 s", PACKAGE_VERS
157b0 49 4f 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d ION));.}../*. *-
157c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157f0 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 -----*. *. *.Tls
15800 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a _SafeInit --. *.
15810 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.-------------
15820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15840 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 ---*. *.Standard
15850 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 procedure requi
15860 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 red by 'load'..
15870 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 *.Initializes th
15880 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 is extension for
15890 20 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 a safe interpre
158a0 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d ter.. *.--------
158b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158d0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
158e0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
158f0 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 ..As of 'Tls_Ini
15900 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a t'. *. *.Result:
15910 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 . *..A standard
15920 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a Tcl error code..
15930 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
15940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f -----------*. */
15970 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 .DLLEXPORT int T
15980 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f ls_SafeInit(Tcl_
15990 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 Interp *interp)
159a0 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 {. dprintf("C
159b0 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 alled");. ret
159c0 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 urn(Tls_Init(int
159d0 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d erp));.}../*. *-
159e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a10 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 -----*. *. *.Tls
15a20 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a LibInit --. *. *
15a30 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
15a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a60 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 -*. *.Initialize
15a70 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e s SSL library on
15a80 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 ce per applicati
15a90 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d on. *.----------
15aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ac0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 ------*. *. *.Si
15ad0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 de effects:. *..
15ae0 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 initializes SSL
15af0 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 library. *. *.Re
15b00 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 sult:. *..none.
15b10 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
15b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a ----------*. */.
15b50 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 static int TlsLi
15b60 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 bInit(int uninit
15b70 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 ialize) {. st
15b80 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c atic int initial
15b90 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e ized = 0;. in
15ba0 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f t status = TCL_O
15bb0 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f K;.#if defined(O
15bc0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
15bd0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
15be0 48 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 HREADS). size
15bf0 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 _t num_locks;.#e
15c00 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e ndif.. if (un
15c10 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 initialize) {..i
15c20 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 f (!initialized)
15c30 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
15c40 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 "Asked to uninit
15c50 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 ialize, but we a
15c60 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a re not initializ
15c70 65 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 ed");... retu
15c80 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a rn(TCL_OK);..}..
15c90 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 .dprintf("Asked
15ca0 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 to uninitialize"
15cb0 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 );..#if defined(
15cc0 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
15cd0 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
15ce0 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 THREADS)..Tcl_Mu
15cf0 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 texLock(&init_mx
15d00 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 );...if (locks)
15d10 7b 0a 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b {.. free(lock
15d20 73 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d s);.. locks =
15d30 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b NULL;.. lock
15d40 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 sCount = 0;..}.#
15d50 65 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a endif..initializ
15d60 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 ed = 0;..#if def
15d70 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
15d80 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
15d90 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 (TCL_THREADS)..T
15da0 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 cl_MutexUnlock(&
15db0 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 init_mx);.#endif
15dc0 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b ...return(TCL_OK
15dd0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
15de0 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b (initialized) {
15df0 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 ..dprintf("Calle
15e00 64 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 d, but using cac
15e10 68 65 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 hed value");..re
15e20 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 turn(status);.
15e30 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
15e40 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 ("Called");..#if
15e50 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
15e60 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
15e70 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
15e80 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c ). Tcl_MutexL
15e90 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 ock(&init_mx);.#
15ea0 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 endif. initia
15eb0 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 lized = 1;..#if
15ec0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
15ed0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
15ee0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
15ef0 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d . num_locks =
15f00 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 1;. locksCou
15f10 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c nt = (int) num_l
15f20 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 ocks;. locks
15f30 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 = malloc(sizeof(
15f40 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f *locks) * num_lo
15f50 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 cks);. memset
15f60 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f (locks, 0, sizeo
15f70 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f f(*locks) * num_
15f80 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a locks);.#endif..
15f90 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a /* Initializ
15fa0 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f e BOTH libcrypto
15fb0 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a and libssl. */.
15fc0 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 OPENSSL_init
15fd0 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 _ssl(OPENSSL_INI
15fe0 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e T_LOAD_SSL_STRIN
15ff0 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 GS | OPENSSL_INI
16000 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 T_LOAD_CRYPTO_ST
16010 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c RINGS..| OPENSSL
16020 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 _INIT_ADD_ALL_CI
16030 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f PHERS | OPENSSL_
16040 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 INIT_ADD_ALL_DIG
16050 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 ESTS, NULL);..
16060 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 BIO_new_tcl(NU
16070 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 LL, 0);..#if 0.
16080 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 /*. * XXX
16090 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 :TODO: Remove th
160a0 69 73 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c is code and repl
160b0 61 63 65 20 69 74 20 77 69 74 68 20 61 20 63 68 ace it with a ch
160c0 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 eck. * for e
160d0 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e nough entropy an
160e0 64 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 d do not try to
160f0 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 create our own.
16100 20 20 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 * terrible e
16110 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 ntropy. */.
16120 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 /*. * See
16130 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d d the random num
16140 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e ber generator in
16150 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 the SSL library
16160 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 ,. * using t
16170 68 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 he do/while cons
16180 74 72 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 truct because of
16190 20 74 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e the bug note in
161a0 20 74 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e the. * Open
161b0 53 53 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a SSL FAQ at http:
161c0 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 //www.openssl.or
161d0 67 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 g/support/faq.ht
161e0 6d 6c 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a ml#USER1. *.
161f0 20 20 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 * The crux
16200 6f 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 of the problem i
16210 73 20 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 s that Solaris 7
16220 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 does not have a
16230 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e . * /dev/ran
16240 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e dom or /dev/uran
16250 64 6f 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 dom device so it
16260 20 63 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 cannot gather e
16270 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 nough. * ent
16280 72 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 ropy from the RA
16290 4e 44 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 ND_seed() when T
162a0 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 LS initializes a
162b0 6e 64 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 nd refuses.
162c0 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e * to go further.
162d0 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e Earlier version
162e0 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 s of OpenSSL car
162f0 72 69 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 ried on regardle
16300 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 ss.. */.
16310 73 72 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 srand((unsigned
16320 69 6e 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f int) time((time_
16330 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 t *) NULL));.
16340 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 do {..for (i =
16350 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 0; i < 16; i++)
16360 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b {.. rnd_seed[
16370 69 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 i] = 1 + (char)
16380 28 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f (255.0 * rand()/
16390 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b (RAND_MAX+1.0));
163a0 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 ..}..RAND_seed(r
163b0 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 nd_seed, sizeof(
163c0 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 rnd_seed));.
163d0 7d 20 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 } while (RAND_st
163e0 61 74 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 atus() != 1);.#e
163f0 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 ndif..#if define
16400 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
16410 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
16420 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f L_THREADS)..Tcl_
16430 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 MutexUnlock(&ini
16440 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 t_mx);.#endif...
16450 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a return(status);.
16460 7d 0a }.