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 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
2a70: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
2a80: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 l */. cmdPtr
2a90: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
2aa0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d bj(statePtr->vcm
2ab0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
2ac0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2ad0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2ae0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2af0: 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29 j("verify", -1))
2b00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
2b10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2b20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
2b30: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2b40: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
2b50: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
2b60: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lf), -1));. T
2b70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2b80: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2b90: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 cmdPtr, Tcl_NewI
2ba0: 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a 20 ntObj(depth));.
2bb0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2bc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2bd0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f rp, cmdPtr, Tls_
2be0: 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 NewX509Obj(inter
2bf0: 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 54 p, cert));. T
2c00: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2c10: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2c20: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 cmdPtr, Tcl_NewI
2c30: 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20 ntObj(ok));.
2c40: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2c50: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2c60: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 cmdPtr,..Tcl_Ne
2c70: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 wStringObj((char
2c80: 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 *)X509_verify_ce
2c90: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 rt_error_string(
2ca0: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 err), -1));..
2cb0: 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f 20 /* Prevent I/O
2cc0: 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 69 while callback i
2cd0: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f s in progress */
2ce0: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 . /* statePtr
2cf0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 ->flags |= TLS_T
2d00: 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f 0a CL_CALLBACK; */.
2d10: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
2d20: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
2d30: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
2d40: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
2d50: 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c 6c ok = EvalCall
2d60: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
2d70: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
2d80: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
2d90: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
2da0: 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e /* statePtr->
2db0: 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 flags &= ~(TLS_T
2dc0: 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f CL_CALLBACK); */
2dd0: 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 3b . return(ok);
2de0: 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 ./* By default,
2df0: 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69 leave verificati
2e00: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f on unchanged. */
2e10: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
2e60: 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d . * Tls_Error --
2e70: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c . *. *.Calls cal
2e80: 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74 20 lback with list
2e90: 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a of errors.. *. *
2ea0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
2eb0: 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 *.The err field
2ec0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 of the currently
2ed0: 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 operative State
2ee0: 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 is set. *. to
2ef0: 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 a string describ
2f00: 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f ing the SSL nego
2f10: 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 tiation failure
2f20: 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d reason. *. *----
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2f70: 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 */.void.Tls_Err
2f80: 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 or(State *stateP
2f90: 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20 7b tr, char *msg) {
2fa0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
2fb0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
2fc0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
2fd0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c Tcl_Obj *cmdPtr,
2fe0: 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 75 *listPtr;. u
2ff0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72 nsigned long err
3000: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
3010: 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 err = msg;..
3020: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
3030: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
3040: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
3050: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
3060: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 )..return;..
3070: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
3080: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 d to eval */.
3090: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
30a0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
30b0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
30c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
30d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
30e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
30f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 _NewStringObj("e
3100: 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 rror", -1));.
3110: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3120: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3130: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
3140: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3150: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
3160: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
3170: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 f), -1));. if
3180: 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b (msg != NULL) {
3190: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
31a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
31b0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
31c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c ewStringObj(msg,
31d0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c -1));.. } el
31e0: 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54 63 se if ((msg = Tc
31f0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
3200: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 bj(Tcl_GetObjRes
3210: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55 4c ult(interp), NUL
3220: 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 L)) != NULL) {..
3230: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
3240: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
3250: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
3260: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d StringObj(msg, -
3270: 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 1));.. } else
3280: 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 {..listPtr = Tc
3290: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
32a0: 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 NULL);..while ((
32b0: 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 err = ERR_get_er
32c0: 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 ror()) != 0) {..
32d0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
32e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
32f0: 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 erp, listPtr, Tc
3300: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 l_NewStringObj(E
3310: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f RR_reason_error_
3320: 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 string(err), -1)
3330: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f );..}..Tcl_ListO
3340: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3350: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3360: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a listPtr);. }.
3370: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
3380: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
3390: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
33a0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
33b0: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 EvalCallback(
33c0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
33d0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 , cmdPtr);. T
33e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
33f0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a cmdPtr);.}.../*.
3400: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3440: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c -----. *. * KeyL
3450: 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a ogCallback --. *
3460: 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 . *.Write receiv
3470: 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c ed key data to l
3480: 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 og file.. *. * S
3490: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
34a0: 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d none. *. *------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
34f0: 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c /.void KeyLogCal
3500: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
3510: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 *ssl, const char
3520: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 *line) {. ch
3530: 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 ar *str = getenv
3540: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b (SSLKEYLOGFILE);
3550: 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a . FILE *fd;..
3560: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
3570: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
3580: 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 str) {..fd = fop
3590: 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 en(str, "a");..f
35a0: 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e printf(fd, "%s\n
35b0: 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 ",line);..fclose
35c0: 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a (fd);. }.}...
35d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 --------. *. * P
3620: 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b assword Callback
3630: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 --. *. *.Called
3640: 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 when a password
3650: 20 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b for a private k
3660: 65 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69 ey loading/stori
3670: 6e 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 74 ng a PEM. *.cert
3680: 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e 63 ificate with enc
3690: 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 ryption. Evals c
36a0: 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 61 allback script a
36b0: 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 68 nd returns. *.th
36c0: 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 e result as the
36d0: 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 password string
36e0: 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 in buf.. *. * Re
36f0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
3700: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
3710: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
3720: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
3730: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a ). *. * Returns:
3740: 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a . *.Password siz
3750: 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 e in bytes or -1
3760: 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 for an error..
3770: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
37c0: 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 ic int.PasswordC
37d0: 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 allback(char *bu
37e0: 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 f, int size, int
37f0: 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 rwflag, void *u
3800: 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 data) {. Stat
3810: 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 e *statePtr.= (S
3820: 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 tate *) udata;.
3830: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
3840: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
3850: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
3860: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
3870: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 int code;..
3880: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
3890: 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 d");.. /* If
38a0: 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 no callback, use
38b0: 20 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 default callbac
38c0: 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 k */. if (sta
38d0: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 tePtr->password
38e0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 == NULL) {..if (
38f0: 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 Tcl_EvalEx(inter
3900: 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 p, "tls::passwor
3910: 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c d", -1, TCL_EVAL
3920: 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f _GLOBAL) == TCL_
3930: 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 OK) {.. char
3940: 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 *ret = (char *)
3950: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 Tcl_GetStringRes
3960: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 ult(interp);..
3970: 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 strncpy(buf, r
3980: 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a et, (size_t) siz
3990: 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 e);.. return
39a0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 (int)strlen(ret)
39b0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
39c0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 return -1;..}.
39d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
39e0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
39f0: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 val */. cmdPt
3a00: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
3a10: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 eObj(statePtr->p
3a20: 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 assword);. Tc
3a30: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3a40: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3a50: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
3a60: 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 ringObj("passwor
3a70: 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 d", -1));. Tc
3a80: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3a90: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3aa0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e mdPtr, Tcl_NewIn
3ab0: 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 tObj(rwflag));.
3ac0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3ad0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3ae0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
3af0: 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 NewIntObj(size))
3b00: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 ;.. Tcl_Prese
3b10: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 rve((ClientData)
3b20: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 interp);. Tc
3b30: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 l_Preserve((Clie
3b40: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
3b50: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 );.. /* Eval
3b60: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
3b70: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
3b80: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
3b90: 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c ;. code = Tcl
3ba0: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 _EvalObjEx(inter
3bb0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 p, cmdPtr, TCL_E
3bc0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 VAL_GLOBAL);.
3bd0: 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c if (code != TCL
3be0: 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f _OK) {.#if (TCL_
3bf0: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d MAJOR_VERSION ==
3c00: 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 8) && (TCL_MINO
3c10: 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 R_VERSION < 6)..
3c20: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 Tcl_BackgroundEr
3c30: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c ror(interp);.#el
3c40: 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 se..Tcl_Backgrou
3c50: 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 ndException(inte
3c60: 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 rp, code);.#endi
3c70: 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f f. }. Tcl_
3c80: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
3c90: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 Ptr);.. Tcl_R
3ca0: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
3cb0: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a ta) statePtr);..
3cc0: 20 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73 /* If succes
3cd0: 73 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 sful, pass back
3ce0: 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 password string
3cf0: 61 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66 20 and truncate if
3d00: 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 too long */.
3d10: 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f if (code == TCL_
3d20: 4f 4b 29 20 7b 0a 09 69 6e 74 20 6c 65 6e 3b 0a OK) {..int len;.
3d30: 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 .char *ret = (ch
3d40: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 ar *) Tcl_GetStr
3d50: 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 ingFromObj(Tcl_G
3d60: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
3d70: 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 rp), &len);..if
3d80: 28 6c 65 6e 20 3e 20 73 69 7a 65 2d 31 29 20 7b (len > size-1) {
3d90: 0a 09 20 20 20 20 6c 65 6e 20 3d 20 73 69 7a 65 .. len = size
3da0: 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28 -1;..}..strncpy(
3db0: 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f buf, ret, (size_
3dc0: 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65 t) len);..buf[le
3dd0: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f n] = '\0';..Tcl_
3de0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
3df0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 72 ata) interp);..r
3e00: 65 74 75 72 6e 28 6c 65 6e 29 3b 0a 20 20 20 20 eturn(len);.
3e10: 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 }. Tcl_Releas
3e20: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
3e30: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 nterp);. retu
3e40: 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a rn -1;.}.../*. *
3e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e90: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f ---. *. * Sessio
3ea0: 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 n Callback for C
3eb0: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 lients --. *. *.
3ec0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 Called when a ne
3ed0: 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64 w session is add
3ee0: 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e ed to the cache.
3ef0: 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 In TLS 1.3. *.t
3f00: 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 69 his may be recei
3f10: 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d ved multiple tim
3f20: 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61 6e es after the han
3f30: 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 dshake. For. *.e
3f40: 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c arlier versions,
3f50: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 this will be re
3f60: 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 68 ceived during th
3f70: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 e handshake.. *.
3f80: 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65 66 This is the pref
3f90: 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74 erred way to obt
3fa0: 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20 ain a resumable
3fb0: 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 session.. *. * R
3fc0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
3fd0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
3fe0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
3ff0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
4000: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 d). *. * Return
4010: 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 codes:. *.0 = er
4020: 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 6f ror where sessio
4030: 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 n will be immedi
4040: 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 ately removed fr
4050: 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 om the internal
4060: 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 cache.. *.1 = su
4070: 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70 20 ccess where app
4080: 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 retains session
4090: 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65 in session cache
40a0: 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 , and must call
40b0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 SSL_SESSION_free
40c0: 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a () when done.. *
40d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4110: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
4120: 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c c int.SessionCal
4130: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
4140: 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f *ssl, SSL_SESSIO
4150: 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 N *session) {.
4160: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
4170: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f r = (State*)SSL_
4180: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 get_app_data((SS
4190: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 L *)ssl);. Tc
41a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
41b0: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
41c0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
41d0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f *cmdPtr;. co
41e0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
41f0: 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 r *ticket;. c
4200: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
4210: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a ar *session_id;.
4220: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b size_t len2;
4230: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e . unsigned in
4240: 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 t ulen;.. dpr
4250: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
4260: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
4270: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 r->callback == (
4280: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b Tcl_Obj*)NULL) {
4290: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
42a0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
42b0: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d } else if (ssl =
42c0: 3d 20 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 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
42f0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
4300: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a mand to eval */.
4310: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
4320: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
4330: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
4340: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
4350: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
4360: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
4370: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
4380: 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 ("session", -1))
4390: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f ;.. /* Sessio
43a0: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 n id */. sess
43b0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 ion_id = SSL_SES
43c0: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 SION_get_id(sess
43d0: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 ion, &ulen);.
43e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
43f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4400: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4410: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 wByteArrayObj(se
4420: 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 ssion_id, (int)
4430: 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 ulen));.. /*
4440: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a Session ticket *
4450: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f /. SSL_SESSIO
4460: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 N_get0_ticket(se
4470: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
4480: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f &len2);. Tcl_
4490: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
44a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
44b0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 Ptr, Tcl_NewByte
44c0: 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c ArrayObj(ticket,
44d0: 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a (int) len2));..
44e0: 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 /* Lifetime
44f0: 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f - number of seco
4500: 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c nds */. Tcl_L
4510: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4520: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4530: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 tr,..Tcl_NewLong
4540: 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 Obj((long) SSL_S
4550: 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 ESSION_get_ticke
4560: 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 t_lifetime_hint(
4570: 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 session)));..
4580: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 /* Eval callbac
4590: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 k command */.
45a0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
45b0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 t(cmdPtr);. E
45c0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
45d0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
45e0: 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 dPtr);. Tcl_D
45f0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
4600: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
4610: 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 0;.}.../*. *----
4620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4660: 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 *. * ALPN Callb
4670: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 ack for Servers
4680: 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b and NPN Callback
4690: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a for Clients --.
46a0: 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 *. *.Perform pr
46b0: 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 otocol (http/1.1
46c0: 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 , h2, h3, etc.)
46d0: 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 selection for th
46e0: 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f e. *.incoming co
46f0: 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 nnection. Called
4700: 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 after Hello and
4710: 20 73 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b server callback
4720: 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74 s.. *.Where 'out
4730: 27 20 69 73 20 73 65 6c 65 63 74 65 64 20 70 72 ' is selected pr
4740: 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 otocol and 'in'
4750: 69 73 20 74 68 65 20 70 65 65 72 20 61 64 76 65 is the peer adve
4760: 72 74 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a rtised list.. *.
4770: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
4780: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
4790: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
47a0: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
47b0: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
47c0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
47d0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a L_TLSEXT_ERR_OK:
47e0: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 ALPN protocol s
47f0: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e elected. The con
4800: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
4810: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s.. *.SSL_TLSEXT
4820: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
4830: 3a 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f : There was no o
4840: 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 verlap between t
4850: 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 he client's. *.
4860: 20 20 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 supplied list
4870: 20 61 6e 64 20 74 68 65 20 73 65 72 76 65 72 20 and the server
4880: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 configuration. T
4890: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 he connection wi
48a0: 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 ll be aborted..
48b0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
48c0: 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f _NOACK: ALPN pro
48d0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 tocol not select
48e0: 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 ed, e.g., becaus
48f0: 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 e no ALPN. *.
4900: 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 protocols are c
4910: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 onfigured for th
4920: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 is connection. T
4930: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
4940: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d ntinues.. *. *--
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4990: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
49a0: 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f .ALPNCallback(co
49b0: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f nst SSL *ssl, co
49c0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
49d0: 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 r **out, unsigne
49e0: 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a d char *outlen,.
49f0: 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 .const unsigned
4a00: 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e char *in, unsign
4a10: 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f ed int inlen, vo
4a20: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
4a30: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
4a40: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
4a50: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
4a60: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
4a70: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
4a80: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
4a90: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
4aa0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
4ab0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
4ac0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (ssl == NULL ||
4ad0: 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a arg == NULL) {.
4ae0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4af0: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
4b00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 }.. /* Sele
4b10: 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 ct protocol */.
4b20: 20 20 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 if (SSL_selec
4b30: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 t_next_proto(out
4b40: 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 , outlen, stateP
4b50: 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 tr->protos, stat
4b60: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e ePtr->protos_len
4b70: 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d ,..in, inlen) ==
4b80: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 OPENSSL_NPN_NEG
4b90: 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d OTIATED) {../* M
4ba0: 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 atch found */..r
4bb0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
4bc0: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c ERR_OK;. } el
4bd0: 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c se {../* OPENSSL
4be0: 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 _NPN_NO_OVERLAP
4bf0: 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f = No overlap, so
4c00: 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 use first item
4c10: 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 from client prot
4c20: 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 ocol list */..re
4c30: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
4c40: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
4c50: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
4c60: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f r->vcmd == (Tcl_
4c70: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 Obj*)NULL) {..re
4c80: 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a turn res;. }.
4c90: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
4ca0: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a ommand to eval *
4cb0: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
4cc0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
4cd0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
4ce0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4cf0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4d00: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
4d10: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
4d20: 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 alpn", -1));.
4d30: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4d40: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4d50: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4d60: 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f 75 74 2c wStringObj(*out,
4d70: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
4d80: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4d90: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4da0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 tr, Tcl_NewBoole
4db0: 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c anObj(res == SSL
4dc0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 _TLSEXT_ERR_OK))
4dd0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
4de0: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
4df0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
4e00: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
4e10: 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d . if ((code =
4e20: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e EvalCallback(in
4e30: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
4e40: 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a cmdPtr)) > 1) {.
4e50: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 .res = SSL_TLSEX
4e60: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
4e70: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 } else if (code
4e80: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 == 1) {..res =
4e90: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
4ea0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a K;. } else {.
4eb0: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 .res = SSL_TLSEX
4ec0: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 T_ERR_ALERT_FATA
4ed0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c L;. }. Tcl
4ee0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
4ef0: 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 dPtr);. retur
4f00: 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a n res;.}.../*. *
4f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f50: 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 ---. *. * Advert
4f60: 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 ise Protocols Ca
4f70: 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 llback for Next
4f80: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 Protocol Negotia
4f90: 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 tion (NPN) in Se
4fa0: 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a rverHello --. *.
4fb0: 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 *.called when a
4fc0: 20 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 TLS server need
4fd0: 73 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 s a list of supp
4fe0: 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 orted protocols
4ff0: 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 for Next. *.Prot
5000: 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e ocol Negotiation
5010: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
5020: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
5030: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a ide effects:. *.
5040: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a * Return codes:
5050: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
5060: 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f RR_OK: NPN proto
5070: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 col selected. Th
5080: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
5090: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 tinues.. *.SSL_T
50a0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a LSEXT_ERR_NOACK:
50b0: 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f NPN protocol no
50c0: 74 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 t selected. The
50d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
50e0: 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nues.. *. *-----
50f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5130: 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 */.#ifdef USE_NP
5140: 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e N.static int.NPN
5150: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
5160: 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 SL *ssl, const u
5170: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f nsigned char **o
5180: 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 ut, unsigned int
5190: 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a *outlen, void *
51a0: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 arg) {. State
51b0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
51c0: 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 ate*)arg;.. d
51d0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
51e0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d ;.. if (ssl =
51f0: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d = NULL || arg ==
5200: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
5210: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5220: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
5230: 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f /* Set protoco
5240: 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 ls list */. i
5250: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f f (statePtr->pro
5260: 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 tos != NULL) {..
5270: 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d *out = statePtr-
5280: 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 >protos;..*outle
5290: 6e 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 n = statePtr->pr
52a0: 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 otos_len;. }
52b0: 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e else {..*out = N
52c0: 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 ULL;..*outlen =
52d0: 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 0;..return SSL_T
52e0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
52f0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
5300: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
5310: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a _OK;.}.#endif...
5320: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 --------. *. * S
5370: 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 NI Callback for
5380: 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a Servers --. *. *
5390: 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d .Perform server-
53a0: 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d side SNI hostnam
53b0: 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 e selection afte
53c0: 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 r receiving SNI
53d0: 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 extension. *.in
53e0: 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 Client Hello. Ca
53f0: 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f lled after hello
5400: 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 callback but be
5410: 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 fore ALPN callba
5420: 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ck.. *. * Result
5430: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
5440: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
5450: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
5460: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
5470: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 . * Return codes
5480: 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f :. *.SSL_TLSEXT_
5490: 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 ERR_OK: SNI host
54a0: 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 name is accepted
54b0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
54c0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
54d0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
54e0: 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 ERT_FATAL: SNI h
54f0: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 ostname is not a
5500: 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e ccepted. The con
5510: 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 nection. *. i
5520: 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 s aborted. Defau
5530: 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 lt for alert is
5540: 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 SSL_AD_UNRECOGNI
5550: 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c ZED_NAME.. *.SSL
5560: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 _TLSEXT_ERR_ALER
5570: 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 T_WARNING: SNI h
5580: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 ostname is not a
5590: 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 ccepted, warning
55a0: 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 alert. *. se
55b0: 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 nt (not supporte
55c0: 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 d in TLSv1.3). T
55d0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
55e0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f ntinues.. *.SSL_
55f0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
5600: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 : SNI hostname i
5610: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 s not accepted a
5620: 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 nd not acknowled
5630: 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e ged,. *. e.g.
5640: 20 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 if SNI has not
5650: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e been configured.
5660: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
5670: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a continues.. *. *
5680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56c0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
56d0: 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 nt.SNICallback(c
56e0: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 onst SSL *ssl, i
56f0: 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 nt *alert, void
5700: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 *arg) {. Stat
5710: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
5720: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 tate*)arg;. T
5730: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
5740: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
5750: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
5760: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
5770: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 nt code, res;.
5780: 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 char *serverna
5790: 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 me = NULL;..
57a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
57b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 );.. if (ssl
57c0: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d == NULL || arg =
57d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
57e0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
57f0: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
5800: 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 /* Only works
5810: 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 for TLS 1.2 and
5820: 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 earlier */.
5830: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c servername = SSL
5840: 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 _get_servername(
5850: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 ssl, TLSEXT_NAME
5860: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b TYPE_host_name);
5870: 0a 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72 . if (!server
5880: 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 name || serverna
5890: 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b me[0] == '\0') {
58a0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
58b0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
58c0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
58d0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 atePtr->vcmd ==
58e0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 (Tcl_Obj*)NULL)
58f0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
5900: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
5910: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
5920: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
5930: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 l */. cmdPtr
5940: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
5950: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d bj(statePtr->vcm
5960: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
5970: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
5980: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
5990: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
59a0: 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 j("sni", -1));.
59b0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
59c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
59d0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
59e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 NewStringObj(ser
59f0: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a vername , -1));.
5a00: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
5a10: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
5a20: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
5a30: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
5a40: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 if ((code = E
5a50: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
5a60: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
5a70: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 dPtr)) > 1) {..r
5a80: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
5a90: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e ERR_ALERT_WARNIN
5aa0: 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c G;..*alert = SSL
5ab0: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 _AD_UNRECOGNIZED
5ac0: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 _NAME; /* Not su
5ad0: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 pported by TLS 1
5ae0: 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 .3 */. } else
5af0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
5b00: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
5b10: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
5b20: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
5b30: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5b40: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c LERT_FATAL;..*al
5b50: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 ert = SSL_AD_UNR
5b60: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 ECOGNIZED_NAME;
5b70: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 /* Not supported
5b80: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 by TLS 1.3 */.
5b90: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
5ba0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
5bb0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 );. return re
5bc0: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d s;.}.../*. *----
5bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
5c10: 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c *. * ClientHell
5c20: 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c o Handshake Call
5c30: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 back for Servers
5c40: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 --. *. *.Used b
5c50: 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d y server to exam
5c60: 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e ine the server n
5c70: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 ame indication (
5c80: 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 SNI) extension.
5c90: 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 *.provided by th
5ca0: 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 e client in orde
5cb0: 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 r to select an a
5cc0: 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 ppropriate certi
5cd0: 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 ficate to. *.pre
5ce0: 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f sent, and make o
5cf0: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 ther configurati
5d00: 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 on adjustments r
5d10: 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 elevant to that
5d20: 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 server. *.name a
5d30: 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 nd its configura
5d40: 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 tion. This inclu
5d50: 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 des swapping out
5d60: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a the associated.
5d70: 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 *.SSL_CTX point
5d80: 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 er, modifying th
5d90: 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 e server's list
5da0: 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 of permitted TLS
5db0: 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 versions,. *.ch
5dc0: 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 anging the serve
5dd0: 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 r's cipher list
5de0: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 in response to t
5df0: 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 he client's ciph
5e00: 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a er list, etc.. *
5e10: 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 .Called before S
5e20: 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c NI and ALPN call
5e30: 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 backs.. *. * Res
5e40: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
5e50: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
5e60: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
5e70: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
5e80: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
5e90: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 des:. *.SSL_CLIE
5ea0: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 NT_HELLO_RETRY:
5eb0: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 suspend the hand
5ec0: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 shake, and the h
5ed0: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f andshake functio
5ee0: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d n will return im
5ef0: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c mediately. *.SSL
5f00: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
5f10: 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 ROR: failure, te
5f20: 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 rminate connecti
5f30: 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f on. Set alert to
5f40: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 error code.. *.
5f50: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
5f60: 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 _SUCCESS: succes
5f70: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d s. *. *---------
5f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
5fc0: 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 tatic int.HelloC
5fd0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
5fe0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
5ff0: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
6000: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
6010: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
6020: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
6030: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
6040: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
6050: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
6060: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
6070: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 , res;. const
6080: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
6090: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
60a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 igned char *p;.
60b0: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 size_t len, r
60c0: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 emaining;.. d
60d0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
60e0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
60f0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 Ptr->vcmd == (Tc
6100: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
6110: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6120: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b T_HELLO_SUCCESS;
6130: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
6140: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 ssl == NULL || a
6150: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 rg == NULL) {..r
6160: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6170: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
6180: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.. /* Get
6190: 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 names */. if
61a0: 28 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c (!SSL_client_hel
61b0: 6c 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c lo_get0_ext(ssl,
61c0: 20 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 TLSEXT_TYPE_ser
61d0: 76 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 ver_name, &p, &r
61e0: 65 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d emaining) || rem
61f0: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 aining <= 2) {..
6200: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 *alert = SSL_R_S
6210: 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 SLV3_ALERT_ILLEG
6220: 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 AL_PARAMETER;..r
6230: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6240: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
6250: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 }.. /* Extr
6260: 61 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f act the length o
6270: 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c f the supplied l
6280: 69 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f ist of names. */
6290: 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b . len = (*(p+
62a0: 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 +) << 8);. le
62b0: 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 n += *(p++);.
62c0: 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 if (len + 2 !=
62d0: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 remaining) {..*a
62e0: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c lert = SSL_R_SSL
62f0: 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c V3_ALERT_ILLEGAL
6300: 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 _PARAMETER;..ret
6310: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
6320: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
6330: 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 }. remaining
6340: 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 = len;.. /* T
6350: 68 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 he list in pract
6360: 69 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 ice only has a s
6370: 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 ingle element, s
6380: 6f 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 o we only consid
6390: 65 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 er the first one
63a0: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d . */. if (rem
63b0: 61 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a aining == 0 || *
63c0: 70 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 p++ != TLSEXT_NA
63d0: 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 METYPE_host_name
63e0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
63f0: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f L_R_TLSV1_ALERT_
6400: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a INTERNAL_ERROR;.
6410: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
6420: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
6430: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e }. remain
6440: 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e ing--;.. /* N
6450: 6f 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c ow we can finall
6460: 79 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 y pull out the b
6470: 79 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 yte array with t
6480: 68 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 he actual hostna
6490: 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 me. */. if (r
64a0: 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b emaining <= 2) {
64b0: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 ..*alert = SSL_R
64c0: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 _TLSV1_ALERT_INT
64d0: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 ERNAL_ERROR;..re
64e0: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
64f0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
6500: 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 }. len = (*(
6510: 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 p++) << 8);.
6520: 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 len += *(p++);.
6530: 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e if (len + 2 >
6540: 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a remaining) {..*
6550: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c alert = SSL_R_TL
6560: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e SV1_ALERT_INTERN
6570: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 AL_ERROR;..retur
6580: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
6590: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
65a0: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 remaining =
65b0: 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e len;. servern
65c0: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 ame = (const cha
65d0: 72 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 r *)p;.. /* C
65e0: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
65f0: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 eval */. cmd
6600: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
6610: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
6620: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f >vcmd);. Tcl_
6630: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
6640: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
6650: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
6660: 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d ngObj("hello", -
6670: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
6680: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
6690: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
66a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
66b0: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 bj(servername, (
66c0: 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 int) len));..
66d0: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 /* Eval callbac
66e0: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 k command */.
66f0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
6700: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 t(cmdPtr);. i
6710: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 f ((code = EvalC
6720: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
6730: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
6740: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d )) > 1) {..res =
6750: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6760: 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 O_RETRY;..*alert
6770: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
6780: 4c 45 52 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c LERT_USER_CANCEL
6790: 4c 45 44 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 LED;. } else
67a0: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b if (code == 1) {
67b0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 ..res = SSL_CLIE
67c0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 NT_HELLO_SUCCESS
67d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
67e0: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 res = SSL_CLIENT
67f0: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a _HELLO_ERROR;..*
6800: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c alert = SSL_R_TL
6810: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e SV1_ALERT_INTERN
6820: 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a AL_ERROR;. }.
6830: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
6840: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
6850: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a return res;.}.
6860: 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
6870: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d *******/./* Comm
6880: 61 6e 64 73 20 20 20 20 20 20 20 20 20 2a 2f 0a ands */.
6890: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
68a0: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d *****/../*. *---
68b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
68c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
68d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
68e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
68f0: 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 . *. * CiphersOb
6900: 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 jCmd -- list ava
6910: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a 20 ilable ciphers.
6920: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
6930: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ure is invoked t
6940: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 o process the "t
6950: 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d ls::ciphers" com
6960: 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 mand. *.to list
6970: 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 available cipher
6980: 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72 s, based upon pr
6990: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e otocol selected.
69a0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
69b0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
69c0: 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 l result list..
69d0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
69e0: 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 s:. *.constructs
69f0: 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53 and destroys SS
6a00: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a L context (CTX).
6a10: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
6a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
6a60: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tic const char *
6a70: 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a protocols[] = {.
6a80: 09 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c ."ssl2", "ssl3",
6a90: 20 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 "tls1", "tls1.1
6aa0: 22 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c ", "tls1.2", "tl
6ab0: 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 s1.3", NULL.};.e
6ac0: 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 num protocol {.
6ad0: 20 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 TLS_SSL2, TLS
6ae0: 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c _SSL3, TLS_TLS1,
6af0: 20 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 TLS_TLS1_1, TLS
6b00: 5f 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 _TLS1_2, TLS_TLS
6b10: 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 1_3, TLS_NONE.};
6b20: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70 ..static int.Cip
6b30: 68 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e hersObjCmd(Clien
6b40: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
6b50: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
6b60: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
6b70: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
6b80: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
6b90: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e _Obj *objPtr = N
6ba0: 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 ULL;. SSL_CTX
6bb0: 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *ctx = NULL;.
6bc0: 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c SSL *ssl = NUL
6bd0: 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 L;. STACK_OF(
6be0: 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b SSL_CIPHER) *sk;
6bf0: 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 . char *cp, b
6c00: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 uf[BUFSIZ];.
6c10: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f int index, verbo
6c20: 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 se = 0, use_supp
6c30: 6f 72 74 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 orted = 0;..
6c40: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
6c50: 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a );.. if ((obj
6c60: 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 c < 2) || (objc
6c70: 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f > 4)) {..Tcl_Wro
6c80: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
6c90: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 , 1, objv, "prot
6ca0: 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f ocol ?verbose? ?
6cb0: 73 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 supported?");..r
6cc0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6cd0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 . }. if (T
6ce0: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f cl_GetIndexFromO
6cf0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
6d00: 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 1], protocols, "
6d10: 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 protocol", 0, &i
6d20: 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 ndex) != TCL_OK)
6d30: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
6d40: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
6d50: 69 66 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 if ((objc > 2) &
6d60: 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e & Tcl_GetBoolean
6d70: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
6d80: 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 objv[2], &verbos
6d90: 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a e) != TCL_OK) {.
6da0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
6db0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
6dc0: 28 28 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 54 ((objc > 3) && T
6dd0: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f cl_GetBooleanFro
6de0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
6df0: 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f v[3], &use_suppo
6e00: 72 74 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 rted) != TCL_OK)
6e10: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
6e20: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
6e30: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 ERR_clear_error
6e40: 28 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 ();.. switch
6e50: 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 ((enum protocol)
6e60: 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 65 20 54 index) {..case T
6e70: 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 LS_SSL2:.#if OPE
6e80: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
6e90: 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 BER >= 0x1010000
6ea0: 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 0L || defined(NO
6eb0: 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL2) || define
6ec0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
6ed0: 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 2).. Tcl_Appe
6ee0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
6ef0: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 protocols[index
6f00: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e ], ": protocol n
6f10: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
6f20: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
6f30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c n TCL_ERROR;.#el
6f40: 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 se.. ctx = SS
6f50: 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f L_CTX_new(SSLv2_
6f60: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b method()); break
6f70: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 ;.#endif..case T
6f80: 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 LS_SSL3:.#if def
6f90: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c ined(NO_SSL3) ||
6fa0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
6fb0: 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 _NO_SSL3) || def
6fc0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
6fd0: 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 SSL3_METHOD)..
6fe0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
6ff0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f lt(interp, proto
7000: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 cols[index], ":
7010: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
7020: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
7030: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
7040: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
7050: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ctx = SSL_CTX_
7060: 6e 65 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 new(SSLv3_method
7070: 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 ()); break;.#end
7080: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
7090: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 1:.#if defined(N
70a0: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e O_TLS1) || defin
70b0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
70c0: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f S1) || defined(O
70d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d PENSSL_NO_TLS1_M
70e0: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
70f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7100: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
7110: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
7120: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
7130: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
7140: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7150: 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 .#else.. ctx
7160: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c = SSL_CTX_new(TL
7170: 53 76 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 Sv1_method()); b
7180: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
7190: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 se TLS_TLS1_1:.#
71a0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
71b0: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
71c0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
71d0: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
71e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
71f0: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 _METHOD).. Tc
7200: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
7210: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
7220: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
7230: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
7240: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
7250: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
7260: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 R;.#else.. ct
7270: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 x = SSL_CTX_new(
7280: 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 TLSv1_1_method()
7290: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
72a0: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f ..case TLS_TLS1_
72b0: 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 2:.#if defined(N
72c0: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 O_TLS1_2) || def
72d0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
72e0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e TLS1_2) || defin
72f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7300: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 S1_2_METHOD)..
7310: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
7320: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f lt(interp, proto
7330: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 cols[index], ":
7340: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
7350: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
7360: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
7370: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
7380: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ctx = SSL_CTX_
7390: 6e 65 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68 new(TLSv1_2_meth
73a0: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 od()); break;.#e
73b0: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
73c0: 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e LS1_3:.#if defin
73d0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
73e0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
73f0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 _NO_TLS1_3)..
7400: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
7410: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
7420: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
7430: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
7440: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
7450: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
7460: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 RROR;.#else..
7470: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e ctx = SSL_CTX_n
7480: 65 77 28 54 4c 53 5f 6d 65 74 68 6f 64 28 29 29 ew(TLS_method())
7490: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 ;.. SSL_CTX_s
74a0: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 et_min_proto_ver
74b0: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 sion(ctx, TLS1_3
74c0: 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 _VERSION);..
74d0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f SSL_CTX_set_max_
74e0: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
74f0: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f x, TLS1_3_VERSIO
7500: 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a N);.. break;.
7510: 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a #endif..default:
7520: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 .. break;.
7530: 20 7d 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d }. if (ctx =
7540: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 = NULL) {..Tcl_A
7550: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7560: 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 rp, REASON(), NU
7570: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
7580: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
7590: 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 ssl = SSL_new
75a0: 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 73 (ctx);. if (s
75b0: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 sl == NULL) {..T
75c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
75d0: 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 interp, REASON()
75e0: 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 , NULL);..SSL_CT
75f0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
7600: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7610: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 }.. /* Us
7620: 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 e list and order
7630: 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e as would be sen
7640: 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c t in a ClientHel
7650: 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 lo or all availa
7660: 62 6c 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 ble ciphers */.
7670: 20 20 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f if (use_suppo
7680: 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 rted) {..sk = SS
7690: 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 L_get1_supported
76a0: 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 _ciphers(ssl);.
76b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 } else {..sk
76c0: 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 = SSL_get_cipher
76d0: 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 s(ssl);. }..
76e0: 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c if (sk != NUL
76f0: 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f L) {..if (!verbo
7700: 73 65 29 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 se) {.. objPt
7710: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
7720: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 bj(0, NULL);..
7730: 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 for (int i = 0
7740: 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 ; i < sk_SSL_CIP
7750: 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b HER_num(sk); i++
7760: 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f ) {...const SSL_
7770: 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 CIPHER *c = sk_S
7780: 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 SL_CIPHER_value(
7790: 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 sk, i);...if (c
77a0: 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 == NULL) continu
77b0: 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 e;..../* cipher
77c0: 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a name or (NONE) *
77d0: 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 /...cp = SSL_CIP
77e0: 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b HER_get_name(c);
77f0: 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c ...if (cp == NUL
7800: 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f L) break;...Tcl_
7810: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
7820: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
7830: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
7840: 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a ngObj(cp, -1));.
7850: 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 . }...} else
7860: 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 {.. objPtr =
7870: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
7880: 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 ("",0);.. for
7890: 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c (int i = 0; i <
78a0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e sk_SSL_CIPHER_n
78b0: 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 um(sk); i++) {..
78c0: 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 .const SSL_CIPHE
78d0: 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 R *c = sk_SSL_CI
78e0: 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 PHER_value(sk, i
78f0: 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 );...if (c == NU
7900: 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 LL) continue;...
7910: 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 ./* textual desc
7920: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 ription of the c
7930: 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 ipher */...if (S
7940: 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 SL_CIPHER_descri
7950: 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 ption(c, buf, si
7960: 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 zeof(buf)) != NU
7970: 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f LL) {... Tcl_
7980: 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 AppendToObj(objP
7990: 74 72 2c 20 62 75 66 2c 20 28 69 6e 74 29 20 73 tr, buf, (int) s
79a0: 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d trlen(buf));...}
79b0: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 else {... Tc
79c0: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 l_AppendToObj(ob
79d0: 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e jPtr, "UNKNOWN\n
79e0: 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 ", 8);...}..
79f0: 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 }..}..if (use_su
7a00: 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 pported) {..
7a10: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 sk_SSL_CIPHER_fr
7a20: 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d ee(sk);..}. }
7a30: 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 . SSL_free(ss
7a40: 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f l);. SSL_CTX_
7a50: 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 free(ctx);..
7a60: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
7a70: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
7a80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
7a90: 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 _OK;..clientData
7aa0: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d = clientData;.}
7ab0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
7ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
7b00: 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d * ProtocolsObjCm
7b10: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 d -- list availa
7b20: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a ble protocols. *
7b30: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
7b40: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f re is invoked to
7b50: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c process the "tl
7b60: 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f s::protocols" co
7b70: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 mmand. *.to list
7b80: 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f available proto
7b90: 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 cols.. *. * Resu
7ba0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
7bb0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 rd Tcl result li
7bc0: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 st.. *. * Side e
7bd0: 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a ffects:. *.none.
7be0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
7bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c20: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
7c30: 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c tic int.Protocol
7c40: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 sObjCmd(ClientDa
7c50: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
7c60: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
7c70: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
7c80: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
7c90: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
7ca0: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 j *objPtr;..
7cb0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
7cc0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
7cd0: 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 != 1) {..Tcl_Wr
7ce0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
7cf0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b p, 1, objv, "");
7d00: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7d10: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 OR;. }.. E
7d20: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
7d30: 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 ;.. objPtr =
7d40: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
7d50: 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 , NULL);..#if OP
7d60: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
7d70: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
7d80: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
7d90: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
7da0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
7db0: 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 SL2). Tcl_Lis
7dc0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
7dd0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
7de0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
7df0: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
7e00: 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 _SSL2], -1));.#e
7e10: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
7e20: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 d(NO_SSL3) && !d
7e30: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7e40: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
7e50: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
7e60: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 SL3_METHOD).
7e70: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
7e80: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
7e90: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
7ea0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 StringObj(protoc
7eb0: 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d ols[TLS_SSL3], -
7ec0: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
7ed0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
7ee0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
7ef0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 ENSSL_NO_TLS1) &
7f00: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
7f10: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
7f20: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f D). Tcl_ListO
7f30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
7f40: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
7f50: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
7f60: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 (protocols[TLS_T
7f70: 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 LS1], -1));.#end
7f80: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
7f90: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
7fa0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7fb0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
7fc0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7fd0: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a _TLS1_1_METHOD).
7fe0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
7ff0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
8000: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
8010: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
8020: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
8030: 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 _1], -1));.#endi
8040: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
8050: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
8060: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8070: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
8080: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8090: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_2_METHOD).
80a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
80b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
80c0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
80d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
80e0: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f tocols[TLS_TLS1_
80f0: 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 2], -1));.#endif
8100: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
8110: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 _TLS1_3) && !def
8120: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8130: 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f TLS1_3). Tcl_
8140: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
8150: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
8160: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
8170: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
8180: 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 TLS_TLS1_3], -1)
8190: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 );.#endif.. T
81a0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
81b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
81c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
81d0: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 OK;..clientData
81e0: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a = clientData;.}.
81f0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
8200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
8240: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 HandshakeObjCmd
8250: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 --. *. *.This c
8260: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 ommand is used t
8270: 6f 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72 o verify whether
8280: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 the handshake i
8290: 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 s complete. *.or
82a0: 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 not.. *. * Resu
82b0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
82c0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 rd Tcl result. 1
82d0: 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 means handshake
82e0: 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 complete, 0 mea
82f0: 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 ns pending.. *.
8300: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
8310: 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c *.May force SSL
8320: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 negotiation to
8330: 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 take place.. *.
8340: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
8350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8380: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
8390: 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a int HandshakeObj
83a0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
83b0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
83c0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
83d0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
83e0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
83f0: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
8400: 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f l chan; /
8410: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
8420: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 set a mode on.
8430: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 */. State *st
8440: 61 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f atePtr; /
8450: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
8460: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
8470: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
8480: 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a *errStr = NULL;.
8490: 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b int ret = 1;
84a0: 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 . int err = 0
84b0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
84c0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
84d0: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
84e0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
84f0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
8500: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
8510: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
8520: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 );. }.. ER
8530: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
8540: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
8550: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
8560: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
8570: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d gFromObj(objv[1]
8580: 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a , NULL), NULL);.
8590: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
85a0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
85b0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 LL) {..return(TC
85c0: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a L_ERROR);. }.
85d0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
85e0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
85f0: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
8600: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
8610: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
8620: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 nel(chan);. i
8630: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
8640: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
8650: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
8660: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
8670: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
8680: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
8690: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
86a0: 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 me(chan),.. "
86b0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
86c0: 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 annel", NULL);..
86d0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
86e0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
86f0: 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 43 48 "HANDSHAKE", "CH
8700: 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 ANNEL", "INVALID
8710: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
8720: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 );..return(TCL_E
8730: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 RROR);. }.
8740: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
8750: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
8760: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
8770: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 chan);.. dpri
8780: 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 ntf("Calling Tls
8790: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 _WaitForConnect"
87a0: 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73 );. ret = Tls
87b0: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 _WaitForConnect(
87c0: 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20 statePtr, &err,
87d0: 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 1);. dprintf(
87e0: 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e "Tls_WaitForConn
87f0: 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69 ect returned: %i
8800: 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 ", ret);.. if
8810: 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 28 73 (ret < 0 && ((s
8820: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
8830: 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 TLS_TCL_ASYNC)
8840: 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49 && (err == EAGAI
8850: 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 N))) {..dprintf(
8860: 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 "Async set and e
8870: 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 rr = EAGAIN");..
8880: 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 ret = 0;. } e
8890: 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 30 29 lse if (ret < 0)
88a0: 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 73 74 61 {..errStr = sta
88b0: 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c tePtr->err;..Tcl
88c0: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 _ResetResult(int
88d0: 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 erp);..Tcl_SetEr
88e0: 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 rno(err);...if (
88f0: 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 !errStr || (*err
8900: 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 Str == 0)) {..
8910: 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 errStr = Tcl_P
8920: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 osixError(interp
8930: 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 );..}...Tcl_Appe
8940: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
8950: 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c "handshake fail
8960: 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 28 ed: ", errStr, (
8970: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
8980: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
8990: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
89a0: 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 "HANDSHAKE", "FA
89b0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
89c0: 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 NULL);..dprintf(
89d0: 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 "Returning TCL_E
89e0: 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 RROR with handsh
89f0: 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c ake failed: %s",
8a00: 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 errStr);..retur
8a10: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
8a20: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 } else {..if (
8a30: 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 err != 0) {..
8a40: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e dprintf("Got an
8a50: 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f error with a co
8a60: 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b mpleted handshak
8a70: 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 e: err = %i", er
8a80: 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b r);..}..ret = 1;
8a90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 . }.. dpri
8aa0: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 ntf("Returning T
8ab0: 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 CL_OK with data
8ac0: 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 \"%i\"", ret);.
8ad0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
8ae0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
8af0: 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b NewIntObj(ret));
8b00: 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f . return(TCL_
8b10: 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 OK);..clientData
8b20: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d = clientData;.}
8b30: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
8b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
8b80: 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d ImportObjCmd --
8b90: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
8ba0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
8bb0: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 to process the
8bc0: 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a "ssl" command. *
8bd0: 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d . *.The ssl comm
8be0: 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f and pushes SSL o
8bf0: 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e ver a (newly con
8c00: 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b nected) tcp sock
8c10: 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 et. *. * Results
8c20: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
8c30: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
8c40: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
8c50: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 *.May modify th
8c60: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e e behavior of an
8c70: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a IO channel.. *.
8c80: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
8c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8cc0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
8cd0: 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d int.ImportObjCm
8ce0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
8cf0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
8d00: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
8d10: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
8d20: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
8d30: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
8d40: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 chan;../* The ch
8d50: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
8d60: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 ode on. */. S
8d70: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 tate *statePtr;.
8d80: 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 ./* client state
8d90: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 for ssl socket
8da0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a */. SSL_CTX *
8db0: 63 74 78 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ctx. = NU
8dc0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 LL;. Tcl_Obj
8dd0: 2a 73 63 72 69 70 74 09 20 20 20 20 20 20 20 20 *script.
8de0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
8df0: 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 20 Obj *password.
8e00: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
8e10: 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 Tcl_Obj *vcmd.
8e20: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
8e30: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
8e40: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
8e50: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 slation, upperCh
8e60: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 annelBlocking, u
8e70: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
8e80: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ing, upperChanne
8e90: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e lEOFChar;. in
8ea0: 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 t idx, len;.
8eb0: 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20 20 int flags..
8ec0: 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 = TLS_TCL_INI
8ed0: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 T;. int serve
8ee0: 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b 09 r.. = 0;.
8ef0: 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e /* is connection
8f00: 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 incoming or out
8f10: 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 going? */. ch
8f20: 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 20 ar *keyfile.
8f30: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
8f40: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 20 char *certfile.
8f50: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
8f60: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
8f70: 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a *key .= NULL;.
8f80: 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 int key_len
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8fa0: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 = 0;. unsigne
8fb0: 64 20 63 68 61 72 20 2a 63 65 72 74 20 20 20 20 d char *cert
8fc0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
8fd0: 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 20 20 20 int cert_len
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 = 0
8ff0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ;. char *ciph
9000: 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ers. = NU
9010: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 LL;. char *ci
9020: 70 68 65 72 73 75 69 74 65 73 09 20 20 20 20 20 phersuites.
9030: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 = NULL;. c
9040: 68 61 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20 har *CAfile.
9050: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
9060: 63 68 61 72 20 2a 43 41 64 69 72 09 09 20 20 20 char *CAdir..
9070: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
9080: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 char *DHparams.
9090: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
90a0: 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 char *model.
90b0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
90c0: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 . char *serve
90d0: 72 6e 61 6d 65 09 20 20 20 20 20 20 20 20 3d 20 rname. =
90e0: 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d NULL;./* hostnam
90f0: 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d e for Server Nam
9100: 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a e Indication */.
9110: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
9120: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
9130: 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 _id = NULL;.
9140: 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d Tcl_Obj *alpn..=
9150: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 NULL;. int s
9160: 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 sl2 = 0, ssl3 =
9170: 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 0;. int tls1
9180: 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c = 1, tls1_1 = 1,
9190: 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 tls1_2 = 1, tls
91a0: 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 1_3 = 1;. int
91b0: 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 proto = 0, leve
91c0: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 l = -1;. int
91d0: 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 verify = 0, requ
91e0: 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 ire = 0, request
91f0: 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 = 1, post_hands
9200: 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64 hake = 0;.. d
9210: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
9220: 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 ;..#if OPENSSL_V
9230: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
9240: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 0x10100000L && !
9250: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
9260: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 NO_SSL2) && !def
9270: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
9280: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 defined(NO_SSL3
9290: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f ) && defined(NO_
92a0: 54 4c 53 31 29 20 26 26 20 64 65 66 69 6e 65 64 TLS1) && defined
92b0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 (NO_TLS1_1) && d
92c0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
92d0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f ) && defined(NO_
92e0: 54 4c 53 31 5f 33 29 0a 20 20 20 20 73 73 6c 32 TLS1_3). ssl2
92f0: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 1;.#endif.#if
9300: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
9310: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 L_NO_SSL3) && !d
9320: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
9330: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 && defined(NO_SS
9340: 4c 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e L2) && defined(N
9350: 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66 69 6e O_TLS1) && defin
9360: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
9370: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
9380: 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e _2) && defined(N
9390: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 73 73 O_TLS1_3). ss
93a0: 6c 33 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 l3 = 1;.#endif.#
93b0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
93c0: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f S1) || defined(O
93d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a PENSSL_NO_TLS1).
93e0: 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 tls1 = 0;.#e
93f0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
9400: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 (NO_TLS1_1) || d
9410: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
9420: 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c O_TLS1_1). tl
9430: 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 s1_1 = 0;.#endif
9440: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
9450: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e TLS1_2) || defin
9460: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
9470: 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 S1_2). tls1_2
9480: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
9490: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
94a0: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _3) || defined(O
94b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
94c0: 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 ). tls1_3 = 0
94d0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 ;.#endif.. if
94e0: 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 (objc < 2) {..T
94f0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
9500: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
9510: 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f "channel ?optio
9520: 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 ns?");..return T
9530: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
9540: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
9550: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 rror();.. cha
9560: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
9570: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
9580: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
9590: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 objv[1], NULL),
95a0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
95b0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
95c0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
95d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
95e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
95f0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
9600: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
9610: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
9620: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
9630: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
9640: 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d .. for (idx =
9650: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 2; idx < objc;
9660: 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a idx++) {..char *
9670: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 opt = Tcl_GetStr
9680: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
9690: 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 idx], NULL);...i
96a0: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 f (opt[0] != '-'
96b0: 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ).. break;...
96c0: 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 OPTOBJ("-alpn",
96d0: 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 alpn);..OPTSTR("
96e0: 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 29 3b -cadir", CAdir);
96f0: 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c ..OPTSTR("-cafil
9700: 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 e", CAfile);..OP
9710: 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 TBYTE("-cert", c
9720: 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a ert, cert_len);.
9730: 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 69 .OPTSTR("-certfi
9740: 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a le", certfile);.
9750: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 .OPTSTR("-cipher
9760: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 ", ciphers);..OP
9770: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c TSTR("-ciphers",
9780: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 ciphers);..OPTS
9790: 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 65 TR("-ciphersuite
97a0: 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 s", ciphersuites
97b0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d );..OPTOBJ("-com
97c0: 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a mand", script);.
97d0: 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 61 .OPTSTR("-dhpara
97e0: 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a ms", DHparams);.
97f0: 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c .OPTBYTE("-key",
9800: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a key, key_len);.
9810: 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c .OPTSTR("-keyfil
9820: 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f e", keyfile);..O
9830: 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 PTSTR("-model",
9840: 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 model);..OPTOBJ(
9850: 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73 "-password", pas
9860: 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c sword);..OPTBOOL
9870: 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b ("-post_handshak
9880: 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 e", post_handsha
9890: 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d ke);..OPTBOOL("-
98a0: 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 73 request", reques
98b0: 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 t);..OPTBOOL("-r
98c0: 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 equire", require
98d0: 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 );..OPTINT("-sec
98e0: 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 6c 65 76 uritylevel", lev
98f0: 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d el);..OPTBOOL("-
9900: 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 72 29 server", server)
9910: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76 ;..OPTSTR("-serv
9920: 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e ername", servern
9930: 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ame);..OPTSTR("-
9940: 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 session_id", ses
9950: 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f sion_id);..OPTBO
9960: 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 OL("-ssl2", ssl2
9970: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 );..OPTBOOL("-ss
9980: 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 l3", ssl3);..OPT
9990: 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c BOOL("-tls1", tl
99a0: 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d s1);..OPTBOOL("-
99b0: 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 tls1.1", tls1_1)
99c0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
99d0: 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 1.2", tls1_2);..
99e0: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 OPTBOOL("-tls1.3
99f0: 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 ", tls1_3);..OPT
9a00: 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 6f OBJ("-validateco
9a10: 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 mmand", vcmd);..
9a20: 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 OPTOBJ("-vcmd",
9a30: 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 vcmd);...OPTBAD(
9a40: 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e "option", "-alpn
9a50: 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c , -cadir, -cafil
9a60: 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 e, -cert, -certf
9a70: 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 ile, -cipher, -c
9a80: 69 70 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f iphersuites, -co
9a90: 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 mmand, -dhparams
9aa0: 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 , -key, -keyfile
9ab0: 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 , -model, -passw
9ac0: 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 ord, -post_hands
9ad0: 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 hake, -request,
9ae0: 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72 -require, -secur
9af0: 69 74 79 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 itylevel, -serve
9b00: 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 r, -servername,
9b10: 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 -session_id, -ss
9b20: 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 l2, -ssl3, -tls1
9b30: 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 , -tls1.1, -tls1
9b40: 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 .2, -tls1.3, or
9b50: 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 -validatecommand
9b60: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c ");...return TCL
9b70: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
9b80: 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09 09 if (request)..
9b90: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 verify |= SSL_VE
9ba0: 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 RIFY_CLIENT_ONCE
9bb0: 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 | SSL_VERIFY_PE
9bc0: 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 ER;. if (requ
9bd0: 65 73 74 20 26 26 20 72 65 71 75 69 72 65 29 09 est && require).
9be0: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 verify |= SSL_VE
9bf0: 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f RIFY_FAIL_IF_NO_
9c00: 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 PEER_CERT;. i
9c10: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f f (request && po
9c20: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 st_handshake).ve
9c30: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 rify |= SSL_VERI
9c40: 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b FY_POST_HANDSHAK
9c50: 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 E;. if (verif
9c60: 79 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20 y == 0)..verify
9c70: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e = SSL_VERIFY_NON
9c80: 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d E;.. proto |=
9c90: 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f (ssl2 ? TLS_PRO
9ca0: 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 TO_SSL2 : 0);.
9cb0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 proto |= (ssl3
9cc0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c ? TLS_PROTO_SSL
9cd0: 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 3 : 0);. prot
9ce0: 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 o |= (tls1 ? TLS
9cf0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 _PROTO_TLS1 : 0)
9d00: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
9d10: 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f tls1_1 ? TLS_PRO
9d20: 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a TO_TLS1_1 : 0);.
9d30: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
9d40: 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f s1_2 ? TLS_PROTO
9d50: 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 _TLS1_2 : 0);.
9d60: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
9d70: 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _3 ? TLS_PROTO_T
9d80: 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 LS1_3 : 0);..
9d90: 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c /* reset to NUL
9da0: 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e L if blank strin
9db0: 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 g provided */.
9dc0: 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a if (cert && !*
9dd0: 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63 cert).. c
9de0: 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ert. = NU
9df0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 LL;. if (key
9e00: 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 && !*key)..
9e10: 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d key. =
9e20: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
9e30: 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 ertfile && !*cer
9e40: 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 tfile) c
9e50: 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a ertfile.= NULL;.
9e60: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 if (keyfile
9e70: 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b && !*keyfile)..k
9e80: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d eyfile. =
9e90: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
9ea0: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 iphers && !*ciph
9eb0: 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70 ers). cip
9ec0: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e hers. = N
9ed0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 ULL;. if (cip
9ee0: 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 hersuites && !*c
9ef0: 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70 iphersuites) cip
9f00: 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e hersuites = N
9f10: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 ULL;. if (CAf
9f20: 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 ile && !*CAfile)
9f30: 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 . CAfile.
9f40: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
9f50: 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26 if (CAdir &&
9f60: 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 20 !*CAdir).
9f70: 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20 20 CAdir.
9f80: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
9f90: 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 DHparams && !*DH
9fa0: 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 params).
9fb0: 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 DHparams
9fc0: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 = NULL;.. /*
9fd0: 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f new SSL state */
9fe0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d . statePtr..=
9ff0: 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c (State *) ckall
a000: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 oc((unsigned) si
a010: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 zeof(State));.
a020: 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 memset(statePt
a030: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 r, 0, sizeof(Sta
a040: 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 te));.. state
a050: 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 Ptr->flags.= fla
a060: 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 gs;. statePtr
a070: 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 ->interp.= inter
a080: 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d p;. statePtr-
a090: 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 >vflags.= verify
a0a0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
a0b0: 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f err.= "";.. /
a0c0: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 * allocate scrip
a0d0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 t */. if (scr
a0e0: 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 ipt) {..(void) T
a0f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
a100: 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e Obj(script, &len
a110: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
a120: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 statePtr->ca
a130: 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b llback = script;
a140: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
a150: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
a160: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 >callback);..}.
a170: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
a180: 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a ocate password *
a190: 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f /. if (passwo
a1a0: 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 rd) {..(void) Tc
a1b0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
a1c0: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 bj(password, &le
a1d0: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
a1e0: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 . statePtr->p
a1f0: 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f assword = passwo
a200: 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 rd;.. Tcl_Inc
a210: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
a220: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 tr->password);..
a230: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
a240: 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 allocate validat
a250: 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 e command */.
a260: 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 if (vcmd) {..(v
a270: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 oid) Tcl_GetStri
a280: 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 ngFromObj(vcmd,
a290: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 &len);..if (len)
a2a0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 {.. statePtr
a2b0: 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 ->vcmd = vcmd;..
a2c0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
a2d0: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 ount(statePtr->v
a2e0: 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a cmd);..}. }..
a2f0: 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d if (model !=
a300: 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f NULL) {..int mo
a310: 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 de;../* Get the
a320: 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 "model" context
a330: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 */..chan = Tcl_G
a340: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
a350: 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b , model, &mode);
a360: 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 ..if (chan == (T
a370: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
a380: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 ) {.. Tls_Fre
a390: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
a3a0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
a3b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
a3c0: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 ../*.. * Make su
a3d0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
a3e0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
a3f0: 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 nnel.. */..chan
a400: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
a410: 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 nel(chan);..if (
a420: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
a430: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
a440: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
a450: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
a460: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
a470: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
a480: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
a490: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
a4a0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
a4b0: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 nel", NULL);..
a4c0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
a4d0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
a4e0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 , "IMPORT", "CHA
a4f0: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
a500: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
a510: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
a520: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
a530: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
a540: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 TCL_ERROR;..}..c
a550: 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 tx = ((State *)T
a560: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
a570: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 tanceData(chan))
a580: 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 ->ctx;. } els
a590: 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 e {..if ((ctx =
a5a0: 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 CTX_Init(statePt
a5b0: 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f r, server, proto
a5c0: 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66 , keyfile, certf
a5d0: 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 ile, key, cert,
a5e0: 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 63 65 key_len,.. ce
a5f0: 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43 rt_len, CAdir, C
a600: 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 Afile, ciphers,
a610: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 ciphersuites, le
a620: 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 vel, DHparams))
a630: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 == NULL) {..
a640: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
a650: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
a660: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
a670: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
a680: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 statePtr->ctx
a690: 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 = ctx;.. /*.
a6a0: 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f * We need to
a6b0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 make sure that
a6c0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b the channel work
a6d0: 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 s in binary (for
a6e0: 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 the. * encr
a6f0: 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 yption not to ge
a700: 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 t goofed up)..
a710: 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e * We only wan
a720: 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 t to adjust the
a730: 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 buffering in pre
a740: 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 -v2 channels, wh
a750: 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 ere. * each
a760: 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 channel in the s
a770: 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 tack maintained
a780: 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e its own buffers.
a790: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c . */. Tcl
a7a0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
a7b0: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
a7c0: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f ation);. Tcl_
a7d0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
a7e0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
a7f0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 g);. Tcl_DStr
a800: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
a810: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 annelEOFChar);.
a820: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
a830: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
a840: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 Encoding);. T
a850: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
a860: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
a870: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 , "-eofchar", &u
a880: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
a890: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ar);. Tcl_Get
a8a0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
a8b0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e terp, chan, "-en
a8c0: 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 coding", &upperC
a8d0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b hannelEncoding);
a8e0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
a8f0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
a900: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c , chan, "-transl
a910: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 ation", &upperCh
a920: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
a930: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
a940: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
a950: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 rp, chan, "-bloc
a960: 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 king", &upperCha
a970: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 nnelBlocking);.
a980: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
a990: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
a9a0: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 chan, "-translat
a9b0: 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b ion", "binary");
a9c0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
a9d0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
a9e0: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 , chan, "-blocki
a9f0: 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 ng", "true");.
aa00: 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 dprintf("Consu
aa10: 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c ming Tcl channel
aa20: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 %s", Tcl_GetCha
aa30: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b nnelName(chan));
aa40: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 . statePtr->s
aa50: 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 elf = Tcl_StackC
aa60: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
aa70: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
aa80: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 , (ClientData) s
aa90: 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52 45 tatePtr, (TCL_RE
aaa0: 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 ADABLE | TCL_WRI
aab0: 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 TABLE), chan);.
aac0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 61 dprintf("Crea
aad0: 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 ted channel name
aae0: 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 d %s", Tcl_GetCh
aaf0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
ab00: 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 tr->self));.
ab10: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 if (statePtr->se
ab20: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e lf == (Tcl_Chann
ab30: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a el) NULL) {../*.
ab40: 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 . * No use of Tc
ab50: 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 l_EventuallyFree
ab60: 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 because no poss
ab70: 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76 ible Tcl_Preserv
ab80: 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 e... */..Tls_Fre
ab90: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
aba0: 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 Ptr);..return TC
abb0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
abc0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
abd0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
abe0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
abf0: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c "-translation",
ac00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 Tcl_DStringValu
ac10: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 e(&upperChannelT
ac20: 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 ranslation));.
ac30: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
ac40: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 Option(interp, s
ac50: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 tatePtr->self, "
ac60: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f -encoding", Tcl_
ac70: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
ac80: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
ac90: 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ng));. Tcl_Se
aca0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
acb0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
acc0: 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 >self, "-eofchar
acd0: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 ", Tcl_DStringVa
ace0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 lue(&upperChanne
acf0: 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20 lEOFChar));.
ad00: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
ad10: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
ad20: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 tePtr->self, "-b
ad30: 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 locking", Tcl_DS
ad40: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 tringValue(&uppe
ad50: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
ad60: 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 ));.. /*.
ad70: 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a * SSL Initializ
ad80: 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 ation. */.
ad90: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 statePtr->ssl
ada0: 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 = SSL_new(stateP
adb0: 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 tr->ctx);. if
adc0: 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c (!statePtr->ssl
add0: 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 ) {../* SSL libr
ade0: 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 ary error */..Tc
adf0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
ae00: 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 nterp, "couldn't
ae10: 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 construct ssl s
ae20: 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f ession: ", REASO
ae30: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
ae40: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
ae50: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
ae60: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
ae70: 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 T", "INIT", "FAI
ae80: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
ae90: 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 ULL);..Tls_Free(
aea0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
aeb0: 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f r);..return TCL_
aec0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
aed0: 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65 /* Set host se
aee0: 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 rver name */.
aef0: 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29 if (servername)
af00: 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 20 {../* Sets the
af10: 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 server name indi
af20: 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 cation (SNI) in
af30: 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 ClientHello exte
af40: 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 nsion */../* Per
af50: 20 52 46 43 20 36 30 36 36 2c 20 68 6f 73 74 6e RFC 6066, hostn
af60: 61 6d 65 20 69 73 20 61 20 41 53 43 49 49 20 65 ame is a ASCII e
af70: 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2e 20 2a ncoded string. *
af80: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f /..if (!SSL_set_
af90: 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 tlsext_host_name
afa0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
afb0: 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 servername) && r
afc0: 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 equire) {.. T
afd0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
afe0: 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 interp, "setting
aff0: 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 TLS host name e
b000: 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 xtension failed"
b010: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b020: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
b030: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
b040: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
b050: 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 "SNI", "FAILED"
b060: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b070: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
b080: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
b090: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
b0a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
b0b0: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 73 65 72 /* Configure ser
b0c0: 76 65 72 20 68 6f 73 74 20 6e 61 6d 65 20 63 68 ver host name ch
b0d0: 65 63 6b 73 20 69 6e 20 74 68 65 20 53 53 4c 20 ecks in the SSL
b0e0: 63 6c 69 65 6e 74 2e 20 53 65 74 20 44 4e 53 20 client. Set DNS
b0f0: 68 6f 73 74 6e 61 6d 65 20 74 6f 0a 09 20 20 20 hostname to..
b100: 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 name for peer ce
b110: 72 74 69 66 69 63 61 74 65 20 63 68 65 63 6b 73 rtificate checks
b120: 2e 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 . SSL_set1_host
b130: 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e has limitations.
b140: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 */..if (!SSL_ad
b150: 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 d1_host(statePtr
b160: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d ->ssl, servernam
b170: 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 e)) {.. Tcl_A
b180: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
b190: 72 70 2c 20 22 73 65 74 74 69 6e 67 20 44 4e 53 rp, "setting DNS
b1a0: 20 68 6f 73 74 20 6e 61 6d 65 20 66 61 69 6c 65 host name faile
b1b0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
b1c0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
b1d0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
b1e0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
b1f0: 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 ", "HOSTNAME", "
b200: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
b210: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c ) NULL);.. Tl
b220: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
b230: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
b240: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
b250: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
b260: 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f /* Resume sessio
b270: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 n id */. if (
b280: 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 session_id && st
b290: 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 rlen(session_id)
b2a0: 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f <= SSL_MAX_SID_
b2b0: 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f CTX_LENGTH) {../
b2c0: 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f * SSL_set_sessio
b2d0: 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c n() */..if (!SSL
b2e0: 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 _SESSION_set1_id
b2f0: 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 _context(SSL_get
b300: 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 _session(statePt
b310: 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e r->ssl), session
b320: 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 _id, (unsigned i
b330: 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 nt) strlen(sessi
b340: 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 on_id))) {..
b350: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
b360: 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 (interp, "Resume
b370: 20 73 65 73 73 69 6f 6e 20 69 64 20 22 2c 20 73 session id ", s
b380: 65 73 73 69 6f 6e 5f 69 64 2c 20 22 20 66 61 69 ession_id, " fai
b390: 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e led", (char *) N
b3a0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
b3b0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
b3c0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
b3d0: 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 RT", "SESSION",
b3e0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
b3f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 *) NULL);.
b400: 20 20 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 Tls_Free((
b410: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
b420: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 );. r
b430: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
b440: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 ..}. }.. i
b450: 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 f (alpn) {../* C
b460: 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 onvert a TCL lis
b470: 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f t into a protoco
b480: 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 l-list in wire-f
b490: 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e ormat */..unsign
b4a0: 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c ed char *protos,
b4b0: 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 *p;..unsigned i
b4c0: 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 nt protos_len =
b4d0: 30 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 6e 2c 20 0;..int i, len,
b4e0: 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a cnt;..Tcl_Obj **
b4f0: 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f list;...if (Tcl_
b500: 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e ListObjGetElemen
b510: 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c ts(interp, alpn,
b520: 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d &cnt, &list) !=
b530: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 TCL_OK) {..
b540: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
b550: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
b560: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
b570: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 OR;..}.../* Dete
b580: 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 rmine the memory
b590: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 required for th
b5a0: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 e protocol-list
b5b0: 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 */..for (i = 0;
b5c0: 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a i < cnt; i++) {.
b5d0: 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 . Tcl_GetStri
b5e0: 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 ngFromObj(list[i
b5f0: 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 ], &len);.. i
b600: 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a f (len > 255) {.
b610: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
b620: 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e lt(interp, "ALPN
b630: 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 protocol name t
b640: 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 oo long", (char
b650: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f *) NULL);...Tcl_
b660: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
b670: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
b680: 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 ORT", "ALPN", "F
b690: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
b6a0: 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 NULL);...Tls_Fr
b6b0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
b6c0: 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 ePtr);...return
b6d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
b6e0: 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 }.. protos_le
b6f0: 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e 3b 0a 09 7d n += 1 + len;..}
b700: 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 .../* Build the
b710: 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f complete protoco
b720: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f l-list */..proto
b730: 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 s = ckalloc(prot
b740: 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f os_len);../* pro
b750: 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 tocol-lists cons
b760: 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e ist of 8-bit len
b770: 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79 gth-prefixed, by
b780: 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 te strings */..f
b790: 6f 72 20 28 69 20 3d 20 30 2c 20 70 20 3d 20 70 or (i = 0, p = p
b7a0: 72 6f 74 6f 73 3b 20 69 20 3c 20 63 6e 74 3b 20 rotos; i < cnt;
b7b0: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 i++) {.. char
b7c0: 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 *str = Tcl_GetS
b7d0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 tringFromObj(lis
b7e0: 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 t[i], &len);..
b7f0: 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 20 *p++ = len;..
b800: 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 memcpy(p, str
b810: 2c 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b , len);.. p +
b820: 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 = len;..}.../* S
b830: 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 SL_set_alpn_prot
b840: 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 os makes a copy
b850: 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d of the protocol-
b860: 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 list */../* Note
b870: 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 : This functions
b880: 20 72 65 76 65 72 73 65 73 20 74 68 65 20 72 65 reverses the re
b890: 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 turn value conve
b8a0: 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 ntion */..if (SS
b8b0: 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f L_set_alpn_proto
b8c0: 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c s(statePtr->ssl,
b8d0: 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f protos, protos_
b8e0: 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c len)) {.. Tcl
b8f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
b900: 74 65 72 70 2c 20 22 66 61 69 6c 65 64 20 74 6f terp, "failed to
b910: 20 73 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 set ALPN protoc
b920: 6f 6c 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ols", (char *) N
b930: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
b940: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
b950: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
b960: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 RT", "ALPN", "FA
b970: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
b980: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
b990: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
b9a0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b atePtr);.. ck
b9b0: 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 free(protos);..
b9c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
b9d0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f ROR;..}.../* Sto
b9e0: 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 re protocols lis
b9f0: 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e t */..statePtr->
ba00: 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b protos = protos;
ba10: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
ba20: 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f os_len = protos_
ba30: 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 len;. } else
ba40: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f {..statePtr->pro
ba50: 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 tos = NULL;..sta
ba60: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 tePtr->protos_le
ba70: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 n = 0;. }..
ba80: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 /*. * SSL
ba90: 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a Callbacks. *
baa0: 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 /. SSL_set_ap
bab0: 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d p_data(statePtr-
bac0: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 >ssl, (void *)st
bad0: 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e atePtr);./* poin
bae0: 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a t back to us */.
baf0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 SSL_set_veri
bb00: 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c fy(statePtr->ssl
bb10: 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 , verify, Verify
bb20: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 Callback);. S
bb30: 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c SL_set_info_call
bb40: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 back(statePtr->s
bb50: 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b sl, InfoCallback
bb60: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 );.. /* Callb
bb70: 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e ack for observin
bb80: 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 g protocol messa
bb90: 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f ges */.#ifndef O
bba0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 PENSSL_NO_SSL_TR
bbb0: 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 ACE. /* void
bbc0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f SSL_CTX_set_msg_
bbd0: 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 callback_arg(sta
bbe0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 tePtr->ctx, (voi
bbf0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 d *)statePtr);.
bc00: 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f void SSL_CTX_
bc10: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
bc20: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
bc30: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 MessageCallback)
bc40: 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 ; */. SSL_set
bc50: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 _msg_callback_ar
bc60: 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c g(statePtr->ssl,
bc70: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
bc80: 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f r);. SSL_set_
bc90: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 msg_callback(sta
bca0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 tePtr->ssl, Mess
bcb0: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 ageCallback);.#e
bcc0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 ndif.. /* Cre
bcd0: 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 ate Tcl_Channel
bce0: 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 BIO Handler */.
bcf0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 statePtr->p_b
bd00: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c io.= BIO_new_tcl
bd10: 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e (statePtr, BIO_N
bd20: 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 OCLOSE);. sta
bd30: 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f tePtr->bio.= BIO
bd40: 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 _new(BIO_f_ssl()
bd50: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 );.. if (serv
bd60: 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 er) {../* Server
bd70: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 callbacks */..S
bd80: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 SL_CTX_set_tlsex
bd90: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 t_servername_arg
bda0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
bdb0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
bdc0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
bdd0: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d tlsext_servernam
bde0: 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 e_callback(state
bdf0: 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c Ptr->ctx, SNICal
be00: 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 lback);..SSL_CTX
be10: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c _set_client_hell
be20: 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 o_cb(statePtr->c
be30: 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 tx, HelloCallbac
be40: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
be50: 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 Ptr);..if (state
be60: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e Ptr->protos != N
be70: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f ULL) {.. SSL_
be80: 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c CTX_set_alpn_sel
be90: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d ect_cb(statePtr-
bea0: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 >ctx, ALPNCallba
beb0: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
bec0: 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 ePtr);.#ifdef US
bed0: 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 E_NPN.. if (t
bee0: 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c ls1_2 == 0 && tl
bef0: 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 s1_3 == 0) {...S
bf00: 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f SL_CTX_set_next_
bf10: 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 protos_advertise
bf20: 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 d_cb(statePtr->c
bf30: 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c tx, NPNCallback,
bf40: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
bf50: 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 r);.. }.#endi
bf60: 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 f..}.../* Enable
bf70: 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 server to send
bf80: 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74 cert request aft
bf90: 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c er handshake (TL
bfa0: 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 S 1.3 only) */..
bfb0: 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 /* A write opera
bfc0: 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 tion must take p
bfd0: 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 lace for the Cer
bfe0: 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74 tificate Request
bff0: 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 to be.. sent
c000: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 to the client, t
c010: 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 his can be done
c020: 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 with SSL_do_hand
c030: 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 shake(). */..if
c040: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 (request && post
c050: 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 _handshake) {..
c060: 20 20 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c SSL_verify_cl
c070: 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 ient_post_handsh
c080: 61 6b 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ake(statePtr->ss
c090: 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 l);..}.../* Set
c0a0: 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 server mode */..
c0b0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
c0c0: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 |= TLS_TCL_SERVE
c0d0: 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 R;..SSL_set_acce
c0e0: 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 pt_state(statePt
c0f0: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 r->ssl);. } e
c100: 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 lse {../* Client
c110: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 callbacks */.#i
c120: 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 fdef USE_NPN..if
c130: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 (statePtr->prot
c140: 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c os != NULL && tl
c150: 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 s1_2 == 0 && tls
c160: 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 1_3 == 0) {..
c170: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 SSL_CTX_set_nex
c180: 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 t_proto_select_c
c190: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c b(statePtr->ctx,
c1a0: 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 ALPNCallback, (
c1b0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
c1c0: 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a ;..}.#endif.../*
c1d0: 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 Session caching
c1e0: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 */..SSL_CTX_set
c1f0: 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d _session_cache_m
c200: 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ode(statePtr->ct
c210: 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 x, SSL_SESS_CACH
c220: 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 E_CLIENT | SSL_S
c230: 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 ESS_CACHE_NO_INT
c240: 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 ERNAL_STORE);..S
c250: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f SL_CTX_sess_set_
c260: 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d new_cb(statePtr-
c270: 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c >ctx, SessionCal
c280: 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 lback);.../* Ena
c290: 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 ble post handsha
c2a0: 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f ke Authenticatio
c2b0: 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 n extension. TLS
c2c0: 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 1.3 only, not h
c2d0: 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 ttp/2. */..if (r
c2e0: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 equest && post_h
c2f0: 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 andshake) {..
c300: 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 SSL_set_post_ha
c310: 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 ndshake_auth(sta
c320: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a tePtr->ssl, 1);.
c330: 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 .}.../* Set clie
c340: 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f nt mode */..SSL_
c350: 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 set_connect_stat
c360: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
c370: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f ;. }. SSL_
c380: 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 set_bio(statePtr
c390: 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d ->ssl, statePtr-
c3a0: 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 >p_bio, statePtr
c3b0: 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 ->p_bio);. BI
c3c0: 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 O_set_ssl(stateP
c3d0: 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 tr->bio, statePt
c3e0: 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c r->ssl, BIO_NOCL
c3f0: 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 OSE);.. /*.
c400: 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 * End of SSL
c410: 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 Init. */.
c420: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e dprintf("Return
c430: 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 ing %s", Tcl_Get
c440: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
c450: 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 ePtr->self));.
c460: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 Tcl_SetResult(
c470: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 interp, (char *)
c480: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
c490: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
c4a0: 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c lf), TCL_VOLATIL
c4b0: 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 E);.. return
c4c0: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 TCL_OK;..clientD
c4d0: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
c4e0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
c4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
c530: 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a *. * UnimportObj
c540: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
c550: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
c560: 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 nvoked to remove
c570: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
c580: 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a nnel filter.. *.
c590: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
c5a0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
c5b0: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
c5c0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 effects:. *.May
c5d0: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 modify the beha
c5e0: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 vior of an IO ch
c5f0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d annel.. *. *----
c600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
c640: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 */.static int.U
c650: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c nimportObjCmd(Cl
c660: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
c670: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
c680: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
c690: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
c6a0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
c6b0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
c6c0: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
c6d0: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
c6e0: 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 on. */.. dpri
c6f0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
c700: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 if (objc !=
c710: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
c720: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
c730: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c , objv, "channel
c740: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
c750: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
c760: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
c770: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
c780: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
c790: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 jv[1]), NULL);.
c7a0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
c7b0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
c7c0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
c7d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
c7e0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
c7f0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
c800: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
c810: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
c820: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
c830: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 l(chan);.. if
c840: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
c850: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
c860: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
c870: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
c880: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
c890: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
c8a0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
c8b0: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 e(chan),..."\":
c8c0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
c8d0: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 l", NULL);..
c8e0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
c8f0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
c900: 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 "UNIMPORT", "CHA
c910: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
c920: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
c930: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
c940: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
c950: 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 if (Tcl_UnstackC
c960: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 hannel(interp, c
c970: 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f han) == TCL_ERRO
c980: 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c R) {..return TCL
c990: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
c9a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
c9b0: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
c9c0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
c9d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
c9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
ca20: 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 TX_Init -- const
ca30: 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 ruct a SSL_CTX i
ca40: 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 nstance. *. * Re
ca50: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 sults:. *.A vali
ca60: 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e d SSL_CTX instan
ca70: 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 ce or NULL.. *.
ca80: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
ca90: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 *.constructs SS
caa0: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a L context (CTX).
cab0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
cac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
caf0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
cb00: 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 tic SSL_CTX *.CT
cb10: 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 X_Init(State *st
cb20: 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 atePtr, int isSe
cb30: 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c rver, int proto,
cb40: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 char *keyfile,
cb50: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a char *certfile,.
cb60: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
cb70: 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 r *key, unsigned
cb80: 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 char *cert, int
cb90: 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 key_len, int ce
cba0: 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 rt_len, char *CA
cbb0: 64 69 72 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 dir,. char *C
cbc0: 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 Afile, char *cip
cbd0: 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68 hers, char *ciph
cbe0: 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 ersuites, int le
cbf0: 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72 vel, char *DHpar
cc00: 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 ams) {. Tcl_I
cc10: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 nterp *interp =
cc20: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
cc30: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 ;. SSL_CTX *c
cc40: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 tx = NULL;. T
cc50: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 cl_DString ds;.
cc60: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 Tcl_DString d
cc70: 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 s1;. int off
cc80: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 = 0;. int loa
cc90: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 d_private_key;.
cca0: 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 const SSL_MET
ccb0: 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 HOD *method;..
ccc0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
ccd0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 d");.. if (!p
cce0: 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 roto) {..Tcl_App
ccf0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
cd00: 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 , "no valid prot
cd10: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 ocol selected",
cd20: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
cd30: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
cd40: 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f /* create SSL co
cd50: 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 ntext */.#if OPE
cd60: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
cd70: 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 BER >= 0x1010000
cd80: 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 0L || defined(NO
cd90: 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL2) || define
cda0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
cdb0: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 2). if (ENABL
cdc0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
cdd0: 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 OTO_SSL2)) {..Tc
cde0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
cdf0: 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f nterp, "SSL2 pro
ce00: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
ce10: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ted", NULL);..re
ce20: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
ce30: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
ce40: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 ned(NO_SSL3) ||
ce50: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
ce60: 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 NO_SSL3). if
ce70: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
ce80: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 TLS_PROTO_SSL3))
ce90: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
cea0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 sult(interp, "SS
ceb0: 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 L3 protocol not
cec0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
ced0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
cee0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 . }.#endif.#i
cef0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
cf00: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
cf10: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 ENSSL_NO_TLS1).
cf20: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
cf30: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
cf40: 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 TLS1)) {..Tcl_Ap
cf50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
cf60: 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 p, "TLS 1.0 prot
cf70: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
cf80: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
cf90: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
cfa0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
cfb0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
cfc0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
cfd0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 _NO_TLS1_1).
cfe0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
cff0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
d000: 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 1_1)) {..Tcl_App
d010: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
d020: 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f , "TLS 1.1 proto
d030: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
d040: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 d", NULL);..retu
d050: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
d060: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
d070: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 d(NO_TLS1_2) ||
d080: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d090: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 NO_TLS1_2). i
d0a0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
d0b0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
d0c0: 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 _2)) {..Tcl_Appe
d0d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
d0e0: 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 "TLS 1.2 protoc
d0f0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
d100: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
d110: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
d120: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
d130: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 (NO_TLS1_3) || d
d140: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d150: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 O_TLS1_3). if
d160: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
d170: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
d180: 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 3)) {..Tcl_Appen
d190: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
d1a0: 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f "TLS 1.3 protoco
d1b0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
d1c0: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
d1d0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
d1e0: 64 69 66 0a 0a 20 20 20 20 73 77 69 74 63 68 20 dif.. switch
d1f0: 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 (proto) {.#if OP
d200: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
d210: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
d220: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
d230: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
d240: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
d250: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c SL2). case TL
d260: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d S_PROTO_SSL2:..m
d270: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
d280: 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 72 5f ? SSLv2_server_
d290: 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 method() : SSLv2
d2a0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
d2b0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
d2c0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
d2d0: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
d2e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
d2f0: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
d300: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f OPENSSL_NO_SSL3_
d310: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 METHOD). case
d320: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a TLS_PROTO_SSL3:
d330: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
d340: 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 ver ? SSLv3_serv
d350: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 er_method() : SS
d360: 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f Lv3_client_metho
d370: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
d380: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
d390: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 (NO_TLS1) && !de
d3a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d3b0: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
d3c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d3d0: 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 S1_METHOD). c
d3e0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
d3f0: 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 S1:..method = is
d400: 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 Server ? TLSv1_s
d410: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
d420: 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 TLSv1_client_me
d430: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
d440: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
d450: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 ned(NO_TLS1_1) &
d460: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d470: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 SL_NO_TLS1_1) &&
d480: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
d490: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 L_NO_TLS1_1_METH
d4a0: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 OD). case TLS
d4b0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 _PROTO_TLS1_1:..
d4c0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
d4d0: 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 r ? TLSv1_1_serv
d4e0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c er_method() : TL
d4f0: 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 Sv1_1_client_met
d500: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 hod();..break;.#
d510: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
d520: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 ed(NO_TLS1_2) &&
d530: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
d540: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 L_NO_TLS1_2) &&
d550: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
d560: 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f _NO_TLS1_2_METHO
d570: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
d580: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d PROTO_TLS1_2:..m
d590: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
d5a0: 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 ? TLSv1_2_serve
d5b0: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 r_method() : TLS
d5c0: 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 v1_2_client_meth
d5d0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
d5e0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
d5f0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 d(NO_TLS1_3) &&
d600: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
d610: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
d620: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
d630: 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 LS1_3:../* Use t
d640: 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f he generic metho
d650: 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 d and constraint
d660: 20 72 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e range after con
d670: 74 65 78 74 20 69 73 20 63 72 65 61 74 65 64 20 text is created
d680: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 */..method = isS
d690: 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 erver ? TLS_serv
d6a0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c er_method() : TL
d6b0: 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 S_client_method(
d6c0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
d6d0: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 f. default:..
d6e0: 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 /* Negotiate hig
d6f0: 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 hest available S
d700: 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a SL/TLS version *
d710: 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 /..method = isSe
d720: 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 rver ? TLS_serve
d730: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 r_method() : TLS
d740: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
d750: 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
d760: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
d770: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
d780: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
d790: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
d7a0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 SSL_NO_SSL2)..of
d7b0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
d7c0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 oto, TLS_PROTO_S
d7d0: 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c SL2) ? 0 : SSL
d7e0: 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 _OP_NO_SSLv2);.#
d7f0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
d800: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 ed(NO_SSL3) && !
d810: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d820: 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d NO_SSL3)..off |=
d830: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
d840: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 TLS_PROTO_SSL3)
d850: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f ? 0 : SSL_OP_
d860: 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 NO_SSLv3);.#endi
d870: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
d880: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
d890: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d8a0: 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e LS1)..off |= (EN
d8b0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
d8c0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f _PROTO_TLS1) ?
d8d0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
d8e0: 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 LSv1);.#endif.#i
d8f0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
d900: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
d910: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d920: 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 1_1)..off |= (EN
d930: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
d940: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f _PROTO_TLS1_1) ?
d950: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
d960: 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a LSv1_1);.#endif.
d970: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
d980: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
d990: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d9a0: 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 LS1_2)..off |= (
d9b0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
d9c0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 LS_PROTO_TLS1_2)
d9d0: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
d9e0: 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 _TLSv1_2);.#endi
d9f0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
da00: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 O_TLS1_3) && !de
da10: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
da20: 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d _TLS1_3)..off |=
da30: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
da40: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
da50: 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 3) ? 0 : SSL_OP_
da60: 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e NO_TLSv1_3);.#en
da70: 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 dif..break;.
da80: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
da90: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 _error();.. c
daa0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
dab0: 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 (method);. if
dac0: 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 (!ctx) {..retur
dad0: 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a n(NULL);. }..
dae0: 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28 53 if (getenv(S
daf0: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b SLKEYLOGFILE)) {
db00: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 ..SSL_CTX_set_ke
db10: 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 ylog_callback(ct
db20: 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 x, KeyLogCallbac
db30: 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 k);. }..#if !
db40: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
db50: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
db60: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
db70: 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 ). if (proto
db80: 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 == TLS_PROTO_TLS
db90: 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 1_3) {..SSL_CTX_
dba0: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 set_min_proto_ve
dbb0: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f rsion(ctx, TLS1_
dbc0: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 3_VERSION);..SSL
dbd0: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f _CTX_set_max_pro
dbe0: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 to_version(ctx,
dbf0: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b TLS1_3_VERSION);
dc00: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 . }.#endif..
dc10: 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 /* Force ciph
dc20: 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 er selection ord
dc30: 65 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a er by server */.
dc40: 20 20 20 20 69 66 20 28 21 69 73 53 65 72 76 65 if (!isServe
dc50: 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 r) {..SSL_CTX_se
dc60: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 t_options(ctx, S
dc70: 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 SL_OP_CIPHER_SER
dc80: 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b VER_PREFERENCE);
dc90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53 53 4c 5f . }.. SSL_
dca0: 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 CTX_set_app_data
dcb0: 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 (ctx, (void*)int
dcc0: 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 erp);./* remembe
dcd0: 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 r the interprete
dce0: 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 r */. SSL_CTX
dcf0: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 _set_options(ctx
dd00: 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f , SSL_OP_ALL);./
dd10: 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f * all SSL bug wo
dd20: 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 rkarounds */.
dd30: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 SSL_CTX_set_opt
dd40: 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 ions(ctx, off);.
dd50: 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 ./* disable prot
dd60: 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f ocol versions */
dd70: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
dd80: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
dd90: 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 10101000L. SS
dda0: 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 L_CTX_set_mode(c
ddb0: 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 tx, SSL_MODE_AUT
ddc0: 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e O_RETRY);./* han
ddd0: 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b dle new handshak
dde0: 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 es in background
ddf0: 2e 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 . On by default
de00: 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 in OpenSSL 1.1.1
de10: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 . */.#endif.
de20: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 SSL_CTX_sess_set
de30: 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c _cache_size(ctx,
de40: 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 128);.. /* S
de50: 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 et user defined
de60: 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 ciphers, cipher
de70: 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 suites, and secu
de80: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 rity level */.
de90: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 if ((ciphers !
dea0: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f = NULL) && !SSL_
deb0: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c CTX_set_cipher_l
dec0: 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 ist(ctx, ciphers
ded0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
dee0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
def0: 53 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c Set ciphers fail
df00: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 ed: No valid cip
df10: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 hers", (char *)
df20: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f NULL);..SSL_CTX_
df30: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 free(ctx);..retu
df40: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 rn NULL;. }.
df50: 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75 if ((ciphersu
df60: 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 ites != NULL) &&
df70: 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 !SSL_CTX_set_ci
df80: 70 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 phersuites(ctx,
df90: 63 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b ciphersuites)) {
dfa0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
dfb0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 lt(interp, "Set
dfc0: 63 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61 cipher suites fa
dfd0: 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 iled: No valid c
dfe0: 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a iphers", (char *
dff0: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
e000: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
e010: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
e020: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 .. /* Set sec
e030: 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 urity level */.
e040: 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d if (level > -
e050: 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 1 && level < 6)
e060: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 {../* SSL_set_se
e070: 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a curity_level */.
e080: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 .SSL_CTX_set_sec
e090: 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c urity_level(ctx,
e0a0: 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a level);. }..
e0b0: 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 /* set some
e0c0: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 callbacks */.
e0d0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 SSL_CTX_set_def
e0e0: 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 ault_passwd_cb(c
e0f0: 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c tx, PasswordCall
e100: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 back);. SSL_C
e110: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 TX_set_default_p
e120: 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 asswd_cb_userdat
e130: 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 a(ctx, (void *)s
e140: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f tatePtr);.. /
e150: 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d * read a Diffie-
e160: 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 Hellman paramete
e170: 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 rs file, or use
e180: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 the built-in one
e190: 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 */.#ifdef OPENS
e1a0: 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 SL_NO_DH. if
e1b0: 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c (DHparams != NUL
e1c0: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
e1d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
e1e0: 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 DH parameter sup
e1f0: 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 port not availab
e200: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 le", (char *) NU
e210: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 LL);..SSL_CTX_fr
e220: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e ee(ctx);..return
e230: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c NULL;. }.#el
e240: 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 se. {..DH* dh
e250: 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 ;..if (DHparams
e260: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
e270: 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 BIO *bio;.. T
e280: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
e290: 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 ds);.. bio =
e2a0: 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e BIO_new_file(F2N
e2b0: 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c (DHparams, &ds),
e2c0: 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 "r");.. if (
e2d0: 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 !bio) {...Tcl_DS
e2e0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
e2f0: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
e300: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c lt(interp, "Coul
e310: 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 d not find DH pa
e320: 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 rameters file",
e330: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
e340: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
e350: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
e360: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 LL;.. }...
e370: 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 dh = PEM_read_b
e380: 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c io_DHparams(bio,
e390: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c NULL, NULL, NUL
e3a0: 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 L);.. BIO_fre
e3b0: 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c e(bio);.. Tcl
e3c0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
e3d0: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 );.. if (!dh)
e3e0: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 {...Tcl_AppendR
e3f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 esult(interp, "C
e400: 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 ould not read DH
e410: 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d parameters from
e420: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 file", (char *)
e430: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
e440: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
e450: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
e460: 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 }..} else {..
e470: 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50 61 72 dh = get_dhPar
e480: 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43 ams();..}..SSL_C
e490: 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 TX_set_tmp_dh(ct
e4a0: 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 x, dh);..DH_free
e4b0: 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 (dh);. }.#end
e4c0: 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f if.. /* set o
e4d0: 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a ur certificate *
e4e0: 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 /. load_priva
e4f0: 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 te_key = 0;.
e500: 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 if (certfile !=
e510: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 NULL) {..load_pr
e520: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a ivate_key = 1;..
e530: 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 .Tcl_DStringInit
e540: 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c (&ds);...if (SSL
e550: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 _CTX_use_certifi
e560: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 cate_file(ctx, F
e570: 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 2N(certfile, &ds
e580: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ), SSL_FILETYPE_
e590: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 PEM) <= 0) {..
e5a0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
e5b0: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c e(&ds);.. Tcl
e5c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e5d0: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
e5e0: 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 set certificate
e5f0: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c file ", certfil
e600: 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 e, ": ",....
e610: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
e620: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
e630: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
e640: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
e650: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c ULL;..}. } el
e660: 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e se if (cert != N
e670: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 ULL) {..load_pri
e680: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 vate_key = 1;..i
e690: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
e6a0: 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 ertificate_ASN1(
e6b0: 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 ctx, cert_len, c
e6c0: 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 ert) <= 0) {..
e6d0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
e6e0: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c e(&ds);.. Tcl
e6f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e700: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
e710: 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 set certificate
e720: 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 : ",.... REA
e730: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
e740: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
e750: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
e760: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
e770: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ..}. } else {
e780: 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 ..certfile = (ch
e790: 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 ar*)X509_get_def
e7a0: 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 ault_cert_file()
e7b0: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f ;...if (SSL_CTX_
e7c0: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f use_certificate_
e7d0: 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 file(ctx, certfi
e7e0: 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 le, SSL_FILETYPE
e7f0: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 _PEM) <= 0) {.#i
e800: 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 f 0.. Tcl_DSt
e810: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
e820: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
e830: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e sult(interp, "un
e840: 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 able to use defa
e850: 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20 ult certificate
e860: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 file ", certfile
e870: 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 , ": ",....
e880: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
e890: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
e8a0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
e8b0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
e8c0: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 LL;.#endif..}.
e8d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 }.. /* set
e8e0: 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 our private key
e8f0: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f */. if (load_
e900: 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 private_key) {..
e910: 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e if (keyfile == N
e920: 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 ULL && key == NU
e930: 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 LL) {.. keyfi
e940: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 le = certfile;..
e950: 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 }...if (keyfile
e960: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
e970: 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61 /* get the priva
e980: 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 te key associate
e990: 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74 d with this cert
e9a0: 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 ificate */..
e9b0: 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e if (keyfile == N
e9c0: 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 ULL) {...keyfile
e9d0: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 = certfile;..
e9e0: 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 }... if (SS
e9f0: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 L_CTX_use_Privat
ea00: 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 eKey_file(ctx, F
ea10: 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2N(keyfile, &ds)
ea20: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 , SSL_FILETYPE_P
ea30: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 EM) <= 0) {...Tc
ea40: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
ea50: 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 s);.../* flush t
ea60: 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 he passphrase wh
ea70: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 ich might be lef
ea80: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 t in the result
ea90: 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 */...Tcl_SetResu
eaa0: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c lt(interp, NULL,
eab0: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 TCL_STATIC);...
eac0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
ead0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
eae0: 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b to set public k
eaf0: 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 ey file ", keyfi
eb00: 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 le, " ",....
eb10: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 REASON(), (
eb20: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
eb30: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
eb40: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c x);...return NUL
eb50: 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 L;.. }.. T
eb60: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
eb70: 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 ds);...} else if
eb80: 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b (key != NULL) {
eb90: 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 .. if (SSL_CT
eba0: 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 X_use_PrivateKey
ebb0: 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 _ASN1(EVP_PKEY_R
ebc0: 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 SA, ctx, key,key
ebd0: 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 _len) <= 0) {...
ebe0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
ebf0: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 &ds);.../* flush
ec00: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 the passphrase
ec10: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c which might be l
ec20: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c eft in the resul
ec30: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 t */...Tcl_SetRe
ec40: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c sult(interp, NUL
ec50: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a L, TCL_STATIC);.
ec60: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
ec70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 lt(interp, "unab
ec80: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 le to set public
ec90: 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28 key: ", REASON(
eca0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
ecb0: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 );...SSL_CTX_fre
ecc0: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e e(ctx);...return
ecd0: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d NULL;.. }..}
ece0: 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 ../* Now we know
ecf0: 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 that a key and
ed00: 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 cert have been s
ed10: 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 et against.. * t
ed20: 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a he SSL context *
ed30: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f /..if (!SSL_CTX_
ed40: 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 check_private_ke
ed50: 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 y(ctx)) {.. T
ed60: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
ed70: 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 interp, "private
ed80: 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 key does not ma
ed90: 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 tch the certific
eda0: 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c ate public key",
edb0: 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a .... (char *
edc0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 ) NULL);.. SS
edd0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
ede0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
edf0: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 L;..}. }..
ee00: 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63 61 /* Set verifica
ee10: 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 tion CAs */.
ee20: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
ee30: 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 &ds);. Tcl_DS
ee40: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b tringInit(&ds1);
ee50: 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 . if (!SSL_CT
ee60: 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f X_load_verify_lo
ee70: 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e cations(ctx, F2N
ee80: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 (CAfile, &ds), F
ee90: 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29 29 2N(CAdir, &ds1))
eea0: 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 65 ||..!SSL_CTX_se
eeb0: 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 t_default_verify
eec0: 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a 23 _paths(ctx)) {.#
eed0: 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 6e if 0..Tcl_DStrin
eee0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63 6c gFree(&ds);..Tcl
eef0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
ef00: 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 75 1);../* Don't cu
ef10: 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66 20 rrently care if
ef20: 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 54 this fails */..T
ef30: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
ef40: 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65 66 interp, "SSL def
ef50: 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 74 68 ault verify path
ef60: 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 s: ", REASON(),
ef70: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
ef80: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
ef90: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c x);..return NULL
efa0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a ;.#endif. }..
efb0: 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 /* https://s
efc0: 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 ourceforge.net/p
efd0: 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f /tls/bugs/57/ */
efe0: 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f . /* XXX:TODO
eff0: 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 : Let the user s
f000: 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 upply values her
f010: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d e instead of som
f020: 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 ething that exis
f030: 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 ts on the filesy
f040: 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 stem */. if (
f050: 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 CAfile != NULL)
f060: 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 {..STACK_OF(X509
f070: 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 _NAME) *certName
f080: 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 s = SSL_load_cli
f090: 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 ent_CA_file(F2N(
f0a0: 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 CAfile, &ds));..
f0b0: 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d if (certNames !=
f0c0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 NULL) {.. SS
f0d0: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 L_CTX_set_client
f0e0: 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 _CA_list(ctx, ce
f0f0: 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 rtNames);..}.
f100: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 }.. Tcl_DStr
f110: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 ingFree(&ds);.
f120: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
f130: 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 e(&ds1);. ret
f140: 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a urn ctx;.}.../*.
f150: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
f160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f190: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 -----. *. * Stat
f1a0: 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 usObjCmd -- retu
f1b0: 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66 rn certificate f
f1c0: 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 or connected pee
f1d0: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
f1e0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
f1f0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
f200: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
f210: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
f220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f260: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
f270: 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c .StatusObjCmd(Cl
f280: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
f290: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
f2a0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
f2b0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
f2c0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
f2d0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
f2e0: 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b . X509 *peer;
f2f0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
f300: 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 jPtr;. Tcl_Ch
f310: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 annel chan;.
f320: 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d char *channelNam
f330: 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 e, *ciphers;.
f340: 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 int mode;. c
f350: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
f360: 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 ar *proto;. u
f370: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b nsigned int len;
f380: 0a 20 20 20 20 69 6e 74 20 6e 69 64 3b 0a 0a 20 . int nid;..
f390: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
f3a0: 65 64 22 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 ed");.. switc
f3b0: 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73 65 h (objc) {..case
f3c0: 20 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65 6c 2:.. channel
f3d0: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 Name = Tcl_GetSt
f3e0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
f3f0: 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 [1], NULL);..
f400: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 33 break;...case 3
f410: 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 72 63 :.. if (!strc
f420: 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 69 6e mp (Tcl_GetStrin
f430: 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c g (objv[1]), "-l
f440: 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 61 6e ocal")) {...chan
f450: 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 nelName = Tcl_Ge
f460: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
f470: 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 bjv[2], NULL);..
f480: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 .break;.. }..
f490: 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c /* else fall
f4a0: 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20 2a 2f 0a -through ... */.
f4b0: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e #if defined(__GN
f4c0: 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 74 74 UC__).. __att
f4d0: 72 69 62 75 74 65 5f 5f 28 28 66 61 6c 6c 74 68 ribute__((fallth
f4e0: 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64 69 66 0a rough));.#endif.
f4f0: 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 54 .default:.. T
f500: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
f510: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
f520: 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e "?-local? chann
f530: 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 el");.. retur
f540: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
f550: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
f560: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
f570: 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d terp, channelNam
f580: 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 e, &mode);. i
f590: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
f5a0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
f5b0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
f5c0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a OR;. }. /*
f5d0: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
f5e0: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
f5f0: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a most channel */.
f600: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
f610: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
f620: 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f n);. if (Tcl_
f630: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
f640: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
f650: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 nelType()) {..Tc
f660: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
f670: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
f680: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
f690: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
f6a0: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
f6b0: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
f6c0: 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 LL);..Tcl_SetErr
f6d0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
f6e0: 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 TLS", "STATUS",
f6f0: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 "CHANNEL", "INVA
f700: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LID", (char *) N
f710: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
f720: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
f730: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 statePtr = (S
f740: 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 tate *) Tcl_GetC
f750: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
f760: 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f ta(chan);.. /
f770: 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61 74 * Get certificat
f780: 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 e for peer or se
f790: 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 lf */. if (ob
f7a0: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 jc == 2) {..peer
f7b0: 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f = SSL_get_peer_
f7c0: 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 certificate(stat
f7d0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
f7e0: 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d } else {..peer =
f7f0: 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 SSL_get_certifi
f800: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 cate(statePtr->s
f810: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 sl);. }. i
f820: 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 f (peer) {..objP
f830: 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 tr = Tls_NewX509
f840: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 Obj(interp, peer
f850: 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 );..if (objc ==
f860: 32 29 20 7b 20 58 35 30 39 5f 66 72 65 65 28 70 2) { X509_free(p
f870: 65 65 72 29 3b 20 7d 0a 20 20 20 20 7d 20 65 6c eer); }. } el
f880: 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 se {..objPtr = T
f890: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
f8a0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 NULL);. }..
f8b0: 20 20 20 2f 2a 20 50 65 65 72 20 63 65 72 74 20 /* Peer cert
f8c0: 63 68 61 69 6e 20 28 63 6c 69 65 6e 74 20 6f 6e chain (client on
f8d0: 6c 79 29 20 2a 2f 0a 20 20 20 20 53 54 41 43 4b ly) */. STACK
f8e0: 5f 4f 46 28 58 35 30 39 29 2a 20 73 73 6c 5f 63 _OF(X509)* ssl_c
f8f0: 65 72 74 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 erts = SSL_get_p
f900: 65 65 72 5f 63 65 72 74 5f 63 68 61 69 6e 28 73 eer_cert_chain(s
f910: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
f920: 20 20 20 69 66 20 28 21 70 65 65 72 20 26 26 20 if (!peer &&
f930: 28 73 73 6c 5f 63 65 72 74 73 20 3d 3d 20 4e 55 (ssl_certs == NU
f940: 4c 4c 20 7c 7c 20 73 6b 5f 58 35 30 39 5f 6e 75 LL || sk_X509_nu
f950: 6d 28 73 73 6c 5f 63 65 72 74 73 29 20 3d 3d 20 m(ssl_certs) ==
f960: 30 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 0)) {..Tcl_SetEr
f970: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
f980: 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c "TLS", "STATUS",
f990: 20 22 43 45 52 54 49 46 49 43 41 54 45 22 2c 20 "CERTIFICATE",
f9a0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
f9b0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
f9c0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
f9d0: 20 50 65 65 72 20 6e 61 6d 65 20 66 72 6f 6d 20 Peer name from
f9e0: 63 65 72 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f cert */. Tcl_
f9f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
fa00: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
fa10: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
fa20: 6e 67 4f 62 6a 28 22 70 65 65 72 6e 61 6d 65 22 ngObj("peername"
fa30: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
fa40: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
fa50: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
fa60: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
fa70: 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 30 5f 70 ngObj(SSL_get0_p
fa80: 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 eername(statePtr
fa90: 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 ->ssl), -1));..
faa0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
fab0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
fac0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
fad0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 62 NewStringObj("sb
fae0: 69 74 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 its", -1));.
faf0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
fb00: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
fb10: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
fb20: 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 IntObj(SSL_get_c
fb30: 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 ipher_bits(state
fb40: 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 Ptr->ssl, NULL))
fb50: 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 );.. ciphers
fb60: 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 = (char*)SSL_get
fb70: 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 _cipher(statePtr
fb80: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 ->ssl);. if (
fb90: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c (ciphers != NULL
fba0: 29 20 26 26 20 28 73 74 72 63 6d 70 28 63 69 70 ) && (strcmp(cip
fbb0: 68 65 72 73 2c 20 22 28 4e 4f 4e 45 29 22 29 20 hers, "(NONE)")
fbc0: 21 3d 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 != 0)) {..Tcl_Li
fbd0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
fbe0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
fbf0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
fc00: 4f 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 Obj("cipher", -1
fc10: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
fc20: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
fc30: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
fc40: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 l_NewStringObj(c
fc50: 69 70 68 65 72 73 2c 20 2d 31 29 29 3b 0a 20 20 iphers, -1));.
fc60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 }.. /* Veri
fc70: 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 fy the X509 cert
fc80: 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 ificate presente
fc90: 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f d by the peer */
fca0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
fcb0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
fcc0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
fcd0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
fce0: 76 65 72 69 66 69 63 61 74 69 6f 6e 22 2c 20 2d verification", -
fcf0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
fd00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
fd10: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
fd20: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 ,..Tcl_NewString
fd30: 4f 62 6a 28 58 35 30 39 5f 76 65 72 69 66 79 5f Obj(X509_verify_
fd40: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e cert_error_strin
fd50: 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 g(SSL_get_verify
fd60: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 _result(statePtr
fd70: 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 29 3b 0a 0a ->ssl)), -1));..
fd80: 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 /* Report th
fd90: 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
fda0: 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
fdb0: 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 of the negotiati
fdc0: 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 on */. SSL_ge
fdd0: 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 t0_alpn_selected
fde0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
fdf0: 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 &proto, &len);.
fe00: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
fe10: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
fe20: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
fe30: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c NewStringObj("al
fe40: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 pn", -1));. T
fe50: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
fe60: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
fe70: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
fe80: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a tringObj((char *
fe90: 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 )proto, (int) le
fea0: 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 n));. Tcl_Lis
feb0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
fec0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
fed0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
fee0: 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d bj("protocol", -
fef0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
ff00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
ff10: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
ff20: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
ff30: 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 bj(SSL_get_versi
ff40: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c on(statePtr->ssl
ff50: 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a ), -1));.. /*
ff60: 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 Valid for non-R
ff70: 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 SA signature and
ff80: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 TLS 1.3 */.
ff90: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
ffa0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
ffb0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
ffc0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 67 6e 61 StringObj("signa
ffd0: 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 tureHashAlgorith
ffe0: 6d 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 m", -1));. if
fff0: 20 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 53 53 (objc == 2 ? SS
10000 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 L_get_peer_signa
10010 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 ture_nid(statePt
10020 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20 r->ssl, &nid) :
10030 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 SSL_get_signatur
10040 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
10050 73 73 6c 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54 ssl, &nid)) {..T
10060 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10070 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10080 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
10090 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 tringObj(OBJ_nid
100a0 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 2ln(nid), -1));.
100b0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
100c0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
100d0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
100e0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
100f0 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 ringObj("", -1))
10100 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
10110 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10120 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
10130 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10140 6e 67 4f 62 6a 28 22 73 69 67 6e 61 74 75 72 65 ngObj("signature
10150 5f 74 79 70 65 22 2c 20 2d 31 29 29 3b 0a 20 20 _type", -1));.
10160 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 20 if (objc == 2
10170 3f 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 ? SSL_get_peer_s
10180 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 ignature_type_ni
10190 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c d(statePtr->ssl,
101a0 20 26 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65 74 &nid) : SSL_get
101b0 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f _signature_type_
101c0 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
101d0 6c 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54 63 6c l, &nid)) {..Tcl
101e0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
101f0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
10200 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
10210 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c ingObj(OBJ_nid2l
10220 6e 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 20 20 n(nid), -1));.
10230 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f } else {..Tcl_
10240 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10250 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
10260 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10270 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a ngObj("", -1));.
10280 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 }.. Tcl_S
10290 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
102a0 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
102b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
102c0 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
102d0 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
102e0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
102f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10320 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e ------. *. * Con
10330 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d nectionInfoObjCm
10340 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e d -- return conn
10350 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d ection info from
10360 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 OpenSSL.. *. *
10370 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 Results:. *.A li
10380 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e st of connection
10390 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d info. *. *----
103a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
103e0 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 */..static int
103f0 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 ConnectionInfoOb
10400 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
10410 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
10420 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
10430 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
10440 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
10450 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e {. Tcl_Chann
10460 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 el chan;../* The
10470 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 channel to set
10480 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 a mode on. */.
10490 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
104a0 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 r;../* client st
104b0 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b ate for ssl sock
104c0 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 et */. Tcl_Ob
104d0 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 63 j *objPtr;. c
104e0 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 onst SSL *ssl;.
104f0 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 const SSL_CIP
10500 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 HER *cipher;.
10510 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 const SSL_SESSI
10520 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 ON *session;.
10530 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
10540 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 char *proto;.
10550 20 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20 long mode;..
10560 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 if (objc != 2)
10570 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
10580 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
10590 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b bjv, "channel");
105a0 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
105b0 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
105c0 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
105d0 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 annel(interp, Tc
105e0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
105f0 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c bj(objv[1], NULL
10600 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 ), NULL);. if
10610 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
10620 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
10630 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
10640 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f R);. }.. /
10650 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
10660 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
10670 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
10680 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
10690 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
106a0 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c an);. if (Tcl
106b0 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
106c0 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
106d0 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
106e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
106f0 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
10700 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
10710 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
10720 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f n),.. "\": no
10730 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 t a TLS channel"
10740 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 , NULL);..Tcl_Se
10750 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
10760 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 p, "TLS", "CONNE
10770 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c CTION", "CHANNEL
10780 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 ", "INVALID", (c
10790 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
107a0 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
107b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a ;. }.. obj
107c0 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
107d0 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a tObj(0, NULL);..
107e0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f /* Connectio
107f0 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 n info */. st
10800 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
10810 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c *)Tcl_GetChannel
10820 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
10830 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 n);. ssl = st
10840 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 atePtr->ssl;.
10850 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c if (ssl != NULL
10860 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 ) {../* connecti
10870 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 54 63 6c on state */..Tcl
10880 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
10890 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
108a0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
108b0 69 6e 67 4f 62 6a 28 22 73 74 61 74 65 22 2c 20 ingObj("state",
108c0 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
108d0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
108e0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
108f0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10900 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e (SSL_state_strin
10910 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 g_long(ssl), -1)
10920 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 );.../* Get SNI
10930 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65 72 requested server
10940 20 6e 61 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 name */..Tcl_Li
10950 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
10960 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
10970 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
10980 4f 62 6a 28 22 73 65 72 76 65 72 6e 61 6d 65 22 Obj("servername"
10990 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
109a0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
109b0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
109c0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
109d0 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 bj(SSL_get_serve
109e0 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 rname(ssl, TLSEX
109f0 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f T_NAMETYPE_host_
10a00 6e 61 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f name), -1));.../
10a10 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a * Get protocol *
10a20 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
10a30 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10a40 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
10a50 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 NewStringObj("pr
10a60 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 09 otocol", -1));..
10a70 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
10a80 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
10a90 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
10aa0 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 StringObj(SSL_ge
10ab0 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 t_version(ssl),
10ac0 2d 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 -1));.../* Reneg
10ad0 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 otiation allowed
10ae0 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
10af0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
10b00 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
10b10 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
10b20 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20 renegotiation",
10b30 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
10b40 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10b50 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10b60 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10b70 28 0a 09 20 20 20 20 53 53 4c 5f 67 65 74 5f 73 (.. SSL_get_s
10b80 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 ecure_renegotiat
10b90 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 ion_support(ssl)
10ba0 20 3f 20 22 73 75 70 70 6f 72 74 65 64 22 20 3a ? "supported" :
10bb0 20 22 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 "not supported"
10bc0 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 , -1));.../* Get
10bd0 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 security level
10be0 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
10bf0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
10c00 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
10c10 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
10c20 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 2d ecuritylevel", -
10c30 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
10c40 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10c50 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
10c60 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c cl_NewIntObj(SSL
10c70 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _get_security_le
10c80 76 65 6c 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a vel(ssl)));.../*
10c90 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f Session info */
10ca0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
10cb0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10cc0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
10cd0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 ewStringObj("ses
10ce0 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d 31 sion_reused", -1
10cf0 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
10d00 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
10d10 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
10d20 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 l_NewBooleanObj(
10d30 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 SSL_session_reus
10d40 65 64 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 ed(ssl)));.../*
10d50 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a Is server info *
10d60 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
10d70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10d80 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
10d90 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 73 NewStringObj("is
10da0 5f 73 65 72 76 65 72 22 2c 20 2d 31 29 29 3b 0a _server", -1));.
10db0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
10dc0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10dd0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
10de0 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f wBooleanObj(SSL_
10df0 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 29 is_server(ssl)))
10e00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
10e10 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 Cipher info */.
10e20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f cipher = SSL_
10e30 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 get_current_ciph
10e40 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 er(ssl);. if
10e50 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 (cipher != NULL)
10e60 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 {..char buf[BUF
10e70 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 SIZ] = {0};..int
10e80 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b bits, alg_bits;
10e90 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ...Tcl_ListObjAp
10ea0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10eb0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
10ec0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 NewStringObj("ci
10ed0 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 pher", -1));..Tc
10ee0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10ef0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
10f00 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
10f10 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 ringObj(SSL_CIPH
10f20 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 ER_get_name(ciph
10f30 65 72 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f er), -1));..Tcl_
10f40 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10f50 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
10f60 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10f70 6e 67 4f 62 6a 28 22 73 74 61 6e 64 61 72 64 5f ngObj("standard_
10f80 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 name", -1));..Tc
10f90 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10fa0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
10fb0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
10fc0 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 ringObj(SSL_CIPH
10fd0 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 ER_standard_name
10fe0 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a (cipher), -1));.
10ff0 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 ..bits = SSL_CIP
11000 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 HER_get_bits(cip
11010 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b her, &alg_bits);
11020 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
11030 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
11040 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
11050 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 62 69 74 ewStringObj("bit
11060 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c s", -1));..Tcl_L
11070 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
11080 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
11090 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
110a0 6a 28 62 69 74 73 29 29 3b 0a 09 54 63 6c 5f 4c j(bits));..Tcl_L
110b0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
110c0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
110d0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
110e0 67 4f 62 6a 28 22 73 65 63 72 65 74 5f 62 69 74 gObj("secret_bit
110f0 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c s", -1));..Tcl_L
11100 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
11110 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
11120 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
11130 6a 28 61 6c 67 5f 62 69 74 73 29 29 3b 0a 09 2f j(alg_bits));../
11140 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 * alg_bits is ac
11150 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 tual key secret
11160 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 bits. If use bit
11170 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c s and secret (al
11180 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 gorithm) bits di
11190 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 ffer,.. the re
111a0 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 st of the bits a
111b0 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 re fixed, i.e. f
111c0 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 or limited expor
111d0 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20 t ciphers (bits
111e0 3c 20 35 36 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 < 56) */..Tcl_Li
111f0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
11200 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
11210 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
11220 4f 62 6a 28 22 6d 69 6e 5f 76 65 72 73 69 6f 6e Obj("min_version
11230 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
11240 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
11250 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
11260 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
11270 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 Obj(SSL_CIPHER_g
11280 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 et_version(ciphe
11290 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 r), -1));.../* G
112a0 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 et OpenSSL-speci
112b0 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 fic ID, not IANA
112c0 20 49 44 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 ID */..Tcl_List
112d0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
112e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
112f0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
11300 6a 28 22 69 64 22 2c 20 2d 31 29 29 3b 0a 09 54 j("id", -1));..T
11310 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
11320 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
11330 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 objPtr, Tcl_NewI
11340 6e 74 4f 62 6a 28 28 69 6e 74 29 20 53 53 4c 5f ntObj((int) SSL_
11350 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 CIPHER_get_id(ci
11360 70 68 65 72 29 29 29 3b 0a 0a 09 69 66 20 28 53 pher)));...if (S
11370 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 SL_CIPHER_descri
11380 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 ption(cipher, bu
11390 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 f, sizeof(buf))
113a0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
113b0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
113c0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
113d0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
113e0 53 74 72 69 6e 67 4f 62 6a 28 22 64 65 73 63 72 StringObj("descr
113f0 69 70 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 iption", -1));..
11400 20 20 20 20 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 53 74 72 69 6e 67 4f 62 6a 28 62 75 _NewStringObj(bu
11440 66 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 f, -1));..}.
11450 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f }.. /* Sessio
11460 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 n info */. se
11470 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f ssion = SSL_get_
11480 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 session(ssl);.
11490 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d if (session !=
114a0 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 NULL) {..const
114b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 unsigned char *t
114c0 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c icket;..size_t l
114d0 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 en2;..unsigned i
114e0 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 nt ulen;..const
114f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 unsigned char *s
11500 65 73 73 69 6f 6e 5f 69 64 3b 0a 09 63 68 61 72 ession_id;..char
11510 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f buffer[SSL_MAX_
11520 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 MASTER_KEY_LENGT
11530 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 H];.../* Report
11540 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f the selected pro
11550 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c tocol as a resul
11560 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 t of the ALPN ne
11570 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 gotiation */..SS
11580 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 L_SESSION_get0_a
11590 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 lpn_selected(ses
115a0 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c sion, &proto, &l
115b0 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f en2);..Tcl_ListO
115c0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
115d0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
115e0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
115f0 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 ("alpn", -1));..
11600 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
11610 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
11620 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
11630 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 StringObj((char
11640 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c *)proto, (int) l
11650 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f en2));.../* Repo
11660 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 rt the selected
11670 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 protocol as a re
11680 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 sult of the NPN
11690 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 negotiation */.#
116a0 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 ifdef USE_NPN..S
116b0 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f SL_get0_next_pro
116c0 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 to_negotiated(ss
116d0 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e l, &proto, &ulen
116e0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
116f0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
11700 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
11710 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e _NewStringObj("n
11720 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f pn", -1));..Tcl_
11730 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
11740 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
11750 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
11760 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 ngObj((char *)pr
11770 6f 74 6f 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 oto, (int) ulen)
11780 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 );.#endif.../* R
11790 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e esumable session
117a0 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
117b0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
117c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
117d0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
117e0 72 65 73 75 6d 61 62 6c 65 22 2c 20 2d 31 29 29 resumable", -1))
117f0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
11800 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
11810 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
11820 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 53 45 NewIntObj(SSL_SE
11830 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 SSION_is_resumab
11840 6c 65 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a le(session)));..
11850 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 ./* Session star
11860 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 t time (seconds
11870 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a since epoch) */.
11880 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11890 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
118a0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
118b0 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 72 wStringObj("star
118c0 74 5f 74 69 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 t_time", -1));..
118d0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
118e0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
118f0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
11900 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 LongObj(SSL_SESS
11910 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 ION_get_time(ses
11920 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 54 69 sion)));.../* Ti
11930 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 meout value - SS
11940 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 L_CTX_get_timeou
11950 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a t (in seconds) *
11960 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
11970 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
11980 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
11990 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 NewStringObj("ti
119a0 6d 65 6f 75 74 22 2c 20 2d 31 29 29 3b 0a 09 54 meout", -1));..T
119b0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
119c0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
119d0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c objPtr, Tcl_NewL
119e0 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 ongObj(SSL_SESSI
119f0 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 ON_get_timeout(s
11a00 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 ession)));.../*
11a10 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c Session ticket l
11a20 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e ifetime hint (in
11a30 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 seconds) */..Tc
11a40 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
11a50 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
11a60 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
11a70 72 69 6e 67 4f 62 6a 28 22 6c 69 66 65 74 69 6d ringObj("lifetim
11a80 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c e", -1));..Tcl_L
11a90 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
11aa0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
11ab0 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f tr, Tcl_NewLongO
11ac0 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 bj(SSL_SESSION_g
11ad0 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 et_ticket_lifeti
11ae0 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 me_hint(session)
11af0 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e ));.../* Session
11b00 20 69 64 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f id */..session_
11b10 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e id = SSL_SESSION
11b20 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c _get_id(session,
11b30 20 26 75 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 &ulen);..Tcl_Li
11b40 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
11b50 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
11b60 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
11b70 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 69 64 22 Obj("session_id"
11b80 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
11b90 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
11ba0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
11bb0 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 , Tcl_NewByteArr
11bc0 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 ayObj(session_id
11bd0 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a , (int) ulen));.
11be0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 ../* Session tic
11bf0 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c ket - client onl
11c00 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f y */..SSL_SESSIO
11c10 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 N_get0_ticket(se
11c20 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
11c30 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 &len2);..Tcl_Lis
11c40 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
11c50 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
11c60 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
11c70 62 6a 28 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b bj("session_tick
11c80 65 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f et", -1));..Tcl_
11c90 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
11ca0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
11cb0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 Ptr, Tcl_NewByte
11cc0 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c ArrayObj(ticket,
11cd0 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a (int) len2));..
11ce0 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 ./* Ticket app d
11cf0 61 74 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 ata */..SSL_SESS
11d00 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f ION_get0_ticket_
11d10 61 70 70 64 61 74 61 28 73 65 73 73 69 6f 6e 2c appdata(session,
11d20 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 &ticket, &len2)
11d30 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
11d40 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
11d50 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
11d60 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 NewStringObj("ti
11d70 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 cket_app_data",
11d80 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
11d90 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
11da0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11db0 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 Tcl_NewByteArray
11dc0 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 Obj(ticket, (int
11dd0 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 47 ) len2));.../* G
11de0 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f et master key */
11df0 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 ..len2 = SSL_SES
11e00 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f SION_get_master_
11e10 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 key(session, buf
11e20 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 fer, SSL_MAX_MAS
11e30 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b TER_KEY_LENGTH);
11e40 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
11e50 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
11e60 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
11e70 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61 73 ewStringObj("mas
11e80 74 65 72 5f 6b 65 79 22 2c 20 2d 31 29 29 3b 0a ter_key", -1));.
11e90 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11ea0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11eb0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
11ec0 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 62 75 wByteArrayObj(bu
11ed0 66 66 65 72 2c 20 28 69 6e 74 29 20 6c 65 6e 32 ffer, (int) len2
11ee0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ));. }.. /
11ef0 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e * Compression in
11f00 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 fo */. if (ss
11f10 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 l != NULL) {.#if
11f20 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d def HAVE_SSL_COM
11f30 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 PRESSION..const
11f40 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d COMP_METHOD *com
11f50 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 p, *expn;..comp
11f60 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e = SSL_get_curren
11f70 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 t_compression(ss
11f80 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f l);..expn = SSL_
11f90 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 get_current_expa
11fa0 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 54 63 nsion(ssl);...Tc
11fb0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
11fc0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
11fd0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
11fe0 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 73 ringObj("compres
11ff0 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 sion", -1));..Tc
12000 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
12010 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
12020 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
12030 72 69 6e 67 4f 62 6a 28 63 6f 6d 70 20 3f 20 53 ringObj(comp ? S
12040 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 SL_COMP_get_name
12050 28 63 6f 6d 70 29 20 3a 20 22 4e 4f 4e 45 22 2c (comp) : "NONE",
12060 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
12070 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
12080 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12090 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
120a0 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d j("expansion", -
120b0 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
120c0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
120d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
120e0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
120f0 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f expn ? SSL_COMP_
12100 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a get_name(expn) :
12110 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 "NONE", -1));.#
12120 65 6c 73 65 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 else..Tcl_ListOb
12130 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
12140 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
12150 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
12160 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 2d "compression", -
12170 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
12180 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
12190 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
121a0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
121b0 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 54 "NONE", -1));..T
121c0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
121d0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
121e0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
121f0 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 tringObj("expans
12200 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ion", -1));..Tcl
12210 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
12220 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
12230 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
12240 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d ingObj("NONE", -
12250 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 1));.#endif.
12260 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 }.. /* Server
12270 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 6d 6f 64 info */. mod
12280 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f e = SSL_CTX_get_
12290 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f session_cache_mo
122a0 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 de(statePtr->ctx
122b0 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 );. if (mode
122c0 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
122d0 5f 4f 46 46 29 20 7b 0a 09 70 72 6f 74 6f 20 3d _OFF) {..proto =
122e0 20 22 6f 66 66 22 3b 0a 20 20 20 20 7d 20 65 6c "off";. } el
122f0 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
12300 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 L_SESS_CACHE_CLI
12310 45 4e 54 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 ENT) {..proto =
12320 22 63 6c 69 65 6e 74 22 3b 0a 20 20 20 20 7d 20 "client";. }
12330 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 else if (mode &
12340 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 SSL_SESS_CACHE_S
12350 45 52 56 45 52 29 20 7b 0a 09 70 72 6f 74 6f 20 ERVER) {..proto
12360 3d 20 22 73 65 72 76 65 72 22 3b 0a 20 20 20 20 = "server";.
12370 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 } else if (mode
12380 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
12390 5f 42 4f 54 48 29 20 7b 0a 09 70 72 6f 74 6f 20 _BOTH) {..proto
123a0 3d 20 22 62 6f 74 68 22 3b 0a 20 20 20 20 7d 20 = "both";. }
123b0 65 6c 73 65 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 else {..proto =
123c0 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d "unknown";. }
123d0 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
123e0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
123f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
12400 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
12410 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f session_cache_mo
12420 64 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 de", -1));. T
12430 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
12440 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
12450 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
12460 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 2c 20 tringObj(proto,
12470 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 -1));.. Tcl_S
12480 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
12490 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
124a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
124b0 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
124c0 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
124d0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
124e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
124f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12510 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 ------. *. * Ver
12520 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 sionObjCmd -- re
12530 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 turn version str
12540 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c ing from OpenSSL
12550 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
12560 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
12570 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
12580 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
12590 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
125a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
125b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
125c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
125d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
125e0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
125f0 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c VersionObjCmd(Cl
12600 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
12610 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
12620 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
12630 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
12640 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
12650 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
12660 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
12670 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 alled");.. ob
12680 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 jPtr = Tcl_NewSt
12690 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f ringObj(OPENSSL_
126a0 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 VERSION_TEXT, -1
126b0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 );. Tcl_SetOb
126c0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
126d0 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 objPtr);.. re
126e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
126f0 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
12700 74 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f tData;..objc = o
12710 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a bjc;..objv = obj
12720 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d v;.}.../*. *----
12730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
12770 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 *. * MiscObjCmd
12780 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 -- misc command
12790 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
127a0 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
127b0 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
127c0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
127d0 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
127e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
127f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12820 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
12830 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e MiscObjCmd(Clien
12840 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
12850 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
12860 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
12870 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
12880 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 bjv[]) {. sta
12890 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tic const char *
128a0 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 commands [] = {
128b0 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c "req", "strreq",
128c0 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 NULL };. enu
128d0 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 m command { C_RE
128e0 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 Q, C_STRREQ, C_D
128f0 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 UMMY };. int
12900 63 6d 64 2c 20 69 73 53 74 72 3b 0a 20 20 20 20 cmd, isStr;.
12910 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 char buffer[1638
12920 34 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 4];.. dprintf
12930 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
12940 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b if (objc < 2) {
12950 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
12960 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
12970 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 jv, "subcommand
12980 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 ?args?");..retur
12990 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
129a0 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 }. if (Tcl_G
129b0 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 etIndexFromObj(i
129c0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 nterp, objv[1],
129d0 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 commands, "comma
129e0 6e 64 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 nd", 0,&cmd) !=
129f0 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 TCL_OK) {..retur
12a00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
12a10 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 }.. ERR_clea
12a20 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 r_error();..
12a30 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 isStr = (cmd ==
12a40 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 C_STRREQ);. s
12a50 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d witch ((enum com
12a60 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 mand) cmd) {..ca
12a70 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 se C_REQ:..case
12a80 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 C_STRREQ: {..
12a90 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d EVP_PKEY *pkey=
12aa0 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 NULL;.. X509
12ab0 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 *cert=NULL;..
12ac0 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 X509_NAME *name
12ad0 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f =NULL;.. Tcl_
12ae0 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 Obj **listv;..
12af0 20 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a 0a int listc,i;..
12b00 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 . BIO *out=NU
12b10 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a LL;... char *
12b20 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c k_C="",*k_ST="",
12b30 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c *k_L="",*k_O="",
12b40 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 *k_OU="",*k_CN="
12b50 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 ",*k_Email="";..
12b60 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 char *keyout
12b70 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 ,*pemout,*str;..
12b80 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c int keysize,
12b90 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 serial=0,days=36
12ba0 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 5;..#if OPENSSL_
12bb0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
12bc0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 0x30000000L..
12bd0 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 BIGNUM *bne =
12be0 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a NULL;.. RSA *
12bf0 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 rsa = NULL;.#els
12c00 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f e.. EVP_PKEY_
12c10 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b CTX *ctx = NULL;
12c20 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 .#endif... if
12c30 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f ((objc<5) || (o
12c40 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f bjc>6)) {...Tcl_
12c50 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
12c60 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b erp, 2, objv, "k
12c70 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 eysize keyfile c
12c80 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 ertfile ?info?")
12c90 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
12ca0 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 RROR;.. }...
12cb0 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
12cc0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c tFromObj(interp,
12cd0 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 objv[2], &keysi
12ce0 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ze) != TCL_OK) {
12cf0 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
12d00 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 ROR;.. }..
12d10 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 keyout=Tcl_GetS
12d20 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a tring(objv[3]);.
12d30 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f . pemout=Tcl_
12d40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 GetString(objv[4
12d50 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 ]);.. if (isS
12d60 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 tr) {...Tcl_SetV
12d70 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 ar(interp,keyout
12d80 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 ,"",0);...Tcl_Se
12d90 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f tVar(interp,pemo
12da0 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d ut,"",0);.. }
12db0 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e ... if (objc>
12dc0 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f =6) {...if (Tcl_
12dd0 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e ListObjGetElemen
12de0 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b ts(interp, objv[
12df0 35 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 26 5],....&listc, &
12e00 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b listv) != TCL_OK
12e10 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e ) {... return
12e20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a TCL_ERROR;...}.
12e30 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 ...if ((listc%2)
12e40 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 != 0) {... T
12e50 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
12e60 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e erp,"Information
12e70 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 list must have
12e80 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 even number of a
12e90 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b rguments",NULL);
12ea0 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
12eb0 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 L_ERROR;...}...f
12ec0 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 or (i=0; i<listc
12ed0 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 ; i+=2) {...
12ee0 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e str=Tcl_GetStrin
12ef0 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 g(listv[i]);...
12f00 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 if (strcmp(st
12f10 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a r,"days")==0) {.
12f20 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e ...if (Tcl_GetIn
12f30 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c tFromObj(interp,
12f40 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 listv[i+1],&days
12f50 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 )!=TCL_OK)....
12f60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
12f70 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 OR;... } else
12f80 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
12f90 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a "serial")==0) {.
12fa0 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e ...if (Tcl_GetIn
12fb0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c tFromObj(interp,
12fc0 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 listv[i+1],&seri
12fd0 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 al)!=TCL_OK)....
12fe0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
12ff0 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c RROR;... } el
13000 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
13010 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 r,"C")==0) {....
13020 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e k_C=Tcl_GetStrin
13030 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
13040 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
13050 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 strcmp(str,"ST")
13060 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 ==0) {....k_ST=T
13070 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
13080 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
13090 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
130a0 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b p(str,"L")==0) {
130b0 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 ....k_L=Tcl_GetS
130c0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
130d0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
130e0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
130f0 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f O")==0) {....k_O
13100 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
13110 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
13120 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
13130 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 cmp(str,"OU")==0
13140 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f ) {....k_OU=Tcl_
13150 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
13160 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
13170 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
13180 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 tr,"CN")==0) {..
13190 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 ..k_CN=Tcl_GetSt
131a0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
131b0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
131c0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 f (strcmp(str,"E
131d0 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 mail")==0) {....
131e0 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 k_Email=Tcl_GetS
131f0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
13200 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
13210 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 {....Tcl_SetResu
13220 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f lt(interp,"Unkno
13230 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 wn parameter",NU
13240 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 LL);....return T
13250 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 CL_ERROR;...
13260 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 }...}.. }..#i
13270 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
13280 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
13290 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 00000L.. bne
132a0 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 = BN_new();..
132b0 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 rsa = RSA_new()
132c0 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 ;.. pkey = EV
132d0 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 P_PKEY_new();..
132e0 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 if (bne == NU
132f0 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c LL || rsa == NUL
13300 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c L || pkey == NUL
13310 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 L || !BN_set_wor
13320 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c d(bne,RSA_F4) ||
13330 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 ...!RSA_generate
13340 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 _key_ex(rsa, key
13350 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 size, bne, NULL)
13360 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 || !EVP_PKEY_as
13370 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 sign_RSA(pkey, r
13380 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 sa)) {...EVP_PKE
13390 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 Y_free(pkey);...
133a0 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 /* RSA_free(rsa)
133b0 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 ; freed by EVP_P
133c0 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e KEY_free */...BN
133d0 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 _free(bne);.#els
133e0 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 e.. pkey = EV
133f0 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 P_RSA_gen((unsig
13400 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 ned int) keysize
13410 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 );.. ctx = EV
13420 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 P_PKEY_CTX_new(p
13430 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 key,NULL);..
13440 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c if (pkey == NULL
13450 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 || ctx == NULL
13460 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 || !EVP_PKEY_key
13470 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c gen_init(ctx) ||
13480 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 ...!EVP_PKEY_CTX
13490 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f _set_rsa_keygen_
134a0 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a bits(ctx, keysiz
134b0 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f e) || !EVP_PKEY_
134c0 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 keygen(ctx, &pke
134d0 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 y)) {...EVP_PKEY
134e0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 _free(pkey);...E
134f0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 VP_PKEY_CTX_free
13500 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 (ctx);.#endif...
13510 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
13520 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 terp,"Error gene
13530 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b rating private k
13540 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 ey",NULL);...ret
13550 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
13560 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 } else {...i
13570 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 f (isStr) {...
13580 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
13590 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 O_s_mem());...
135a0 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
135b0 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 PrivateKey(out,p
135c0 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c key,NULL,NULL,0,
135d0 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 NULL,NULL);...
135e0 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 i=BIO_read(out
135f0 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 ,buffer,sizeof(b
13600 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 uffer)-1);...
13610 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 i=(i<0) ? 0 : i
13620 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 ;... buffer[i
13630 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 ]='\0';... Tc
13640 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
13650 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 keyout,buffer,0)
13660 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 ;... BIO_flus
13670 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 h(out);... BI
13680 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d O_free(out);...}
13690 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 else {... ou
136a0 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
136b0 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 file());... B
136c0 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d IO_write_filenam
136d0 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 e(out,keyout);..
136e0 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
136f0 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 io_PrivateKey(ou
13700 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c t,pkey,NULL,NULL
13710 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 ,0,NULL,NULL);..
13720 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 . /* PEM_writ
13730 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 e_bio_RSAPrivate
13740 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 Key(out, rsa, NU
13750 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c LL, NULL, 0, NUL
13760 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 L, NULL); */...
13770 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 BIO_free_all(
13780 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 out);.. .}....if
13790 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 ((cert=X509_new
137a0 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 ())==NULL) {...
137b0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
137c0 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 (interp,"Error g
137d0 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 enerating certif
137e0 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e icate request",N
137f0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f ULL);... EVP_
13800 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
13810 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
13820 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
13830 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 30000000L...
13840 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
13850 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 ndif... retur
13860 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 n(TCL_ERROR);...
13870 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 }....X509_set_ve
13880 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 rsion(cert,2);..
13890 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 .ASN1_INTEGER_se
138a0 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 t(X509_get_seria
138b0 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 lNumber(cert),se
138c0 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d rial);...X509_gm
138d0 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 time_adj(X509_ge
138e0 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 tm_notBefore(cer
138f0 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d t),0);...X509_gm
13900 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 time_adj(X509_ge
13910 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 tm_notAfter(cert
13920 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 ),(long)60*60*24
13930 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 *days);...X509_s
13940 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 et_pubkey(cert,p
13950 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 key);....name=X5
13960 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 09_get_subject_n
13970 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 ame(cert);....X5
13980 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
13990 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 y_by_txt(name,"C
139a0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
139b0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
139c0 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 char *) k_C, -1
139d0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
139e0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
139f0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 by_txt(name,"ST"
13a00 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
13a10 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
13a20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 char *) k_ST, -1
13a30 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
13a40 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
13a50 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c by_txt(name,"L",
13a60 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
13a70 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
13a80 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 har *) k_L, -1,
13a90 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
13aa0 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
13ab0 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d _txt(name,"O", M
13ac0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
13ad0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
13ae0 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 r *) k_O, -1, -1
13af0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
13b00 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
13b10 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 xt(name,"OU", MB
13b20 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
13b30 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
13b40 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 *) k_OU, -1, -1
13b50 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
13b60 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
13b70 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 xt(name,"CN", MB
13b80 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
13b90 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
13ba0 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 *) k_CN, -1, -1
13bb0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
13bc0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
13bd0 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c xt(name,"Email",
13be0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
13bf0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
13c00 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 har *) k_Email,
13c10 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 -1, -1, 0);....X
13c20 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 509_set_subject_
13c30 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b name(cert,name);
13c40 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 ....if (!X509_si
13c50 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 gn(cert,pkey,EVP
13c60 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 _sha256())) {...
13c70 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 X509_free(ce
13c80 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 rt);... EVP_P
13c90 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
13ca0 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
13cb0 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
13cc0 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 0000000L... B
13cd0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e N_free(bne);.#en
13ce0 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 dif... Tcl_Se
13cf0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
13d00 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 Error signing ce
13d10 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 rtificate",NULL)
13d20 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
13d30 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 CL_ERROR;...}...
13d40 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 .if (isStr) {...
13d50 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
13d60 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 BIO_s_mem());...
13d70 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 PEM_write_bi
13d80 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 o_X509(out,cert)
13d90 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 ;... i=BIO_re
13da0 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 ad(out,buffer,si
13db0 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b zeof(buffer)-1);
13dc0 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f ... i=(i<0) ?
13dd0 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 0 : i;... bu
13de0 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 ffer[i]='\0';...
13df0 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 Tcl_SetVar(i
13e00 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 nterp,pemout,buf
13e10 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 fer,0);... BI
13e20 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 O_flush(out);...
13e30 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 BIO_free(out
13e40 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
13e50 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
13e60 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 BIO_s_file());..
13e70 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 . BIO_write_f
13e80 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f ilename(out,pemo
13e90 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ut);... PEM_w
13ea0 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 rite_bio_X509(ou
13eb0 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 t,cert);... B
13ec0 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 IO_free_all(out)
13ed0 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 ;...}....X509_fr
13ee0 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f ee(cert);...EVP_
13ef0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
13f00 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
13f10 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
13f20 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 30000000L...BN_f
13f30 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 ree(bne);.#endif
13f40 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 .. }..}..brea
13f50 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a k;. default:.
13f60 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 .break;. }.
13f70 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
13f80 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
13f90 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
13fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13fb0 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 ****/./* Init
13fc0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a */./**
13fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13fe0 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d **/../*. *------
13ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
14030 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a . * Tls_Free --.
14040 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
14050 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 dure cleans up w
14060 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 hen a SSL socket
14070 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 based channel.
14080 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 *.is closed and
14090 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f its reference co
140a0 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 unt falls below
140b0 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 1. *. * Results:
140c0 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.none. *. * S
140d0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
140e0 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 Frees all the st
140f0 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ate. *. *-------
14100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
14140 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 .void.Tls_Free(c
14150 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b har *blockPtr) {
14160 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
14170 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
14180 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 blockPtr;.. d
14190 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
141a0 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e ;.. Tls_Clean
141b0 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 (statePtr);.
141c0 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 ckfree(blockPtr)
141d0 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
141e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
141f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
14220 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d *. * Tls_Clean -
14230 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
14240 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 cedure cleans up
14250 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b when a SSL sock
14260 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c et based channel
14270 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e . *.is closed an
14280 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 d its reference
14290 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f count falls belo
142a0 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c w 1. This shoul
142b0 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 d. *.be called s
142c0 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 ynchronously by
142d0 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e the CloseProc, n
142e0 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 ot in the. *.Eve
142f0 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c ntuallyFree call
14300 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 back.. *. * Resu
14310 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a lts:. *.none. *.
14320 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
14330 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 . *.Frees all th
14340 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d e state. *. *---
14350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14390 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c . */.void Tls_Cl
143a0 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 ean(State *state
143b0 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e Ptr) {. dprin
143c0 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
143d0 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 /*. * we'
143e0 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 re assuming here
143f0 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 that we're sing
14400 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 le-threaded.
14410 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
14420 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 ePtr->timer != (
14430 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 Tcl_TimerToken)
14440 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c NULL) {..Tcl_Del
14450 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 eteTimerHandler(
14460 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 statePtr->timer)
14470 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d ;..statePtr->tim
14480 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d er = NULL;. }
14490 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
144a0 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 tr->protos) {..c
144b0 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e kfree(statePtr->
144c0 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 protos);..stateP
144d0 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c tr->protos = NUL
144e0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
144f0 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 (statePtr->bio)
14500 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 {../* This will
14510 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 call SSL_shutdow
14520 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 2a n. Bug 1414045 *
14530 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f /..dprintf("BIO_
14540 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 free_all(%p)", s
14550 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 tatePtr->bio);..
14560 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 BIO_free_all(sta
14570 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 tePtr->bio);..st
14580 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 atePtr->bio = NU
14590 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
145a0 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 (statePtr->ssl)
145b0 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c {..dprintf("SSL
145c0 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 _free(%p)", stat
145d0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c ePtr->ssl);..SSL
145e0 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e _free(statePtr->
145f0 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ssl);..statePtr-
14600 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 >ssl = NULL;.
14610 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
14620 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c Ptr->ctx) {..SSL
14630 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 _CTX_free(stateP
14640 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 tr->ctx);..state
14650 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b Ptr->ctx = NULL;
14660 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
14670 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
14680 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 k) {..Tcl_DecrRe
14690 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
146a0 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 >callback);..sta
146b0 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
146c0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
146d0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
146e0 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c password) {..Tcl
146f0 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _DecrRefCount(st
14700 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
14710 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 );..statePtr->pa
14720 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 ssword = NULL;.
14730 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
14740 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 tePtr->vcmd) {..
14750 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
14760 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
14770 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d ;..statePtr->vcm
14780 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a d = NULL;. }.
14790 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 . dprintf("Re
147a0 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f turning");.}.../
147b0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
147c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
147d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
147e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
147f0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
14800 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 s_Init --. *. *.
14810 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 This is a packag
14820 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e e initialization
14830 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 procedure, whic
14840 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 h is called. *.b
14850 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 y Tcl when this
14860 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 package is to be
14870 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 added to an int
14880 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 erpreter.. *. *
14890 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f Results: Ssl co
148a0 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 nfigured and loa
148b0 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ded. *. * Side e
148c0 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 ffects:. *. crea
148d0 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 te the ssl comma
148e0 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 nd, initialize s
148f0 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a sl context. *. *
14900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14940 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 ---. */.DLLEXPOR
14950 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 T int Tls_Init(T
14960 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
14970 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 p) {. const c
14980 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 har tlsTclInitSc
14990 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c ript[] = {.#incl
149a0 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a ude "tls.tcl.h".
149b0 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 .0x00. };..
149c0 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
149d0 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 d");.. /*.
149e0 20 20 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 * We only supp
149f0 6f 72 74 20 54 63 6c 20 38 2e 34 20 6f 72 20 6e ort Tcl 8.4 or n
14a00 65 77 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ewer. */.
14a10 20 69 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 if (.#ifdef USE
14a20 5f 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c 5f _TCL_STUBS..Tcl_
14a30 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 InitStubs(interp
14a40 2c 20 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c 73 , "8.4", 0).#els
14a50 65 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 e..Tcl_PkgRequir
14a60 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c e(interp, "Tcl",
14a70 20 22 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e 64 "8.4-", 0).#end
14a80 69 66 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a if.. == NULL) {.
14a90 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
14aa0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 R;. }.. if
14ab0 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 (TlsLibInit(0)
14ac0 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 != TCL_OK) {..Tc
14ad0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
14ae0 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f nterp, "could no
14af0 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c t initialize SSL
14b00 20 6c 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 library", NULL)
14b10 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
14b20 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
14b30 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
14b40 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
14b50 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 s::ciphers", Cip
14b60 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 hersObjCmd, (Cli
14b70 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
14b80 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
14b90 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
14ba0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
14bb0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
14bc0 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e connection", Con
14bd0 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d nectionInfoObjCm
14be0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
14bf0 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
14c00 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
14c10 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
14c20 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
14c30 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 "tls::handshake
14c40 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 ", HandshakeObjC
14c50 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
14c60 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
14c70 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
14c80 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
14c90 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
14ca0 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c , "tls::import",
14cb0 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 ImportObjCmd, (
14cc0 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
14cd0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
14ce0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
14cf0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
14d00 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
14d10 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e s::unimport", Un
14d20 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 importObjCmd, (C
14d30 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
14d40 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
14d50 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
14d60 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
14d70 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
14d80 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 ::status", Statu
14d90 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 sObjCmd, (Client
14da0 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
14db0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
14dc0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
14dd0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
14de0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 nterp, "tls::ver
14df0 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 sion", VersionOb
14e00 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
14e10 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
14e20 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
14e30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
14e40 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
14e50 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c rp, "tls::misc",
14e60 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c MiscObjCmd, (Cl
14e70 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
14e80 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
14e90 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
14ea0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
14eb0 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
14ec0 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f :protocols", Pro
14ed0 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 tocolsObjCmd, (C
14ee0 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
14ef0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
14f00 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 *) NULL);..
14f10 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 if (interp) {..T
14f20 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 cl_Eval(interp,
14f30 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 tlsTclInitScript
14f40 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 );. }.. re
14f50 74 75 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f 76 turn(Tcl_PkgProv
14f60 69 64 65 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 ide(interp, "tls
14f70 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 ", PACKAGE_VERSI
14f80 4f 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d ON));.}../*. *--
14f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14fc0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f ----*. *. *.Tls_
14fd0 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 SafeInit --. *.
14fe0 2a 09 2d 2d 2d 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 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 --*. *.Standard
15020 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 procedure requir
15030 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a ed by 'load'.. *
15040 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 .Initializes thi
15050 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 s extension for
15060 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 a safe interpret
15070 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d er.. *.---------
15080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
150a0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 -------*. *. *.S
150b0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
150c0 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 .As of 'Tls_Init
150d0 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a '. *. *.Result:.
150e0 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 *..A standard T
150f0 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 cl error code..
15100 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
15110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a ----------*. */.
15140 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c DLLEXPORT int Tl
15150 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 s_SafeInit(Tcl_I
15160 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b nterp *interp) {
15170 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
15180 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 lled");. retu
15190 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 rn(Tls_Init(inte
151a0 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d rp));.}../*. *--
151b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151e0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c ----*. *. *.TlsL
151f0 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 ibInit --. *. *.
15200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15230 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 *. *.Initializes
15240 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 SSL library onc
15250 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f e per applicatio
15260 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d n. *.-----------
15270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15290 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 -----*. *. *.Sid
152a0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 e effects:. *..i
152b0 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c nitializes SSL l
152c0 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 ibrary. *. *.Res
152d0 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a ult:. *..none. *
152e0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
152f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 ---------*. */.s
15320 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 tatic int TlsLib
15330 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 Init(int uniniti
15340 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 alize) {. sta
15350 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 tic int initiali
15360 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 zed = 0;. int
15370 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b status = TCL_OK
15380 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ;.#if defined(OP
15390 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
153a0 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
153b0 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f READS). size_
153c0 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e t num_locks;.#en
153d0 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 dif.. if (uni
153e0 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 nitialize) {..if
153f0 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 (!initialized)
15400 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 {.. dprintf("
15410 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 Asked to uniniti
15420 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 alize, but we ar
15430 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 e not initialize
15440 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 d");... retur
15450 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 n(TCL_OK);..}...
15460 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 dprintf("Asked t
15470 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 o uninitialize")
15480 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
15490 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
154a0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
154b0 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 HREADS)..Tcl_Mut
154c0 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 exLock(&init_mx)
154d0 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b ;...if (locks) {
154e0 0a 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 .. free(locks
154f0 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 );.. locks =
15500 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 NULL;.. locks
15510 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 Count = 0;..}.#e
15520 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 ndif..initialize
15530 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 d = 0;..#if defi
15540 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
15550 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
15560 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 TCL_THREADS)..Tc
15570 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 l_MutexUnlock(&i
15580 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a nit_mx);.#endif.
15590 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 ..return(TCL_OK)
155a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
155b0 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a (initialized) {.
155c0 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 .dprintf("Called
155d0 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 , but using cach
155e0 65 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 ed value");..ret
155f0 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 urn(status);.
15600 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 }.. dprintf(
15610 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 "Called");..#if
15620 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
15630 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
15640 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
15650 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f . Tcl_MutexLo
15660 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 ck(&init_mx);.#e
15670 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c ndif. initial
15680 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 ized = 1;..#if d
15690 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
156a0 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
156b0 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
156c0 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 num_locks =
156d0 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 1;. locksCoun
156e0 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f t = (int) num_lo
156f0 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d cks;. locks =
15700 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a malloc(sizeof(*
15710 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 locks) * num_loc
15720 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 ks);. memset(
15730 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 locks, 0, sizeof
15740 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c (*locks) * num_l
15750 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 ocks);.#endif..
15760 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 /* Initialize
15770 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 BOTH libcrypto
15780 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 and libssl. */.
15790 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f OPENSSL_init_
157a0 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 ssl(OPENSSL_INIT
157b0 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 _LOAD_SSL_STRING
157c0 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 S | OPENSSL_INIT
157d0 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 _LOAD_CRYPTO_STR
157e0 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f INGS..| OPENSSL_
157f0 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 INIT_ADD_ALL_CIP
15800 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 HERS | OPENSSL_I
15810 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 NIT_ADD_ALL_DIGE
15820 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 STS, NULL);..
15830 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c BIO_new_tcl(NUL
15840 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 L, 0);..#if 0.
15850 20 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a /*. * XXX:
15860 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 TODO: Remove thi
15870 73 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 s code and repla
15880 63 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65 ce it with a che
15890 63 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e ck. * for en
158a0 6f 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 ough entropy and
158b0 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 do not try to c
158c0 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 reate our own.
158d0 20 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e * terrible en
158e0 74 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 tropy. */.
158f0 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 /*. * Seed
15900 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 the random numb
15910 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 er generator in
15920 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c the SSL library,
15930 0a 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 . * using th
15940 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 e do/while const
15950 72 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 ruct because of
15960 74 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 the bug note in
15970 74 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 the. * OpenS
15980 53 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f SL FAQ at http:/
15990 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 /www.openssl.org
159a0 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d /support/faq.htm
159b0 6c 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 l#USER1. *.
159c0 20 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f * The crux o
159d0 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 f the problem is
159e0 20 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 that Solaris 7
159f0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a does not have a.
15a00 20 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 * /dev/rand
15a10 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 om or /dev/urand
15a20 6f 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 om device so it
15a30 63 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e cannot gather en
15a40 6f 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 ough. * entr
15a50 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e opy from the RAN
15a60 44 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c D_seed() when TL
15a70 53 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e S initializes an
15a80 64 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a d refuses. *
15a90 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 to go further.
15aa0 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 Earlier versions
15ab0 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 of OpenSSL carr
15ac0 69 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 ied on regardles
15ad0 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 s.. */. s
15ae0 72 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 rand((unsigned i
15af0 6e 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 nt) time((time_t
15b00 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 *) NULL));.
15b10 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 do {..for (i = 0
15b20 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b ; i < 16; i++) {
15b30 0a 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 .. rnd_seed[i
15b40 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 ] = 1 + (char) (
15b50 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 255.0 * rand()/(
15b60 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a RAND_MAX+1.0));.
15b70 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e .}..RAND_seed(rn
15b80 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 d_seed, sizeof(r
15b90 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d nd_seed));. }
15ba0 20 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 while (RAND_sta
15bb0 74 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e tus() != 1);.#en
15bc0 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 dif..#if defined
15bd0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
15be0 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
15bf0 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d _THREADS)..Tcl_M
15c00 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 utexUnlock(&init
15c10 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 _mx);.#endif...r
15c20 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d eturn(status);.}
15c30 0a .