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 69 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e is needed to un
3660: 70 61 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d pack RSA and PEM
3670: 20 6b 65 79 73 2e 0a 20 2a 09 45 76 61 6c 73 20 keys.. *.Evals
3680: 61 6e 79 20 62 6f 75 6e 64 20 70 61 73 73 77 6f any bound passwo
3690: 72 64 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 rd script and re
36a0: 74 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 turns the result
36b0: 20 61 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77 as. *.the passw
36c0: 6f 72 64 20 73 74 72 69 6e 67 2e 0a 20 2a 0a 20 ord string.. *.
36d0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3710: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
3720: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c int.PasswordCall
3730: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 back(char *buf,
3740: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 int size, int ve
3750: 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 61 74 rify, void *udat
3760: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a a) {. State *
3770: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 statePtr.= (Stat
3780: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 e *) udata;.
3790: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
37a0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
37b0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
37c0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
37d0: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 int code;.. d
37e0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
37f0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 ;.. /* If no
3800: 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64 65 callback, use de
3810: 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20 2a fault callback *
3820: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
3830: 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 tr->password ==
3840: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c NULL) {..if (Tcl
3850: 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 _EvalEx(interp,
3860: 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c "tls::password",
3870: 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c -1, TCL_EVAL_GL
3880: 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 OBAL) == TCL_OK)
3890: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65 {.. char *re
38a0: 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c t = (char *) Tcl
38b0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 _GetStringResult
38c0: 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 73 (interp);.. s
38d0: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c trncpy(buf, ret,
38e0: 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b (size_t) size);
38f0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e .. return (in
3900: 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 t)strlen(ret);..
3910: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 } else {.. re
3920: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 turn -1;..}.
3930: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 }.. /* Create
3940: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c command to eval
3950: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
3960: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
3970: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 j(statePtr->pass
3980: 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f word);.. Tcl_
3990: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
39a0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
39b0: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
39c0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
39d0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 tePtr);.. /*
39e0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 61 6e Eval callback an
39f0: 64 20 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b d success for ok
3a00: 2c 20 61 62 6f 72 74 20 66 6f 72 20 65 72 72 6f , abort for erro
3a10: 72 2c 20 63 6f 6e 74 69 6e 75 65 20 66 6f 72 20 r, continue for
3a20: 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20 continue */.
3a30: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
3a40: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
3a50: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
3a60: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
3a70: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
3a80: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
3a90: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
3aa0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
3ab0: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
3ac0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
3ad0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
3ae0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
3af0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
3b00: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
3b10: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
3b20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
3b30: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
3b40: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
3b50: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
3b60: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
3b70: 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 ePtr);.. if (
3b80: 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 code == TCL_OK)
3b90: 7b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 {..char *ret = (
3ba0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 char *) Tcl_GetS
3bb0: 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 tringResult(inte
3bc0: 72 70 29 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e rp);..if (strlen
3bd0: 28 72 65 74 29 20 3c 20 73 69 7a 65 20 2d 20 31 (ret) < size - 1
3be0: 29 20 7b 0a 09 20 20 20 20 73 74 72 6e 63 70 79 ) {.. strncpy
3bf0: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 (buf, ret, (size
3c00: 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 _t) size);..
3c10: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
3c20: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
3c30: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 ;.. return (i
3c40: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a nt)strlen(ret);.
3c50: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c .}. }. Tcl
3c60: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
3c70: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
3c80: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76 return -1;..v
3c90: 65 72 69 66 79 20 3d 20 76 65 72 69 66 79 3b 0a erify = verify;.
3ca0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
3cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
3cf0: 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 * Session Callb
3d00: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 ack for Clients
3d10: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
3d20: 77 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 when a new sessi
3d30: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 on is added to t
3d40: 68 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 he cache. In TLS
3d50: 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 1.3. *.this may
3d60: 20 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c be received mul
3d70: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 tiple times afte
3d80: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e r the handshake.
3d90: 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 For. *.earlier
3da0: 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 versions, this w
3db0: 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 ill be received
3dc0: 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 during the hands
3dd0: 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 hake.. *.This is
3de0: 20 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77 the preferred w
3df0: 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 ay to obtain a r
3e00: 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e esumable session
3e10: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
3e20: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
3e30: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
3e40: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
3e50: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
3e60: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
3e70: 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 *.0 = error whe
3e80: 72 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 re session will
3e90: 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 be immediately r
3ea0: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 emoved from the
3eb0: 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a internal cache..
3ec0: 20 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 *.1 = success w
3ed0: 68 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 here app retains
3ee0: 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 session in sess
3ef0: 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d ion cache, and m
3f00: 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 ust call SSL_SES
3f10: 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e SION_free() when
3f20: 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d done.. *. *----
3f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3f70: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
3f80: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 essionCallback(c
3f90: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53 onst SSL *ssl, S
3fa0: 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 SL_SESSION *sess
3fb0: 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 ion) {. State
3fc0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
3fd0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 ate*)SSL_get_app
3fe0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c _data((SSL *)ssl
3ff0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 );. Tcl_Inter
4000: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
4010: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
4020: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
4030: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 r;. const uns
4040: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b igned char *tick
4050: 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e et;. const un
4060: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 signed char *ses
4070: 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a sion_id;. siz
4080: 65 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e e_t len2;. un
4090: 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b signed int ulen;
40a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
40b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
40c0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
40d0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
40e0: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
40f0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
4100: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 _OK;. } else
4110: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 if (ssl == NULL)
4120: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
4130: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
4140: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
4150: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
4160: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 eval */. cmd
4170: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
4180: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
4190: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 >callback);.
41a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
41b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
41c0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
41d0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 StringObj("sessi
41e0: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 on", -1));..
41f0: 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f /* Session id */
4200: 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 . session_id
4210: 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
4220: 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 t_id(session, &u
4230: 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 len);. Tcl_Li
4240: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4250: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4260: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 r, Tcl_NewByteAr
4270: 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 rayObj(session_i
4280: 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b d, (int) ulen));
4290: 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e .. /* Session
42a0: 20 74 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 ticket */. S
42b0: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
42c0: 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 ticket(session,
42d0: 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b &ticket, &len2);
42e0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
42f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4300: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
4310: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 l_NewByteArrayOb
4320: 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 j(ticket, (int)
4330: 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 len2));.. /*
4340: 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 Lifetime - numbe
4350: 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a r of seconds */.
4360: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4370: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4380: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 erp, cmdPtr,..Tc
4390: 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f l_NewLongObj((lo
43a0: 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f ng) SSL_SESSION_
43b0: 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 get_ticket_lifet
43c0: 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e ime_hint(session
43d0: 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 )));.. /* Eva
43e0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
43f0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
4400: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
4410: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
4420: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
4430: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
4440: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
4450: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
4460: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a return 0;.}...
4470: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
4480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 --------. *. * A
44c0: 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 LPN Callback for
44d0: 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e Servers and NPN
44e0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c Callback for Cl
44f0: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 ients --. *. *.P
4500: 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 erform protocol
4510: 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 (http/1.1, h2, h
4520: 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 3, etc.) selecti
4530: 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e on for the. *.in
4540: 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f coming connectio
4550: 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 n. Called after
4560: 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 Hello and server
4570: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 callbacks.. *.W
4580: 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 here 'out' is se
4590: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
45a0: 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 and 'in' is the
45b0: 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20 peer advertised
45c0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 list.. *. * Resu
45d0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
45e0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
45f0: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
4600: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
4610: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
4620: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
4630: 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 T_ERR_OK: ALPN p
4640: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
4650: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
4660: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
4670: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
4680: 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 ERT_FATAL: There
4690: 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 was no overlap
46a0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 between the clie
46b0: 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 nt's. *. supp
46c0: 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 lied list and th
46d0: 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 e server configu
46e0: 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e ration. The conn
46f0: 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 ection will be a
4700: 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 borted.. *.SSL_T
4710: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a LSEXT_ERR_NOACK:
4720: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e ALPN protocol n
4730: 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 ot selected, e.g
4740: 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c ., because no AL
4750: 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 PN. *. protoc
4760: 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 ols are configur
4770: 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e ed for this conn
4780: 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e ection. The conn
4790: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
47a0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
47f0: 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 tatic int.ALPNCa
4800: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
4810: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 *ssl, const uns
4820: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 igned char **out
4830: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
4840: 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 *outlen,..const
4850: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 unsigned char *i
4860: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 n, unsigned int
4870: 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 inlen, void *arg
4880: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
4890: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
48a0: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 *)arg;. Tcl_I
48b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
48c0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
48d0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
48e0: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
48f0: 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 ode, res;.. d
4900: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
4910: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d ;.. if (ssl =
4920: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d = NULL || arg ==
4930: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
4940: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
4950: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
4960: 20 20 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 /* Select prot
4970: 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 ocol */. if (
4980: 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f SSL_select_next_
4990: 70 72 6f 74 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 proto(out, outle
49a0: 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f n, statePtr->pro
49b0: 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 tos, statePtr->p
49c0: 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 rotos_len,..in,
49d0: 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 inlen) == OPENSS
49e0: 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 L_NPN_NEGOTIATED
49f0: 29 20 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f ) {../* Match fo
4a00: 75 6e 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 und */..res = SS
4a10: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
4a20: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f . } else {../
4a30: 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f * OPENSSL_NPN_NO
4a40: 5f 4f 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 _OVERLAP = No ov
4a50: 65 72 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 erlap, so use fi
4a60: 72 73 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c rst item from cl
4a70: 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 ient protocol li
4a80: 73 74 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c st */..res = SSL
4a90: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
4aa0: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 K;. }.. if
4ab0: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 (statePtr->vcmd
4ac0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
4ad0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 LL) {..return re
4ae0: 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a s;. }.. /*
4af0: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 Create command
4b00: 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 to eval */. c
4b10: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
4b20: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
4b30: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 r->vcmd);. Tc
4b40: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4b50: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4b60: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
4b70: 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 ringObj("alpn",
4b80: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
4b90: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4ba0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4bb0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4bc0: 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a Obj(*out, -1));.
4bd0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
4be0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
4bf0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
4c00: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
4c10: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 if ((code = E
4c20: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
4c30: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
4c40: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 dPtr)) > 1) {..r
4c50: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
4c60: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
4c70: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d else if (code =
4c80: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 1) {..res = SS
4c90: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
4ca0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 . } else {..r
4cb0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
4cc0: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b ERR_ALERT_FATAL;
4cd0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
4ce0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
4cf0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
4d00: 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d res;.}.../*. *--
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d50: 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 -. *. * Advertis
4d60: 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c e Protocols Call
4d70: 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 back for Next Pr
4d80: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 otocol Negotiati
4d90: 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 on (NPN) in Serv
4da0: 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a erHello --. *. *
4db0: 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 .called when a T
4dc0: 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 20 LS server needs
4dd0: 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f 72 a list of suppor
4de0: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f ted protocols fo
4df0: 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 r Next. *.Protoc
4e00: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a ol Negotiation..
4e10: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
4e20: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
4e30: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a e effects:. *. *
4e40: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
4e50: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
4e60: 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f _OK: NPN protoco
4e70: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 l selected. The
4e80: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
4e90: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
4ea0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e EXT_ERR_NOACK: N
4eb0: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 PN protocol not
4ec0: 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f selected. The co
4ed0: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
4ee0: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d es.. *. *-------
4ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f ------------. */
4f30: 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a .#ifdef USE_NPN.
4f40: 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 static int.NPNCa
4f50: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
4f60: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 *ssl, const uns
4f70: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 igned char **out
4f80: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a , unsigned int *
4f90: 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 outlen, void *ar
4fa0: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a g) {. State *
4fb0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
4fc0: 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 e*)arg;.. dpr
4fd0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
4fe0: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 . if (ssl ==
4ff0: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e NULL || arg == N
5000: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
5010: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
5020: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ACK;. }..
5030: 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 /* Set protocols
5040: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 list */. if
5050: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
5060: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f s != NULL) {..*o
5070: 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 ut = statePtr->p
5080: 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 rotos;..*outlen
5090: 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 = statePtr->prot
50a0: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c os_len;. } el
50b0: 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c se {..*out = NUL
50c0: 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b L;..*outlen = 0;
50d0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
50e0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
50f0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
5100: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
5110: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a K;.}.#endif.../*
5120: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5160: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 ------. *. * SNI
5170: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 Callback for Se
5180: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 rvers --. *. *.P
5190: 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 erform server-si
51a0: 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 de SNI hostname
51b0: 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 20 selection after
51c0: 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 78 receiving SNI ex
51d0: 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c tension. *.in Cl
51e0: 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c ient Hello. Call
51f0: 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 ed after hello c
5200: 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 6f allback but befo
5210: 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b re ALPN callback
5220: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
5230: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
5240: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
5250: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
5260: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
5270: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
5280: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
5290: 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 R_OK: SNI hostna
52a0: 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e 20 me is accepted.
52b0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
52c0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c ontinues.. *.SSL
52d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 _TLSEXT_ERR_ALER
52e0: 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 T_FATAL: SNI hos
52f0: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 tname is not acc
5300: 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 epted. The conne
5310: 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 ction. *. is
5320: 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c 74 aborted. Default
5330: 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 53 for alert is SS
5340: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 L_AD_UNRECOGNIZE
5350: 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 D_NAME.. *.SSL_T
5360: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
5370: 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 WARNING: SNI hos
5380: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 tname is not acc
5390: 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 epted, warning a
53a0: 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 lert. *. sent
53b0: 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 (not supported
53c0: 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 in TLSv1.3). The
53d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
53e0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c inues.. *.SSL_TL
53f0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 SEXT_ERR_NOACK:
5400: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 SNI hostname is
5410: 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 not accepted and
5420: 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 not acknowledge
5430: 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 d,. *. e.g. i
5440: 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 f SNI has not be
5450: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 en configured. T
5460: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
5470: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d ntinues.. *. *--
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54c0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
54d0: 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e .SNICallback(con
54e0: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 st SSL *ssl, int
54f0: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 *alert, void *a
5500: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 rg) {. State
5510: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
5520: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c te*)arg;. Tcl
5530: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
5540: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
5550: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
5560: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 *cmdPtr;. int
5570: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 code, res;.
5580: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 char *servername
5590: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 = NULL;.. dp
55a0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
55b0: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d .. if (ssl ==
55c0: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 NULL || arg ==
55d0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
55e0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
55f0: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 OACK;. }..
5600: 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 /* Only works f
5610: 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 65 or TLS 1.2 and e
5620: 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 65 arlier */. se
5630: 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 rvername = SSL_g
5640: 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 et_servername(ss
5650: 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 l, TLSEXT_NAMETY
5660: 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 PE_host_name);.
5670: 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e 61 if (!serverna
5680: 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 me || servername
5690: 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 [0] == '\0') {..
56a0: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
56b0: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
56c0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 }.. if (stat
56d0: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 ePtr->vcmd == (T
56e0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
56f0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
5700: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
5710: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
5720: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
5730: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
5740: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
5750: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
5760: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
5770: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5780: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
5790: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
57a0: 22 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 "sni", -1));.
57b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
57c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
57d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
57e0: 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 wStringObj(serve
57f0: 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 rname , -1));..
5800: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
5810: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 ack command */.
5820: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
5830: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
5840: 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 if ((code = Eva
5850: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
5860: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
5870: 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 tr)) > 1) {..res
5880: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 = SSL_TLSEXT_ER
5890: 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3b R_ALERT_WARNING;
58a0: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 ..*alert = SSL_A
58b0: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e D_UNRECOGNIZED_N
58c0: 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 AME; /* Not supp
58d0: 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33 orted by TLS 1.3
58e0: 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 */. } else i
58f0: 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a f (code == 1) {.
5900: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 .res = SSL_TLSEX
5910: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 T_ERR_OK;. }
5920: 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 else {..res = SS
5930: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 L_TLSEXT_ERR_ALE
5940: 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 72 RT_FATAL;..*aler
5950: 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 t = SSL_AD_UNREC
5960: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a OGNIZED_NAME; /*
5970: 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 Not supported b
5980: 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 y TLS 1.3 */.
5990: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 }. Tcl_DecrR
59a0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
59b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b . return res;
59c0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
5a10: 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 . * ClientHello
5a20: 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 61 Handshake Callba
5a30: 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d ck for Servers -
5a40: 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 -. *. *.Used by
5a50: 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 6e server to examin
5a60: 65 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d e the server nam
5a70: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e e indication (SN
5a80: 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 I) extension. *.
5a90: 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 provided by the
5aa0: 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 client in order
5ab0: 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 70 to select an app
5ac0: 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 69 ropriate certifi
5ad0: 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 cate to. *.prese
5ae0: 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 nt, and make oth
5af0: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e er configuration
5b00: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c adjustments rel
5b10: 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 65 evant to that se
5b20: 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 rver. *.name and
5b30: 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 69 its configurati
5b40: 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65 on. This include
5b50: 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 74 s swapping out t
5b60: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 2a he associated. *
5b70: 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 .SSL_CTX pointer
5b80: 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 , modifying the
5b90: 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f 66 server's list of
5ba0: 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 76 permitted TLS v
5bb0: 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e ersions,. *.chan
5bc0: 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 ging the server'
5bd0: 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 6e s cipher list in
5be0: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 response to the
5bf0: 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 72 client's cipher
5c00: 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09 43 list, etc.. *.C
5c10: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e 49 alled before SNI
5c20: 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62 61 and ALPN callba
5c30: 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c cks.. *. * Resul
5c40: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
5c50: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
5c60: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
5c70: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
5c80: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
5c90: 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 s:. *.SSL_CLIENT
5ca0: 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 75 _HELLO_RETRY: su
5cb0: 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73 68 spend the handsh
5cc0: 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61 6e ake, and the han
5cd0: 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e 20 dshake function
5ce0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d 65 will return imme
5cf0: 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 diately. *.SSL_C
5d00: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
5d10: 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72 6d R: failure, term
5d20: 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e inate connection
5d30: 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20 65 . Set alert to e
5d40: 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 rror code.. *.SS
5d50: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 L_CLIENT_HELLO_S
5d60: 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 73 0a UCCESS: success.
5d70: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5db0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
5dc0: 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c tic int.HelloCal
5dd0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
5de0: 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 *ssl, int *alert
5df0: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 , void *arg) {.
5e00: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
5e10: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 tr = (State*)arg
5e20: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
5e30: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
5e40: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
5e50: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
5e60: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 ;. int code,
5e70: 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 res;. const c
5e80: 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 3b har *servername;
5e90: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
5ea0: 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 ned char *p;.
5eb0: 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 6d size_t len, rem
5ec0: 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70 72 aining;.. dpr
5ed0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
5ee0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
5ef0: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f r->vcmd == (Tcl_
5f00: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 Obj*)NULL) {..re
5f10: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
5f20: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 HELLO_SUCCESS;.
5f30: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 } else if (ss
5f40: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 l == NULL || arg
5f50: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
5f60: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
5f70: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
5f80: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 }.. /* Get na
5f90: 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 mes */. if (!
5fa0: 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f SSL_client_hello
5fb0: 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 _get0_ext(ssl, T
5fc0: 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65 LSEXT_TYPE_serve
5fd0: 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d r_name, &p, &rem
5fe0: 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 aining) || remai
5ff0: 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 ning <= 2) {..*a
6000: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c lert = SSL_R_SSL
6010: 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c V3_ALERT_ILLEGAL
6020: 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 _PARAMETER;..ret
6030: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
6040: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
6050: 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 }.. /* Extrac
6060: 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 t the length of
6070: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73 the supplied lis
6080: 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 t of names. */.
6090: 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 len = (*(p++)
60a0: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 << 8);. len
60b0: 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 += *(p++);. i
60c0: 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 f (len + 2 != re
60d0: 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 maining) {..*ale
60e0: 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 rt = SSL_R_SSLV3
60f0: 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 _ALERT_ILLEGAL_P
6100: 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 ARAMETER;..retur
6110: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
6120: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
6130: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 remaining =
6140: 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 len;.. /* The
6150: 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63 list in practic
6160: 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e e only has a sin
6170: 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 gle element, so
6180: 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 we only consider
6190: 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 the first one.
61a0: 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 */. if (remai
61b0: 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b ning == 0 || *p+
61c0: 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 + != TLSEXT_NAME
61d0: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 TYPE_host_name)
61e0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
61f0: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e R_TLSV1_ALERT_IN
6200: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 TERNAL_ERROR;..r
6210: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6220: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
6230: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e }. remainin
6240: 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 g--;.. /* Now
6250: 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 we can finally
6260: 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 pull out the byt
6270: 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 e array with the
6280: 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 actual hostname
6290: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d . */. if (rem
62a0: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 aining <= 2) {..
62b0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 *alert = SSL_R_T
62c0: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 LSV1_ALERT_INTER
62d0: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 NAL_ERROR;..retu
62e0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
62f0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
6300: 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b . len = (*(p+
6310: 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 +) << 8);. le
6320: 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 n += *(p++);.
6330: 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 if (len + 2 > r
6340: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c emaining) {..*al
6350: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 ert = SSL_R_TLSV
6360: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 1_ALERT_INTERNAL
6370: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 _ERROR;..return
6380: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
6390: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
63a0: 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 remaining = le
63b0: 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d n;. servernam
63c0: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 e = (const char
63d0: 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 *)p;.. /* Cre
63e0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
63f0: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 val */. cmdPt
6400: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
6410: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
6420: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
6430: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
6440: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
6450: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
6460: 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 Obj("hello", -1)
6470: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
6480: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
6490: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
64a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
64b0: 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 69 6e (servername, (in
64c0: 74 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f t) len));.. /
64d0: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
64e0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
64f0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
6500: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 cmdPtr);. if
6510: 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c ((code = EvalCal
6520: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
6530: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 atePtr, cmdPtr))
6540: 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 > 1) {..res = S
6550: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
6560: 52 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d RETRY;..*alert =
6570: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 SSL_R_TLSV1_ALE
6580: 52 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 RT_USER_CANCELLE
6590: 44 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 D;. } else if
65a0: 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 (code == 1) {..
65b0: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 res = SSL_CLIENT
65c0: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a _HELLO_SUCCESS;.
65d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 } else {..re
65e0: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 s = SSL_CLIENT_H
65f0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c ELLO_ERROR;..*al
6600: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 ert = SSL_R_TLSV
6610: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 1_ALERT_INTERNAL
6620: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
6630: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
6640: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
6650: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a return res;.}...
6660: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
6670: 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e *****/./* Comman
6680: 64 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a ds */./*
6690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
66a0: 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ***/../*. *-----
66b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
66f0: 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 *. * CiphersObjC
6700: 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c md -- list avail
6710: 61 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a able ciphers. *.
6720: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
6730: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
6740: 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 process the "tls
6750: 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 ::ciphers" comma
6760: 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 nd. *.to list av
6770: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c ailable ciphers,
6780: 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 based upon prot
6790: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 ocol selected..
67a0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
67b0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
67c0: 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a result list.. *.
67d0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
67e0: 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 . *.constructs a
67f0: 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 nd destroys SSL
6800: 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a context (CTX). *
6810: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
6820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6850: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
6860: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 c const char *pr
6870: 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 otocols[] = {.."
6880: 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 ssl2", "ssl3", "
6890: 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c tls1", "tls1.1",
68a0: 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 "tls1.2", "tls1
68b0: 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 .3", NULL.};.enu
68c0: 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 m protocol {.
68d0: 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 TLS_SSL2, TLS_S
68e0: 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 SL3, TLS_TLS1, T
68f0: 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 LS_TLS1_1, TLS_T
6900: 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f LS1_2, TLS_TLS1_
6910: 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 3, TLS_NONE.};..
6920: 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 static int.Ciphe
6930: 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 rsObjCmd(ClientD
6940: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
6950: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
6960: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
6970: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
6980: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f v[]) {. Tcl_O
6990: 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c bj *objPtr = NUL
69a0: 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a L;. SSL_CTX *
69b0: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
69c0: 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b SSL *ssl = NULL;
69d0: 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 . STACK_OF(SS
69e0: 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 L_CIPHER) *sk;.
69f0: 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 char *cp, buf
6a00: 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e [BUFSIZ];. in
6a10: 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 t index, verbose
6a20: 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 = 0, use_suppor
6a30: 74 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 ted = 0;.. dp
6a40: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
6a50: 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 .. if ((objc
6a60: 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 < 2) || (objc >
6a70: 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4)) {..Tcl_Wrong
6a80: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
6a90: 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 1, objv, "protoc
6aa0: 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 ol ?verbose? ?su
6ab0: 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 pported?");..ret
6ac0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
6ad0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c }. if (Tcl
6ae0: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a _GetIndexFromObj
6af0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d (interp, objv[1]
6b00: 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 , protocols, "pr
6b10: 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 otocol", 0, &ind
6b20: 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ex) != TCL_OK) {
6b30: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
6b40: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
6b50: 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 ((objc > 2) &&
6b60: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 Tcl_GetBooleanFr
6b70: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
6b80: 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 jv[2], &verbose)
6b90: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
6ba0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6bb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
6bc0: 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c objc > 3) && Tcl
6bd0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f _GetBooleanFromO
6be0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
6bf0: 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 3], &use_support
6c00: 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ed) != TCL_OK) {
6c10: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
6c20: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 OR;. }.. E
6c30: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
6c40: 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 ;.. switch ((
6c50: 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e enum protocol)in
6c60: 64 65 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 dex) {..case TLS
6c70: 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 _SSL2:.#if OPENS
6c80: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
6c90: 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c R >= 0x10100000L
6ca0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 || defined(NO_S
6cb0: 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 SL2) || defined(
6cc0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
6cd0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
6ce0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
6cf0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
6d00: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
6d10: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
6d20: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
6d30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
6d40: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f .. ctx = SSL_
6d50: 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65 CTX_new(SSLv2_me
6d60: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a thod()); break;.
6d70: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 #endif..case TLS
6d80: 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e _SSL3:.#if defin
6d90: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 ed(NO_SSL3) || d
6da0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
6db0: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e O_SSL3) || defin
6dc0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
6dd0: 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 L3_METHOD)..
6de0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
6df0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
6e00: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
6e10: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
6e20: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
6e30: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
6e40: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
6e50: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
6e60: 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 w(SSLv3_method()
6e70: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
6e80: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a ..case TLS_TLS1:
6e90: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
6ea0: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 TLS1) || defined
6eb0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
6ec0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
6ed0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 NSSL_NO_TLS1_MET
6ee0: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 HOD).. Tcl_Ap
6ef0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
6f00: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
6f10: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
6f20: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
6f30: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
6f40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
6f50: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 else.. ctx =
6f60: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 SSL_CTX_new(TLSv
6f70: 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 1_method()); bre
6f80: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
6f90: 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 TLS_TLS1_1:.#if
6fa0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
6fb0: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
6fc0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
6fd0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
6fe0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d NSSL_NO_TLS1_1_M
6ff0: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
7000: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7010: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
7020: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
7030: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
7040: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
7050: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7060: 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 .#else.. ctx
7070: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c = SSL_CTX_new(TL
7080: 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b Sv1_1_method());
7090: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
70a0: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a case TLS_TLS1_2:
70b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
70c0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e TLS1_2) || defin
70d0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
70e0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
70f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
7100: 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 _2_METHOD)..
7110: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7120: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
7130: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
7140: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
7150: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
7160: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
7170: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
7180: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
7190: 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 w(TLSv1_2_method
71a0: 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 ()); break;.#end
71b0: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
71c0: 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 1_3:.#if defined
71d0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 (NO_TLS1_3) || d
71e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
71f0: 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 O_TLS1_3).. T
7200: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
7210: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
7220: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
7230: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
7240: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
7250: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7260: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 OR;.#else.. c
7270: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
7280: 28 54 4c 53 5f 6d 65 74 68 6f 64 28 29 29 3b 0a (TLS_method());.
7290: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
72a0: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _min_proto_versi
72b0: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 on(ctx, TLS1_3_V
72c0: 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 ERSION);.. SS
72d0: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 L_CTX_set_max_pr
72e0: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
72f0: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 TLS1_3_VERSION)
7300: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 ;.. break;.#e
7310: 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 ndif..default:..
7320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
7330: 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 . if (ctx ==
7340: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
7350: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
7360: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c , REASON(), NULL
7370: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
7380: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
7390: 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 ssl = SSL_new(c
73a0: 74 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c tx);. if (ssl
73b0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c == NULL) {..Tcl
73c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
73d0: 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 terp, REASON(),
73e0: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f NULL);..SSL_CTX_
73f0: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 free(ctx);..retu
7400: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7410: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 }.. /* Use
7420: 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 list and order a
7430: 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 s would be sent
7440: 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f in a ClientHello
7450: 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c or all availabl
7460: 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 e ciphers */.
7470: 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 if (use_support
7480: 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f ed) {..sk = SSL_
7490: 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 get1_supported_c
74a0: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 iphers(ssl);.
74b0: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 } else {..sk =
74c0: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 SSL_get_ciphers(
74d0: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ssl);. }..
74e0: 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 if (sk != NULL)
74f0: 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 {..if (!verbose
7500: 29 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 ) {.. objPtr
7510: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
7520: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 (0, NULL);..
7530: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 for (int i = 0;
7540: 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 i < sk_SSL_CIPHE
7550: 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 R_num(sk); i++)
7560: 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 {...const SSL_CI
7570: 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c PHER *c = sk_SSL
7580: 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b _CIPHER_value(sk
7590: 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d , i);...if (c ==
75a0: 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b NULL) continue;
75b0: 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 ..../* cipher na
75c0: 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a me or (NONE) */.
75d0: 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 ..cp = SSL_CIPHE
75e0: 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 R_get_name(c);..
75f0: 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 .if (cp == NULL)
7600: 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 break;...Tcl_Li
7610: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
7620: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
7630: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
7640: 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 Obj(cp, -1));..
7650: 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a }...} else {.
7660: 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 . objPtr = Tc
7670: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
7680: 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 ",0);.. for (
7690: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 int i = 0; i < s
76a0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d k_SSL_CIPHER_num
76b0: 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 (sk); i++) {...c
76c0: 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 onst SSL_CIPHER
76d0: 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 *c = sk_SSL_CIPH
76e0: 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b ER_value(sk, i);
76f0: 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c ...if (c == NULL
7700: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f ) continue;..../
7710: 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 * textual descri
7720: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 ption of the cip
7730: 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c her */...if (SSL
7740: 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 _CIPHER_descript
7750: 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 ion(c, buf, size
7760: 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c of(buf)) != NULL
7770: 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 ) {... Tcl_Ap
7780: 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 pendToObj(objPtr
7790: 2c 20 62 75 66 2c 20 28 69 6e 74 29 20 73 74 72 , buf, (int) str
77a0: 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20 65 len(buf));...} e
77b0: 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f lse {... Tcl_
77c0: 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 AppendToObj(objP
77d0: 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c tr, "UNKNOWN\n",
77e0: 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 8);...}.. }.
77f0: 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 70 70 .}..if (use_supp
7800: 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 73 6b orted) {.. sk
7810: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 65 65 _SSL_CIPHER_free
7820: 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 (sk);..}. }.
7830: 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c 29 SSL_free(ssl)
7840: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 ;. SSL_CTX_fr
7850: 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 63 ee(ctx);.. Tc
7860: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
7870: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
7880: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
7890: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d K;..clientData =
78a0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c clientData;.}..
78b0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
78c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
7900: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 ProtocolsObjCmd
7910: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c -- list availabl
7920: 65 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 e protocols. *.
7930: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
7940: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 is invoked to p
7950: 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a rocess the "tls:
7960: 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d :protocols" comm
7970: 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 and. *.to list a
7980: 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f vailable protoco
7990: 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ls.. *. * Result
79a0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
79b0: 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 Tcl result list
79c0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
79d0: 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ects:. *.none. *
79e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a20: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
7a30: 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f c int.ProtocolsO
7a40: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
7a50: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
7a60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
7a70: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
7a80: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
7a90: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ) {. Tcl_Obj
7aa0: 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 *objPtr;.. dp
7ab0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
7ac0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
7ad0: 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 1) {..Tcl_Wron
7ae0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
7af0: 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 1, objv, "");..
7b00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7b10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
7b20: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
7b30: 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 . objPtr = Tc
7b40: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
7b50: 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e NULL);..#if OPEN
7b60: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
7b70: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c ER < 0x10100000L
7b80: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f && !defined(NO_
7b90: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 SSL2) && !define
7ba0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
7bb0: 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 2). Tcl_ListO
7bc0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
7bd0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
7be0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
7bf0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 (protocols[TLS_S
7c00: 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 SL2], -1));.#end
7c10: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
7c20: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
7c30: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
7c40: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
7c50: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
7c60: 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 3_METHOD). Tc
7c70: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
7c80: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
7c90: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
7ca0: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
7cb0: 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 s[TLS_SSL3], -1)
7cc0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
7cd0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
7ce0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
7cf0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 SSL_NO_TLS1) &&
7d00: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
7d10: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 _NO_TLS1_METHOD)
7d20: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
7d30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
7d40: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
7d50: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
7d60: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 rotocols[TLS_TLS
7d70: 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 1], -1));.#endif
7d80: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
7d90: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
7da0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
7db0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
7dc0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
7dd0: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 LS1_1_METHOD).
7de0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
7df0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
7e00: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
7e10: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
7e20: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 ocols[TLS_TLS1_1
7e30: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
7e40: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
7e50: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
7e60: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
7e70: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
7e80: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7e90: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_2_METHOD).
7ea0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
7eb0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
7ec0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
7ed0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
7ee0: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d cols[TLS_TLS1_2]
7ef0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
7f00: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
7f10: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
7f20: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7f30: 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 S1_3). Tcl_Li
7f40: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
7f50: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
7f60: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
7f70: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
7f80: 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b S_TLS1_3], -1));
7f90: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c .#endif.. Tcl
7fa0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
7fb0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 terp, objPtr);.
7fc0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
7fd0: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
7fe0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
7ff0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8030: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 --------. *. * H
8040: 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d andshakeObjCmd -
8050: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d -. *. *.This com
8060: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 mand is used to
8070: 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20 74 verify whether t
8080: 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 he handshake is
8090: 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e complete. *.or n
80a0: 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ot.. *. * Result
80b0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
80c0: 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d Tcl result. 1 m
80d0: 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 eans handshake c
80e0: 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 omplete, 0 means
80f0: 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 pending.. *. *
8100: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
8110: 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e .May force SSL n
8120: 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 egotiation to ta
8130: 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d ke place.. *. *-
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8180: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
8190: 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d t HandshakeObjCm
81a0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
81b0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
81c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
81d0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
81e0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
81f0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
8200: 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 chan; /*
8210: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
8220: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f et a mode on. */
8230: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
8240: 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 ePtr; /*
8250: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 client state for
8260: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 ssl socket */.
8270: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 const char *e
8280: 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 rrStr = NULL;.
8290: 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 int ret = 1;.
82a0: 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a int err = 0;.
82b0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
82c0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
82d0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
82e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
82f0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
8300: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
8310: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
8320: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
8330: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
8340: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
8350: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
8360: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 , Tcl_GetStringF
8370: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 romObj(objv[1],
8380: 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 NULL), NULL);.
8390: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 if (chan == (T
83a0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
83b0: 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f ) {..return(TCL_
83c0: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 ERROR);. }..
83d0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
83e0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
83f0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
8400: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
8410: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
8420: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 l(chan);. if
8430: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
8440: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
8450: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
8460: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
8470: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
8480: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
8490: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
84a0: 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 (chan),.. "\"
84b0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
84c0: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 nel", NULL);..Tc
84d0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
84e0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 nterp, "TLS", "H
84f0: 41 4e 44 53 48 41 4b 45 22 2c 20 22 43 48 41 4e ANDSHAKE", "CHAN
8500: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
8510: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
8520: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
8530: 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 OR);. }. s
8540: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
8550: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
8560: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
8570: 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 an);.. dprint
8580: 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 f("Calling Tls_W
8590: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b aitForConnect");
85a0: 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 . ret = Tls_W
85b0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 aitForConnect(st
85c0: 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20 31 29 atePtr, &err, 1)
85d0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 ;. dprintf("T
85e0: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 ls_WaitForConnec
85f0: 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69 22 2c t returned: %i",
8600: 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 ret);.. if (
8610: 72 65 74 20 3c 20 30 20 26 26 20 28 28 73 74 61 ret < 0 && ((sta
8620: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
8630: 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 LS_TCL_ASYNC) &&
8640: 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 (err == EAGAIN)
8650: 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 )) {..dprintf("A
8660: 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72 sync set and err
8670: 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 = EAGAIN");..re
8680: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 t = 0;. } els
8690: 65 20 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b e if (ret < 0) {
86a0: 0a 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 ..errStr = state
86b0: 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 Ptr->err;..Tcl_R
86c0: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 esetResult(inter
86d0: 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e p);..Tcl_SetErrn
86e0: 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 o(err);...if (!e
86f0: 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 rrStr || (*errSt
8700: 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 r == 0)) {..
8710: 65 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 errStr = Tcl_Pos
8720: 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ixError(interp);
8730: 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 ..}...Tcl_Append
8740: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
8750: 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 handshake failed
8760: 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68 : ", errStr, (ch
8770: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 ar *) NULL);..Tc
8780: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
8790: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 nterp, "TLS", "H
87a0: 41 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c ANDSHAKE", "FAIL
87b0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
87c0: 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 LL);..dprintf("R
87d0: 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 eturning TCL_ERR
87e0: 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b OR with handshak
87f0: 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 e failed: %s", e
8800: 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 rrStr);..return(
8810: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
8820: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 } else {..if (er
8830: 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 r != 0) {.. d
8840: 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 printf("Got an e
8850: 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 rror with a comp
8860: 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a leted handshake:
8870: 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 err = %i", err)
8880: 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 ;..}..ret = 1;.
8890: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
88a0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c f("Returning TCL
88b0: 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 _OK with data \"
88c0: 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 %i\"", ret);.
88d0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
88e0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 t(interp, Tcl_Ne
88f0: 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 wIntObj(ret));.
8900: 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b return(TCL_OK
8910: 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d );..clientData =
8920: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a clientData;.}..
8930: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
8940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 --------. *. * I
8980: 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 mportObjCmd --.
8990: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
89a0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ure is invoked t
89b0: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 o process the "s
89c0: 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 sl" command. *.
89d0: 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e *.The ssl comman
89e0: 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 d pushes SSL ove
89f0: 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 r a (newly conne
8a00: 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 cted) tcp socket
8a10: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
8a20: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
8a30: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
8a40: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
8a50: 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 .May modify the
8a60: 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 behavior of an I
8a70: 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a O channel.. *. *
8a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ac0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
8ad0: 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 nt.ImportObjCmd(
8ae0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
8af0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
8b00: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
8b10: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
8b20: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
8b30: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
8b40: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e an;../* The chan
8b50: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
8b60: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 e on. */. Sta
8b70: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f te *statePtr;../
8b80: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
8b90: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
8ba0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 . SSL_CTX *ct
8bb0: 78 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c x. = NULL
8bc0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 ;. Tcl_Obj *s
8bd0: 63 72 69 70 74 09 20 20 20 20 20 20 20 20 3d 20 cript. =
8be0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
8bf0: 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 20 j *password.
8c00: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
8c10: 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 20 20 Tcl_Obj *vcmd.
8c20: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
8c30: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 Tcl_DString up
8c40: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
8c50: 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e ation, upperChan
8c60: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 nelBlocking, upp
8c70: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
8c80: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 g, upperChannelE
8c90: 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 OFChar;. int
8ca0: 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e idx, len;. in
8cb0: 74 20 66 6c 61 67 73 09 09 20 20 20 20 20 20 20 t flags..
8cc0: 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b = TLS_TCL_INIT;
8cd0: 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 . int server.
8ce0: 09 20 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a . = 0;./*
8cf0: 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 is connection i
8d00: 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f ncoming or outgo
8d10: 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 ing? */. char
8d20: 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 *keyfile.
8d30: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 = NULL;. ch
8d40: 61 72 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20 ar *certfile.
8d50: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
8d60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
8d70: 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 key .= NULL;.
8d80: 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20 int key_len
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 =
8da0: 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 0;. unsigned
8db0: 63 68 61 72 20 2a 63 65 72 74 20 20 20 20 20 20 char *cert
8dc0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
8dd0: 6e 74 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 nt cert_len
8de0: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a = 0;.
8df0: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 char *cipher
8e00: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c s. = NULL
8e10: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ;. char *ciph
8e20: 65 72 73 75 69 74 65 73 09 20 20 20 20 20 20 20 ersuites.
8e30: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
8e40: 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20 r *CAfile.
8e50: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 = NULL;. ch
8e60: 61 72 20 2a 43 41 64 69 72 09 09 20 20 20 20 20 ar *CAdir..
8e70: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 = NULL;. c
8e80: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20 har *DHparams.
8e90: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
8ea0: 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 char *model..
8eb0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
8ec0: 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e char *servern
8ed0: 61 6d 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ame. = NU
8ee0: 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 LL;./* hostname
8ef0: 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 for Server Name
8f00: 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 Indication */.
8f10: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
8f20: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
8f30: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 d = NULL;. Tc
8f40: 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e l_Obj *alpn..= N
8f50: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c ULL;. int ssl
8f60: 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 2 = 0, ssl3 = 0;
8f70: 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 . int tls1 =
8f80: 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 1, tls1_1 = 1, t
8f90: 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f ls1_2 = 1, tls1_
8fa0: 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 3 = 1;. int p
8fb0: 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 roto = 0, level
8fc0: 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 = -1;. int ve
8fd0: 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 rify = 0, requir
8fe0: 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d e = 0, request =
8ff0: 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 1, post_handsha
9000: 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 ke = 0;.. dpr
9010: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
9020: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
9030: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
9040: 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 10100000L && !de
9050: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
9060: 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e _SSL2) && !defin
9070: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 ed(NO_SSL2) && d
9080: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
9090: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
90a0: 53 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e S1) && defined(N
90b0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66 O_TLS1_1) && def
90c0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
90d0: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
90e0: 53 31 5f 33 29 0a 20 20 20 20 73 73 6c 32 20 3d S1_3). ssl2 =
90f0: 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 1;.#endif.#if !
9100: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
9110: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
9120: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 ined(NO_SSL3) &&
9130: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 defined(NO_SSL2
9140: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f ) && defined(NO_
9150: 54 4c 53 31 29 20 26 26 20 64 65 66 69 6e 65 64 TLS1) && defined
9160: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 (NO_TLS1_1) && d
9170: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
9180: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f ) && defined(NO_
9190: 54 4c 53 31 5f 33 29 0a 20 20 20 20 73 73 6c 33 TLS1_3). ssl3
91a0: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 1;.#endif.#if
91b0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
91c0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
91d0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 NSSL_NO_TLS1).
91e0: 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 tls1 = 0;.#end
91f0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
9200: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 O_TLS1_1) || def
9210: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
9220: 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 TLS1_1). tls1
9230: 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 _1 = 0;.#endif.#
9240: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
9250: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
9260: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
9270: 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d _2). tls1_2 =
9280: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 0;.#endif.#if d
9290: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
92a0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
92b0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
92c0: 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a tls1_3 = 0;.
92d0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 #endif.. if (
92e0: 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c objc < 2) {..Tcl
92f0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
9300: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
9310: 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 channel ?options
9320: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c ?");..return TCL
9330: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
9340: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 ERR_clear_err
9350: 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 or();.. chan
9360: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
9370: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 (interp, Tcl_Get
9380: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 StringFromObj(ob
9390: 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 jv[1], NULL), NU
93a0: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
93b0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
93c0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
93d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
93e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
93f0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
9400: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
9410: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
9420: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
9430: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a Channel(chan);..
9440: 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 for (idx = 2
9450: 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 ; idx < objc; id
9460: 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 x++) {..char *op
9470: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e t = Tcl_GetStrin
9480: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 gFromObj(objv[id
9490: 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 x], NULL);...if
94a0: 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a (opt[0] != '-').
94b0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 . break;...OP
94c0: 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c TOBJ("-alpn", al
94d0: 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 pn);..OPTSTR("-c
94e0: 61 64 69 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 adir", CAdir);..
94f0: 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 OPTSTR("-cafile"
9500: 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42 , CAfile);..OPTB
9510: 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 YTE("-cert", cer
9520: 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f t, cert_len);..O
9530: 50 54 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 PTSTR("-certfile
9540: 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f ", certfile);..O
9550: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c PTSTR("-cipher",
9560: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 ciphers);..OPTS
9570: 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63 TR("-ciphers", c
9580: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 iphers);..OPTSTR
9590: 28 22 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 ("-ciphersuites"
95a0: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29 3b , ciphersuites);
95b0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 ..OPTOBJ("-comma
95c0: 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f nd", script);..O
95d0: 50 54 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73 PTSTR("-dhparams
95e0: 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f ", DHparams);..O
95f0: 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b PTBYTE("-key", k
9600: 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f ey, key_len);..O
9610: 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 PTSTR("-keyfile"
9620: 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 , keyfile);..OPT
9630: 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f STR("-model", mo
9640: 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d del);..OPTOBJ("-
9650: 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77 password", passw
9660: 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 ord);..OPTBOOL("
9670: 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 -post_handshake"
9680: 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 , post_handshake
9690: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 );..OPTBOOL("-re
96a0: 71 75 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 quest", request)
96b0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 ;..OPTBOOL("-req
96c0: 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b uire", require);
96d0: 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 ..OPTINT("-secur
96e0: 69 74 79 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c itylevel", level
96f0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 );..OPTBOOL("-se
9700: 72 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a rver", server);.
9710: 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 .OPTSTR("-server
9720: 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d name", servernam
9730: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 e);..OPTSTR("-se
9740: 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 ssion_id", sessi
9750: 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c on_id);..OPTBOOL
9760: 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b ("-ssl2", ssl2);
9770: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 ..OPTBOOL("-ssl3
9780: 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f ", ssl3);..OPTBO
9790: 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 OL("-tls1", tls1
97a0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
97b0: 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a s1.1", tls1_1);.
97c0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e .OPTBOOL("-tls1.
97d0: 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 2", tls1_2);..OP
97e0: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c TBOOL("-tls1.3",
97f0: 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 tls1_3);..OPTOB
9800: 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d J("-validatecomm
9810: 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 and", vcmd);..OP
9820: 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 TOBJ("-vcmd", vc
9830: 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f md);...OPTBAD("o
9840: 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 ption", "-alpn,
9850: 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c -cadir, -cafile,
9860: 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c -cert, -certfil
9870: 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 e, -cipher, -cip
9880: 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d hersuites, -comm
9890: 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 and, -dhparams,
98a0: 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 -key, -keyfile,
98b0: 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 -model, -passwor
98c0: 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 d, -post_handsha
98d0: 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 ke, -request, -r
98e0: 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72 69 74 equire, -securit
98f0: 79 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c ylevel, -server,
9900: 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 -servername, -s
9910: 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 ession_id, -ssl2
9920: 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 , -ssl3, -tls1,
9930: 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 -tls1.1, -tls1.2
9940: 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 , -tls1.3, or -v
9950: 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 alidatecommand")
9960: 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
9970: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
9980: 69 66 20 28 72 65 71 75 65 73 74 29 09 09 76 65 if (request)..ve
9990: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 rify |= SSL_VERI
99a0: 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c FY_CLIENT_ONCE |
99b0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 SSL_VERIFY_PEER
99c0: 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 ;. if (reques
99d0: 74 20 26 26 20 72 65 71 75 69 72 65 29 09 76 65 t && require).ve
99e0: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 rify |= SSL_VERI
99f0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
9a00: 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 ER_CERT;. if
9a10: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 (request && post
9a20: 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 _handshake).veri
9a30: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 fy |= SSL_VERIFY
9a40: 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b _POST_HANDSHAKE;
9a50: 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20 . if (verify
9a60: 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20 3d 20 == 0)..verify =
9a70: 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b SSL_VERIFY_NONE;
9a80: 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 .. proto |= (
9a90: 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f ssl2 ? TLS_PROTO
9aa0: 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 _SSL2 : 0);.
9ab0: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f proto |= (ssl3 ?
9ac0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 TLS_PROTO_SSL3
9ad0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
9ae0: 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 |= (tls1 ? TLS_P
9af0: 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a ROTO_TLS1 : 0);.
9b00: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
9b10: 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f s1_1 ? TLS_PROTO
9b20: 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 _TLS1_1 : 0);.
9b30: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
9b40: 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _2 ? TLS_PROTO_T
9b50: 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 LS1_2 : 0);.
9b60: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 proto |= (tls1_3
9b70: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
9b80: 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 1_3 : 0);.. /
9b90: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 * reset to NULL
9ba0: 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 if blank string
9bb0: 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 provided */.
9bc0: 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 if (cert && !*ce
9bd0: 72 74 29 09 09 20 20 20 20 20 20 20 20 63 65 72 rt).. cer
9be0: 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c t. = NULL
9bf0: 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 ;. if (key &&
9c00: 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 !*key)..
9c10: 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e key. = N
9c20: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 ULL;. if (cer
9c30: 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 tfile && !*certf
9c40: 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 72 ile) cer
9c50: 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 tfile.= NULL;.
9c60: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 if (keyfile &&
9c70: 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 !*keyfile)..key
9c80: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e file. = N
9c90: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 ULL;. if (cip
9ca0: 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 hers && !*cipher
9cb0: 73 29 09 20 20 20 20 20 20 20 20 63 69 70 68 65 s). ciphe
9cc0: 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c rs. = NUL
9cd0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 L;. if (ciphe
9ce0: 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 rsuites && !*cip
9cf0: 68 65 72 73 75 69 74 65 73 29 20 63 69 70 68 65 hersuites) ciphe
9d00: 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c rsuites = NUL
9d10: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c L;. if (CAfil
9d20: 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 e && !*CAfile).
9d30: 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 CAfile.
9d40: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
9d50: 20 20 69 66 20 28 43 41 64 69 72 20 26 26 20 21 if (CAdir && !
9d60: 2a 43 41 64 69 72 29 09 20 20 20 20 20 20 20 20 *CAdir).
9d70: 43 41 64 69 72 09 20 20 20 20 20 20 20 20 3d 20 CAdir. =
9d80: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 NULL;. if (DH
9d90: 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 params && !*DHpa
9da0: 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 rams). DH
9db0: 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 params =
9dc0: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 NULL;.. /* ne
9dd0: 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 w SSL state */.
9de0: 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 statePtr..= (
9df0: 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 State *) ckalloc
9e00: 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 ((unsigned) size
9e10: 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 of(State));.
9e20: 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c memset(statePtr,
9e30: 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 0, sizeof(State
9e40: 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 ));.. statePt
9e50: 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 r->flags.= flags
9e60: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
9e70: 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b interp.= interp;
9e80: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 . statePtr->v
9e90: 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a flags.= verify;.
9ea0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 statePtr->er
9eb0: 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 r.= "";.. /*
9ec0: 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 allocate script
9ed0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 */. if (scrip
9ee0: 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c t) {..(void) Tcl
9ef0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
9f00: 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b j(script, &len);
9f10: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 ..if (len) {..
9f20: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c statePtr->call
9f30: 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 back = script;..
9f40: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
9f50: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 ount(statePtr->c
9f60: 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 allback);..}.
9f70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 }.. /* alloc
9f80: 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a ate password */.
9f90: 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 if (password
9fa0: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f ) {..(void) Tcl_
9fb0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
9fc0: 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 (password, &len)
9fd0: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 ;..if (len) {..
9fe0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 statePtr->pas
9ff0: 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 sword = password
a000: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 ;.. Tcl_IncrR
a010: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
a020: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a ->password);..}.
a030: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c }.. /* al
a040: 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 locate validate
a050: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 command */. i
a060: 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 f (vcmd) {..(voi
a070: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 d) Tcl_GetString
a080: 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c FromObj(vcmd, &l
a090: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b en);..if (len) {
a0a0: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
a0b0: 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 vcmd = vcmd;..
a0c0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
a0d0: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d nt(statePtr->vcm
a0e0: 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 d);..}. }..
a0f0: 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e if (model != N
a100: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 ULL) {..int mode
a110: 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d ;../* Get the "m
a120: 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f odel" context */
a130: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 ..chan = Tcl_Get
a140: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
a150: 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 model, &mode);..
a160: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
a170: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
a180: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 {.. Tls_Free(
a190: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
a1a0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
a1b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
a1c0: 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 /*.. * Make sure
a1d0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
a1e0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
a1f0: 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 el.. */..chan =
a200: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
a210: 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 l(chan);..if (Tc
a220: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
a230: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
a240: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
a250: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
a260: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
a270: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
a280: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
a290: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 e(chan),..."\":
a2a0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
a2b0: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 l", NULL);..
a2c0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
a2d0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
a2e0: 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e "IMPORT", "CHANN
a2f0: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 EL", "INVALID",
a300: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
a310: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
a320: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
a330: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
a340: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 L_ERROR;..}..ctx
a350: 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c = ((State *)Tcl
a360: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
a370: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e nceData(chan))->
a380: 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ctx;. } else
a390: 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43 54 {..if ((ctx = CT
a3a0: 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c X_Init(statePtr,
a3b0: 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 server, proto,
a3c0: 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c keyfile, certfil
a3d0: 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 6b 65 e, key, cert, ke
a3e0: 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 63 65 72 74 y_len,.. cert
a3f0: 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 _len, CAdir, CAf
a400: 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 ile, ciphers, ci
a410: 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 phersuites, leve
a420: 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d l, DHparams)) ==
a430: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c NULL) {.. Tl
a440: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
a450: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
a460: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a470: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
a480: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 statePtr->ctx =
a490: 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 ctx;.. /*.
a4a0: 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d * We need to m
a4b0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 ake sure that th
a4c0: 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 e channel works
a4d0: 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 in binary (for t
a4e0: 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 he. * encryp
a4f0: 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 tion not to get
a500: 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 goofed up)..
a510: 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 * We only want
a520: 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 to adjust the bu
a530: 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 ffering in pre-v
a540: 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 2 channels, wher
a550: 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 e. * each ch
a560: 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 annel in the sta
a570: 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 ck maintained it
a580: 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 s own buffers..
a590: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 */. Tcl_D
a5a0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
a5b0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
a5c0: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ion);. Tcl_DS
a5d0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
a5e0: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 ChannelBlocking)
a5f0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
a600: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e gInit(&upperChan
a610: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 nelEOFChar);.
a620: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
a630: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e (&upperChannelEn
a640: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c coding);. Tcl
a650: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
a660: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
a670: 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 "-eofchar", &upp
a680: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
a690: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
a6a0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
a6b0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f rp, chan, "-enco
a6c0: 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 ding", &upperCha
a6d0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 nnelEncoding);.
a6e0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
a6f0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
a700: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 chan, "-translat
a710: 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e ion", &upperChan
a720: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b nelTranslation);
a730: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
a740: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
a750: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 , chan, "-blocki
a760: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e ng", &upperChann
a770: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 elBlocking);.
a780: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
a790: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
a7a0: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f an, "-translatio
a7b0: 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 n", "binary");.
a7c0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
a7d0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
a7e0: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 chan, "-blocking
a7f0: 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 ", "true");.
a800: 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 dprintf("Consumi
a810: 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 ng Tcl channel %
a820: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e s", Tcl_GetChann
a830: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 elName(chan));.
a840: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c statePtr->sel
a850: 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 f = Tcl_StackCha
a860: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 nnel(interp, Tls
a870: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 _ChannelType(),
a880: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
a890: 74 65 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 tePtr, (TCL_READ
a8a0: 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 ABLE | TCL_WRITA
a8b0: 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 BLE), chan);.
a8c0: 20 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 dprintf("Create
a8d0: 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 d channel named
a8e0: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e %s", Tcl_GetChan
a8f0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
a900: 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 ->self));. if
a910: 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 (statePtr->self
a920: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
a930: 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 ) NULL) {../*..
a940: 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f * No use of Tcl_
a950: 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 EventuallyFree b
a960: 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 ecause no possib
a970: 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e le Tcl_Preserve.
a980: 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 .. */..Tls_Free(
a990: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
a9a0: 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f r);..return TCL_
a9b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
a9c0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
a9d0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 Option(interp, s
a9e0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 tatePtr->self, "
a9f0: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 -translation", T
aa00: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
aa10: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
aa20: 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 nslation));.
aa30: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
aa40: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
aa50: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 tePtr->self, "-e
aa60: 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 ncoding", Tcl_DS
aa70: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 tringValue(&uppe
aa80: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
aa90: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ));. Tcl_SetC
aaa0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
aab0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
aac0: 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c elf, "-eofchar",
aad0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 Tcl_DStringValu
aae0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 e(&upperChannelE
aaf0: 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 OFChar));. Tc
ab00: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
ab10: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 on(interp, state
ab20: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f Ptr->self, "-blo
ab30: 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 cking", Tcl_DStr
ab40: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 ingValue(&upperC
ab50: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 hannelBlocking))
ab60: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
ab70: 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 SSL Initializat
ab80: 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 ion. */.
ab90: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 statePtr->ssl =
aba0: 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 SSL_new(statePtr
abb0: 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 ->ctx);. if (
abc0: 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 !statePtr->ssl)
abd0: 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 {../* SSL librar
abe0: 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f y error */..Tcl_
abf0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
ac00: 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 erp, "couldn't c
ac10: 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 onstruct ssl ses
ac20: 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 sion: ", REASON(
ac30: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
ac40: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
ac50: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
ac60: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
ac70: 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 , "INIT", "FAILE
ac80: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
ac90: 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 L);..Tls_Free((c
aca0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
acb0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
acc0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
acd0: 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 /* Set host serv
ace0: 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 er name */. i
acf0: 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b f (servername) {
ad00: 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 ../* Sets the se
ad10: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 rver name indica
ad20: 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c tion (SNI) in Cl
ad30: 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 ientHello extens
ad40: 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 ion */../* Per R
ad50: 46 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d FC 6066, hostnam
ad60: 65 20 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 e is a ASCII enc
ad70: 6f 64 65 64 20 73 74 72 69 6e 67 2e 20 2a 2f 0a oded string. */.
ad80: 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c .if (!SSL_set_tl
ad90: 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 sext_host_name(s
ada0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 tatePtr->ssl, se
adb0: 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 rvername) && req
adc0: 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c uire) {.. Tcl
add0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
ade0: 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54 terp, "setting T
adf0: 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 LS host name ext
ae00: 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 ension failed",
ae10: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
ae20: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f . Tcl_SetErro
ae30: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
ae40: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 LS", "IMPORT", "
ae50: 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 SNI", "FAILED",
ae60: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
ae70: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
ae80: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
ae90: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
aea0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
aeb0: 20 43 6f 6e 66 69 67 75 72 65 20 73 65 72 76 65 Configure serve
aec0: 72 20 68 6f 73 74 20 6e 61 6d 65 20 63 68 65 63 r host name chec
aed0: 6b 73 20 69 6e 20 74 68 65 20 53 53 4c 20 63 6c ks in the SSL cl
aee0: 69 65 6e 74 2e 20 53 65 74 20 44 4e 53 20 68 6f ient. Set DNS ho
aef0: 73 74 6e 61 6d 65 20 74 6f 0a 09 20 20 20 6e 61 stname to.. na
af00: 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 me for peer cert
af10: 69 66 69 63 61 74 65 20 63 68 65 63 6b 73 2e 20 ificate checks.
af20: 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 68 61 SSL_set1_host ha
af30: 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a s limitations. *
af40: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 /..if (!SSL_add1
af50: 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e _host(statePtr->
af60: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 ssl, servername)
af70: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
af80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
af90: 2c 20 22 73 65 74 74 69 6e 67 20 44 4e 53 20 68 , "setting DNS h
afa0: 6f 73 74 20 6e 61 6d 65 20 66 61 69 6c 65 64 22 ost name failed"
afb0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
afc0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
afd0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
afe0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
aff0: 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 "HOSTNAME", "FA
b000: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
b010: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
b020: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
b030: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
b040: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
b050: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
b060: 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 Resume session
b070: 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 id */. if (se
b080: 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c ssion_id && strl
b090: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c en(session_id) <
b0a0: 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 = SSL_MAX_SID_CT
b0b0: 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 X_LENGTH) {../*
b0c0: 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_set_session(
b0d0: 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 ) */..if (!SSL_S
b0e0: 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 ESSION_set1_id_c
b0f0: 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 ontext(SSL_get_s
b100: 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d ession(statePtr-
b110: 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 >ssl), session_i
b120: 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 d, (unsigned int
b130: 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e ) strlen(session
b140: 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 _id))) {.. Tc
b150: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
b160: 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 nterp, "Resume s
b170: 65 73 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 ession id ", ses
b180: 73 69 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 sion_id, " faile
b190: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
b1a0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
b1b0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
b1c0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
b1d0: 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 ", "SESSION", "F
b1e0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
b1f0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 NULL);.
b200: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
b210: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
b220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 . ret
b230: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
b240: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 }. }.. if
b250: 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e (alpn) {../* Con
b260: 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20 vert a TCL list
b270: 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d into a protocol-
b280: 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 list in wire-for
b290: 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 mat */..unsigned
b2a0: 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a char *protos, *
b2b0: 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 p;..unsigned int
b2c0: 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b protos_len = 0;
b2d0: 0a 09 69 6e 74 20 69 2c 20 6c 65 6e 2c 20 63 6e ..int i, len, cn
b2e0: 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 t;..Tcl_Obj **li
b2f0: 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 st;...if (Tcl_Li
b300: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 stObjGetElements
b310: 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 (interp, alpn, &
b320: 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 cnt, &list) != T
b330: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c CL_OK) {.. Tl
b340: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
b350: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
b360: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
b370: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d ;..}.../* Determ
b380: 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 ine the memory r
b390: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 equired for the
b3a0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f protocol-list */
b3b0: 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 ..for (i = 0; i
b3c0: 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 < cnt; i++) {..
b3d0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 Tcl_GetString
b3e0: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c FromObj(list[i],
b3f0: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 &len);.. if
b400: 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 (len > 255) {...
b410: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
b420: 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 (interp, "ALPN p
b430: 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f 6f rotocol name too
b440: 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 long", (char *)
b450: 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 NULL);...Tcl_Se
b460: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
b470: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
b480: 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 T", "ALPN", "FAI
b490: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
b4a0: 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 ULL);...Tls_Free
b4b0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
b4c0: 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 tr);...return TC
b4d0: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
b4e0: 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 . protos_len
b4f0: 2b 3d 20 31 20 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a += 1 + len;..}..
b500: 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f ./* Build the co
b510: 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d mplete protocol-
b520: 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 list */..protos
b530: 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 = ckalloc(protos
b540: 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f _len);../* proto
b550: 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 col-lists consis
b560: 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 t of 8-bit lengt
b570: 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 h-prefixed, byte
b580: 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 strings */..for
b590: 20 28 69 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f (i = 0, p = pro
b5a0: 74 6f 73 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b tos; i < cnt; i+
b5b0: 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a +) {.. char *
b5c0: 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 str = Tcl_GetStr
b5d0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b ingFromObj(list[
b5e0: 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 i], &len);..
b5f0: 2a 70 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 20 20 20 *p++ = len;..
b600: 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 memcpy(p, str,
b610: 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 len);.. p +=
b620: 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c len;..}.../* SSL
b630: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 _set_alpn_protos
b640: 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 makes a copy of
b650: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 the protocol-li
b660: 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 st */../* Note:
b670: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 This functions r
b680: 65 76 65 72 73 65 73 20 74 68 65 20 72 65 74 75 everses the retu
b690: 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 rn value convent
b6a0: 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f ion */..if (SSL_
b6b0: 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 set_alpn_protos(
b6c0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 statePtr->ssl, p
b6d0: 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 rotos, protos_le
b6e0: 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 n)) {.. Tcl_A
b6f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
b700: 72 70 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73 rp, "failed to s
b710: 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c et ALPN protocol
b720: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c s", (char *) NUL
b730: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
b740: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
b750: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
b760: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c ", "ALPN", "FAIL
b770: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
b780: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
b790: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
b7a0: 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 ePtr);.. ckfr
b7b0: 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 ee(protos);..
b7c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
b7d0: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 R;..}.../* Store
b7e0: 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 protocols list
b7f0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 */..statePtr->pr
b800: 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 otos = protos;..
b810: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
b820: 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 _len = protos_le
b830: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a n;. } else {.
b840: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
b850: 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 s = NULL;..state
b860: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 Ptr->protos_len
b870: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 = 0;. }..
b880: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 /*. * SSL Ca
b890: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a llbacks. */.
b8a0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f SSL_set_app_
b8b0: 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 data(statePtr->s
b8c0: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 sl, (void *)stat
b8d0: 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 ePtr);./* point
b8e0: 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 back to us */.
b8f0: 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 SSL_set_verify
b900: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
b910: 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 verify, VerifyCa
b920: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c llback);. SSL
b930: 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 _set_info_callba
b940: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ck(statePtr->ssl
b950: 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b , InfoCallback);
b960: 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 .. /* Callbac
b970: 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 k for observing
b980: 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 protocol message
b990: 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 s */.#ifndef OPE
b9a0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 NSSL_NO_SSL_TRAC
b9b0: 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 E. /* void SS
b9c0: 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 L_CTX_set_msg_ca
b9d0: 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 llback_arg(state
b9e0: 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 Ptr->ctx, (void
b9f0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 *)statePtr);.
ba00: 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 void SSL_CTX_se
ba10: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 t_msg_callback(s
ba20: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 tatePtr->ctx, Me
ba30: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 ssageCallback);
ba40: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d */. SSL_set_m
ba50: 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 sg_callback_arg(
ba60: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 statePtr->ssl, (
ba70: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
ba80: 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 ;. SSL_set_ms
ba90: 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 g_callback(state
baa0: 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 Ptr->ssl, Messag
bab0: 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 eCallback);.#end
bac0: 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 if.. /* Creat
bad0: 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 e Tcl_Channel BI
bae0: 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 O Handler */.
baf0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
bb00: 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 .= BIO_new_tcl(s
bb10: 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 tatePtr, BIO_NOC
bb20: 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 LOSE);. state
bb30: 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e Ptr->bio.= BIO_n
bb40: 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b ew(BIO_f_ssl());
bb50: 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 .. if (server
bb60: 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 ) {../* Server c
bb70: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c allbacks */..SSL
bb80: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f _CTX_set_tlsext_
bb90: 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 servername_arg(s
bba0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 tatePtr->ctx, (v
bbb0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
bbc0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c ..SSL_CTX_set_tl
bbd0: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f sext_servername_
bbe0: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
bbf0: 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 r->ctx, SNICallb
bc00: 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ack);..SSL_CTX_s
bc10: 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f et_client_hello_
bc20: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 cb(statePtr->ctx
bc30: 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c , HelloCallback,
bc40: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
bc50: 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 r);..if (statePt
bc60: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c r->protos != NUL
bc70: 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 L) {.. SSL_CT
bc80: 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 X_set_alpn_selec
bc90: 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 t_cb(statePtr->c
bca0: 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b tx, ALPNCallback
bcb0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
bcc0: 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f tr);.#ifdef USE_
bcd0: 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73 NPN.. if (tls
bce0: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 1_2 == 0 && tls1
bcf0: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c _3 == 0) {...SSL
bd00: 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 _CTX_set_next_pr
bd10: 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f otos_advertised_
bd20: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 cb(statePtr->ctx
bd30: 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 , NPNCallback, (
bd40: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
bd50: 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a ;.. }.#endif.
bd60: 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 .}.../* Enable s
bd70: 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65 erver to send ce
bd80: 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65 72 rt request after
bd90: 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 handshake (TLS
bda0: 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 1.3 only) */../*
bdb0: 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 A write operati
bdc0: 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 on must take pla
bdd0: 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 74 69 ce for the Certi
bde0: 66 69 63 61 74 65 20 52 65 71 75 65 73 74 20 74 ficate Request t
bdf0: 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f o be.. sent to
be00: 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 the client, thi
be10: 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 s can be done wi
be20: 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 th SSL_do_handsh
be30: 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 ake(). */..if (r
be40: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 equest && post_h
be50: 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 andshake) {..
be60: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 SSL_verify_clie
be70: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b nt_post_handshak
be80: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
be90: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 73 65 ;..}.../* Set se
bea0: 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 rver mode */..st
beb0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d atePtr->flags |=
bec0: 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b TLS_TCL_SERVER;
bed0: 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 ..SSL_set_accept
bee0: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d _state(statePtr-
bef0: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 >ssl);. } els
bf00: 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63 e {../* Client c
bf10: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64 allbacks */.#ifd
bf20: 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28 ef USE_NPN..if (
bf30: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
bf40: 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31 != NULL && tls1
bf50: 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f _2 == 0 && tls1_
bf60: 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 53 3 == 0) {.. S
bf70: 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f SL_CTX_set_next_
bf80: 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28 proto_select_cb(
bf90: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 statePtr->ctx, A
bfa0: 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f LPNCallback, (vo
bfb0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
bfc0: 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 .}.#endif.../* S
bfd0: 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a ession caching *
bfe0: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 /..SSL_CTX_set_s
bff0: 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 ession_cache_mod
c000: 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c e(statePtr->ctx,
c010: 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
c020: 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53 CLIENT | SSL_SES
c030: 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 S_CACHE_NO_INTER
c040: 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c NAL_STORE);..SSL
c050: 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65 _CTX_sess_set_ne
c060: 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 w_cb(statePtr->c
c070: 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 tx, SessionCallb
c080: 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c ack);.../* Enabl
c090: 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 e post handshake
c0a0: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 Authentication
c0b0: 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 extension. TLS 1
c0c0: 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 .3 only, not htt
c0d0: 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 p/2. */..if (req
c0e0: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e uest && post_han
c0f0: 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 dshake) {.. S
c100: 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64 SL_set_post_hand
c110: 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74 65 shake_auth(state
c120: 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d Ptr->ssl, 1);..}
c130: 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74 .../* Set client
c140: 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 mode */..SSL_se
c150: 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 t_connect_state(
c160: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
c170: 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 }. SSL_se
c180: 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e t_bio(statePtr->
c190: 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 ssl, statePtr->p
c1a0: 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e _bio, statePtr->
c1b0: 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f p_bio);. BIO_
c1c0: 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72 set_ssl(statePtr
c1d0: 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d ->bio, statePtr-
c1e0: 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 >ssl, BIO_NOCLOS
c1f0: 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 E);.. /*.
c200: 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e * End of SSL In
c210: 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 it. */. d
c220: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
c230: 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 g %s", Tcl_GetCh
c240: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
c250: 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 tr->self));.
c260: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
c270: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 terp, (char *) T
c280: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
c290: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
c2a0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 ), TCL_VOLATILE)
c2b0: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
c2c0: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 L_OK;..clientDat
c2d0: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a a = clientData;.
c2e0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
c2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
c330: 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d * UnimportObjCm
c340: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 d --. *. *.This
c350: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
c360: 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 oked to remove t
c370: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
c380: 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a el filter.. *. *
c390: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
c3a0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
c3b0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
c3c0: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d ffects:. *.May m
c3d0: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 odify the behavi
c3e0: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e or of an IO chan
c3f0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nel.. *. *------
c400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
c440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 /.static int.Uni
c450: 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 mportObjCmd(Clie
c460: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
c470: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
c480: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
c490: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
c4a0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
c4b0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 l_Channel chan;.
c4c0: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 ./* The channel
c4d0: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e to set a mode on
c4e0: 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 . */.. dprint
c4f0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
c500: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 if (objc != 2)
c510: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
c520: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
c530: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 objv, "channel")
c540: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
c550: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
c560: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
c570: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 annel(interp, Tc
c580: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
c590: 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 [1]), NULL);.
c5a0: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
c5b0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
c5c0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
c5d0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
c5e0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f /* Make sure to
c5f0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
c600: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
c610: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
c620: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
c630: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 chan);.. if (
c640: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
c650: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
c660: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
c670: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
c680: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 lt(interp, "bad
c690: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c channel \"", Tcl
c6a0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
c6b0: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f chan),..."\": no
c6c0: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 t a TLS channel"
c6d0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 , NULL);.. Tc
c6e0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
c6f0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 nterp, "TLS", "U
c700: 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e NIMPORT", "CHANN
c710: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 EL", "INVALID",
c720: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
c730: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
c740: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 R;. }.. if
c750: 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 (Tcl_UnstackCha
c760: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 nnel(interp, cha
c770: 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 n) == TCL_ERROR)
c780: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
c790: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
c7a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
c7b0: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
c7c0: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
c7d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c810: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 ------. *. * CTX
c820: 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 _Init -- constru
c830: 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 ct a SSL_CTX ins
c840: 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 tance. *. * Resu
c850: 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 lts:. *.A valid
c860: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 SSL_CTX instance
c870: 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 or NULL.. *. *
c880: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
c890: 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 .constructs SSL
c8a0: 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a context (CTX). *
c8b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
c8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c8f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
c900: 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f c SSL_CTX *.CTX_
c910: 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 Init(State *stat
c920: 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 ePtr, int isServ
c930: 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 er, int proto, c
c940: 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 har *keyfile, ch
c950: 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 ar *certfile,.
c960: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
c970: 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 *key, unsigned c
c980: 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b har *cert, int k
c990: 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 ey_len, int cert
c9a0: 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 _len, char *CAdi
c9b0: 72 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 r,. char *CAf
c9c0: 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 ile, char *ciphe
c9d0: 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 rs, char *cipher
c9e0: 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 suites, int leve
c9f0: 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d l, char *DHparam
ca00: 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 s) {. Tcl_Int
ca10: 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 erp *interp = st
ca20: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
ca30: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 SSL_CTX *ctx
ca40: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
ca50: 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 _DString ds;.
ca60: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 Tcl_DString ds1
ca70: 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 ;. int off =
ca80: 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 0;. int load_
ca90: 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 private_key;.
caa0: 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f const SSL_METHO
cab0: 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 D *method;..
cac0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
cad0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f );.. if (!pro
cae0: 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e to) {..Tcl_Appen
caf0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
cb00: 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 "no valid protoc
cb10: 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 4e 55 ol selected", NU
cb20: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
cb30: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a L;. }.. /*
cb40: 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 create SSL cont
cb50: 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 ext */.#if OPENS
cb60: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
cb70: 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c R >= 0x10100000L
cb80: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 || defined(NO_S
cb90: 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 SL2) || defined(
cba0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
cbb0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
cbc0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
cbd0: 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f O_SSL2)) {..Tcl_
cbe0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
cbf0: 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f erp, "SSL2 proto
cc00: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
cc10: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 d", NULL);..retu
cc20: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
cc30: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
cc40: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 d(NO_SSL3) || de
cc50: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
cc60: 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 _SSL3). if (E
cc70: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
cc80: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b S_PROTO_SSL3)) {
cc90: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
cca0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 lt(interp, "SSL3
ccb0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
ccc0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
ccd0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
cce0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
ccf0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
cd00: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
cd10: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 SSL_NO_TLS1).
cd20: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
cd30: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
cd40: 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 S1)) {..Tcl_Appe
cd50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
cd60: 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 "TLS 1.0 protoc
cd70: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
cd80: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
cd90: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
cda0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
cdb0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 (NO_TLS1_1) || d
cdc0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
cdd0: 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 O_TLS1_1). if
cde0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
cdf0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
ce00: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 1)) {..Tcl_Appen
ce10: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
ce20: 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f "TLS 1.1 protoco
ce30: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
ce40: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
ce50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
ce60: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
ce70: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 NO_TLS1_2) || de
ce80: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
ce90: 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 _TLS1_2). if
cea0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
ceb0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 TLS_PROTO_TLS1_2
cec0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
ced0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
cee0: 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c TLS 1.2 protocol
cef0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
cf00: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
cf10: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
cf20: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
cf30: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 O_TLS1_3) || def
cf40: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
cf50: 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 TLS1_3). if (
cf60: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
cf70: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
cf80: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
cf90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 esult(interp, "T
cfa0: 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 LS 1.3 protocol
cfb0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
cfc0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
cfd0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
cfe0: 66 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 f.. switch (p
cff0: 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e roto) {.#if OPEN
d000: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
d010: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c ER < 0x10100000L
d020: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f && !defined(NO_
d030: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 SSL2) && !define
d040: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
d050: 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 2). case TLS_
d060: 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 PROTO_SSL2:..met
d070: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
d080: 20 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 SSLv2_server_me
d090: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 thod() : SSLv2_c
d0a0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
d0b0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
d0c0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 if !defined(NO_S
d0d0: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
d0e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
d0f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d100: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 ENSSL_NO_SSL3_ME
d110: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 THOD). case T
d120: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 LS_PROTO_SSL3:..
d130: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
d140: 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 r ? SSLv3_server
d150: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 _method() : SSLv
d160: 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 3_client_method(
d170: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
d180: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
d190: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
d1a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d1b0: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
d1c0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d1d0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 _METHOD). cas
d1e0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
d1f0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 :..method = isSe
d200: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 rver ? TLSv1_ser
d210: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 ver_method() : T
d220: 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 LSv1_client_meth
d230: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
d240: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
d250: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 d(NO_TLS1_1) &&
d260: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
d270: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 _NO_TLS1_1) && !
d280: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d290: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 NO_TLS1_1_METHOD
d2a0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
d2b0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 ROTO_TLS1_1:..me
d2c0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
d2d0: 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 ? TLSv1_1_server
d2e0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 _method() : TLSv
d2f0: 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 1_1_client_metho
d300: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
d310: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
d320: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 (NO_TLS1_2) && !
d330: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d340: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
d350: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d360: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 O_TLS1_2_METHOD)
d370: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
d380: 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 OTO_TLS1_2:..met
d390: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
d3a0: 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f TLSv1_2_server_
d3b0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 method() : TLSv1
d3c0: 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 _2_client_method
d3d0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
d3e0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
d3f0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
d400: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d410: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 O_TLS1_3). ca
d420: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
d430: 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 1_3:../* Use the
d440: 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 generic method
d450: 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 and constraint r
d460: 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 ange after conte
d470: 78 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f xt is created */
d480: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
d490: 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 ver ? TLS_server
d4a0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f _method() : TLS_
d4b0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
d4c0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
d4d0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a default:../*
d4e0: 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 Negotiate highe
d4f0: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c st available SSL
d500: 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a /TLS version */.
d510: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
d520: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f er ? TLS_server_
d530: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 method() : TLS_c
d540: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
d550: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
d560: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
d570: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
d580: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
d590: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
d5a0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 L_NO_SSL2)..off
d5b0: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
d5c0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c o, TLS_PROTO_SSL
d5d0: 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 2) ? 0 : SSL_O
d5e0: 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e P_NO_SSLv2);.#en
d5f0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
d600: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 (NO_SSL3) && !de
d610: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d620: 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 _SSL3)..off |= (
d630: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
d640: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 LS_PROTO_SSL3)
d650: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
d660: 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a _SSLv3);.#endif.
d670: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
d680: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 TLS1) && !define
d690: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d6a0: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 1)..off |= (ENAB
d6b0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
d6c0: 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 ROTO_TLS1) ? 0
d6d0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
d6e0: 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 v1);.#endif.#if
d6f0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
d700: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
d710: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
d720: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 1)..off |= (ENAB
d730: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
d740: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 ROTO_TLS1_1) ? 0
d750: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
d760: 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 v1_1);.#endif.#i
d770: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
d780: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
d790: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d7a0: 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 1_2)..off |= (EN
d7b0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
d7c0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f _PROTO_TLS1_2) ?
d7d0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
d7e0: 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a LSv1_2);.#endif.
d7f0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
d800: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
d810: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d820: 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 LS1_3)..off |= (
d830: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
d840: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
d850: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
d860: 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 _TLSv1_3);.#endi
d870: 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a f..break;. }.
d880: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
d890: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 rror();.. ctx
d8a0: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d = SSL_CTX_new(m
d8b0: 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 ethod);. if (
d8c0: 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 !ctx) {..return(
d8d0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL);. }..
d8e0: 20 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c if (getenv(SSL
d8f0: 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 KEYLOGFILE)) {..
d900: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c SSL_CTX_set_keyl
d910: 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c og_callback(ctx,
d920: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 KeyLogCallback)
d930: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 ;. }..#if !de
d940: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
d950: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d960: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
d970: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d if (proto ==
d980: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
d990: 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 3) {..SSL_CTX_se
d9a0: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 t_min_proto_vers
d9b0: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
d9c0: 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 VERSION);..SSL_C
d9d0: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f TX_set_max_proto
d9e0: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
d9f0: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 S1_3_VERSION);.
da00: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 }.#endif..
da10: 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 /* Force cipher
da20: 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 selection order
da30: 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 by server */.
da40: 20 20 69 66 20 28 21 69 73 53 65 72 76 65 72 29 if (!isServer)
da50: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
da60: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c options(ctx, SSL
da70: 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 _OP_CIPHER_SERVE
da80: 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 R_PREFERENCE);.
da90: 20 20 20 7d 0a 0a 20 20 20 20 53 53 4c 5f 43 54 }.. SSL_CT
daa0: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 X_set_app_data(c
dab0: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 tx, (void*)inter
dac0: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 p);./* remember
dad0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
dae0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
daf0: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
db00: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 SSL_OP_ALL);./*
db10: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b all SSL bug work
db20: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 arounds */. S
db30: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
db40: 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f ns(ctx, off);../
db50: 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 * disable protoc
db60: 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 ol versions */.#
db70: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
db80: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
db90: 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 101000L. SSL_
dba0: 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 CTX_set_mode(ctx
dbb0: 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f , SSL_MODE_AUTO_
dbc0: 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c RETRY);./* handl
dbd0: 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 e new handshakes
dbe0: 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 in background.
dbf0: 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e On by default in
dc00: 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 OpenSSL 1.1.1.
dc10: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 */.#endif. SS
dc20: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 L_CTX_sess_set_c
dc30: 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 ache_size(ctx, 1
dc40: 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 28);.. /* Set
dc50: 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 user defined ci
dc60: 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 phers, cipher su
dc70: 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 ites, and securi
dc80: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 ty level */.
dc90: 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 if ((ciphers !=
dca0: 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 NULL) && !SSL_CT
dcb0: 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 X_set_cipher_lis
dcc0: 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 t(ctx, ciphers))
dcd0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
dce0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 sult(interp, "Se
dcf0: 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 t ciphers failed
dd00: 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 : No valid ciphe
dd10: 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 rs", (char *) NU
dd20: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 LL);..SSL_CTX_fr
dd30: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e ee(ctx);..return
dd40: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
dd50: 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69 74 if ((ciphersuit
dd60: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 es != NULL) && !
dd70: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 SSL_CTX_set_ciph
dd80: 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 ersuites(ctx, ci
dd90: 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 phersuites)) {..
dda0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
ddb0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 (interp, "Set ci
ddc0: 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c pher suites fail
ddd0: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 ed: No valid cip
dde0: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 hers", (char *)
ddf0: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f NULL);..SSL_CTX_
de00: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 free(ctx);..retu
de10: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a rn NULL;. }..
de20: 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 /* Set secur
de30: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 ity level */.
de40: 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 if (level > -1
de50: 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a && level < 6) {.
de60: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 ./* SSL_set_secu
de70: 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 rity_level */..S
de80: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 SL_CTX_set_secur
de90: 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c ity_level(ctx, l
dea0: 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 evel);. }..
deb0: 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 /* set some ca
dec0: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 llbacks */. S
ded0: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 SL_CTX_set_defau
dee0: 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 lt_passwd_cb(ctx
def0: 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 , PasswordCallba
df00: 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 ck);. SSL_CTX
df10: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 _set_default_pas
df20: 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 swd_cb_userdata(
df30: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ctx, (void *)sta
df40: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 tePtr);.. /*
df50: 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 read a Diffie-He
df60: 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 llman parameters
df70: 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 file, or use th
df80: 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a e built-in one *
df90: 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c /.#ifdef OPENSSL
dfa0: 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 _NO_DH. if (D
dfb0: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 Hparams != NULL)
dfc0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
dfd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 sult(interp, "DH
dfe0: 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f parameter suppo
dff0: 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 rt not available
e000: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
e010: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
e020: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e (ctx);..return N
e030: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 ULL;. }.#else
e040: 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a . {..DH* dh;.
e050: 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d .if (DHparams !=
e060: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 NULL) {.. BI
e070: 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c O *bio;.. Tcl
e080: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
e090: 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 );.. bio = BI
e0a0: 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 O_new_file(F2N(D
e0b0: 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 Hparams, &ds), "
e0c0: 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 r");.. if (!b
e0d0: 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 io) {...Tcl_DStr
e0e0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 ingFree(&ds);...
e0f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
e100: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 (interp, "Could
e110: 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 not find DH para
e120: 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 meters file", (c
e130: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
e140: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
e150: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
e160: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 ;.. }... d
e170: 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f h = PEM_read_bio
e180: 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e _DHparams(bio, N
e190: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 ULL, NULL, NULL)
e1a0: 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 ;.. BIO_free(
e1b0: 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 bio);.. Tcl_D
e1c0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
e1d0: 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b .. if (!dh) {
e1e0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
e1f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 ult(interp, "Cou
e200: 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 ld not read DH p
e210: 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 arameters from f
e220: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ile", (char *) N
e230: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
e240: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
e250: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
e260: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
e270: 64 68 20 3d 20 67 65 74 5f 64 68 50 61 72 61 6d dh = get_dhParam
e280: 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 s();..}..SSL_CTX
e290: 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c _set_tmp_dh(ctx,
e2a0: 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 dh);..DH_free(d
e2b0: 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 h);. }.#endif
e2c0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 .. /* set our
e2d0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
e2e0: 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 load_private
e2f0: 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 _key = 0;. if
e300: 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 (certfile != NU
e310: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 LL) {..load_priv
e320: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 ate_key = 1;...T
e330: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
e340: 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 ds);...if (SSL_C
e350: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 TX_use_certifica
e360: 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e te_file(ctx, F2N
e370: 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c (certfile, &ds),
e380: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 SSL_FILETYPE_PE
e390: 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 M) <= 0) {..
e3a0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
e3b0: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 &ds);.. Tcl_A
e3c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
e3d0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
e3e0: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 et certificate f
e3f0: 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c ile ", certfile,
e400: 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 ": ",.... R
e410: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
e420: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 ) NULL);.. SS
e430: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
e440: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
e450: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 L;..}. } else
e460: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c if (cert != NUL
e470: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 L) {..load_priva
e480: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 te_key = 1;..if
e490: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 (SSL_CTX_use_cer
e4a0: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 tificate_ASN1(ct
e4b0: 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 x, cert_len, cer
e4c0: 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 t) <= 0) {..
e4d0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
e4e0: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 &ds);.. Tcl_A
e4f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
e500: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
e510: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 et certificate:
e520: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f ",.... REASO
e530: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
e540: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
e550: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
e560: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 return NULL;..
e570: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 }. } else {..
e580: 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72 certfile = (char
e590: 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 *)X509_get_defau
e5a0: 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a lt_cert_file();.
e5b0: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 ..if (SSL_CTX_us
e5c0: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 e_certificate_fi
e5d0: 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65 le(ctx, certfile
e5e0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 , SSL_FILETYPE_P
e5f0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 EM) <= 0) {.#if
e600: 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 0.. Tcl_DStri
e610: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 ngFree(&ds);..
e620: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
e630: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 lt(interp, "unab
e640: 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c le to use defaul
e650: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 t certificate fi
e660: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 le ", certfile,
e670: 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 ": ",.... RE
e680: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
e690: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
e6a0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
e6b0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
e6c0: 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 ;.#endif..}.
e6d0: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 }.. /* set ou
e6e0: 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f r private key */
e6f0: 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 . if (load_pr
e700: 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 ivate_key) {..if
e710: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c (keyfile == NUL
e720: 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c L && key == NULL
e730: 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 ) {.. keyfile
e740: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a = certfile;..}.
e750: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d ..if (keyfile !=
e760: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a NULL) {.. /*
e770: 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 get the private
e780: 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 key associated
e790: 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 with this certif
e7a0: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 icate */.. if
e7b0: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c (keyfile == NUL
e7c0: 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d L) {...keyfile =
e7d0: 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 certfile;..
e7e0: 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f }... if (SSL_
e7f0: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b CTX_use_PrivateK
e800: 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e ey_file(ctx, F2N
e810: 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 (keyfile, &ds),
e820: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
e830: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f ) <= 0) {...Tcl_
e840: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
e850: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 ;.../* flush the
e860: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 passphrase whic
e870: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 h might be left
e880: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f in the result */
e890: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
e8a0: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 (interp, NULL, T
e8b0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 CL_STATIC);...Tc
e8c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e8d0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
e8e0: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 o set public key
e8f0: 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 file ", keyfile
e900: 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20 20 , " ",....
e910: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 REASON(), (ch
e920: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
e930: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
e940: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
e950: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
e960: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
e970: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 );...} else if (
e980: 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 key != NULL) {..
e990: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f if (SSL_CTX_
e9a0: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 use_PrivateKey_A
e9b0: 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 SN1(EVP_PKEY_RSA
e9c0: 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c , ctx, key,key_l
e9d0: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 en) <= 0) {...Tc
e9e0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
e9f0: 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 s);.../* flush t
ea00: 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 he passphrase wh
ea10: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 ich might be lef
ea20: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 t in the result
ea30: 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 */...Tcl_SetResu
ea40: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c lt(interp, NULL,
ea50: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 TCL_STATIC);...
ea60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
ea70: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
ea80: 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b to set public k
ea90: 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c ey: ", REASON(),
eaa0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
eab0: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
eac0: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e ctx);...return N
ead0: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 ULL;.. }..}..
eae0: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 /* Now we know t
eaf0: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 hat a key and ce
eb00: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 rt have been set
eb10: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 against.. * the
eb20: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
eb30: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 .if (!SSL_CTX_ch
eb40: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 eck_private_key(
eb50: 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c ctx)) {.. Tcl
eb60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
eb70: 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b terp, "private k
eb80: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 ey does not matc
eb90: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 h the certificat
eba0: 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 e public key",..
ebb0: 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 .. (char *)
ebc0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
ebd0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
ebe0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
ebf0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
ec00: 2a 20 53 65 74 20 76 65 72 69 66 69 63 61 74 69 * Set verificati
ec10: 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 on CAs */. Tc
ec20: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 l_DStringInit(&d
ec30: 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 s);. Tcl_DStr
ec40: 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 ingInit(&ds1);.
ec50: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f if (!SSL_CTX_
ec60: 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 load_verify_loca
ec70: 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 tions(ctx, F2N(C
ec80: 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e Afile, &ds), F2N
ec90: 28 43 41 64 69 72 2c 20 26 64 73 31 29 29 20 7c (CAdir, &ds1)) |
eca0: 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f |..!SSL_CTX_set_
ecb0: 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 default_verify_p
ecc0: 61 74 68 73 28 63 74 78 29 29 20 7b 0a 23 69 66 aths(ctx)) {.#if
ecd0: 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 0..Tcl_DStringF
ece0: 72 65 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 ree(&ds);..Tcl_D
ecf0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 StringFree(&ds1)
ed00: 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 ;../* Don't curr
ed10: 65 6e 74 6c 79 20 63 61 72 65 20 69 66 20 74 68 ently care if th
ed20: 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c is fails */..Tcl
ed30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
ed40: 74 65 72 70 2c 20 22 53 53 4c 20 64 65 66 61 75 terp, "SSL defau
ed50: 6c 74 20 76 65 72 69 66 79 20 70 61 74 68 73 3a lt verify paths:
ed60: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 ", REASON(), (c
ed70: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 har *) NULL);..S
ed80: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
ed90: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
eda0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
edb0: 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 /* https://sou
edc0: 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 rceforge.net/p/t
edd0: 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 ls/bugs/57/ */.
ede0: 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 /* XXX:TODO:
edf0: 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70 Let the user sup
ee00: 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 ply values here
ee10: 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 instead of somet
ee20: 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 hing that exists
ee30: 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 on the filesyst
ee40: 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 em */. if (CA
ee50: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
ee60: 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e .STACK_OF(X509_N
ee70: 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 AME) *certNames
ee80: 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e = SSL_load_clien
ee90: 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 t_CA_file(F2N(CA
eea0: 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 file, &ds));..if
eeb0: 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e (certNames != N
eec0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f ULL) {.. SSL_
eed0: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 CTX_set_client_C
eee0: 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 A_list(ctx, cert
eef0: 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d Names);..}. }
ef00: 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
ef10: 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 gFree(&ds);.
ef20: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
ef30: 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72 &ds1);. retur
ef40: 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a n ctx;.}.../*. *
ef50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ef60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ef70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ef80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ef90: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 ---. *. * Status
efa0: 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
efb0: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 certificate for
efc0: 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e connected peer.
efd0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
efe0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
eff0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
f000: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
f010: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
f020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
f060: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
f070: 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 tatusObjCmd(Clie
f080: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
f090: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
f0a0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
f0b0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
f0c0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 objv[]) {. St
f0d0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 ate *statePtr;.
f0e0: 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 X509 *peer;.
f0f0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
f100: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e tr;. Tcl_Chan
f110: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 nel chan;. ch
f120: 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c ar *channelName,
f130: 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 *ciphers;. i
f140: 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e nt mode;. con
f150: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
f160: 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 *proto;. uns
f170: 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 igned int len;.
f180: 20 20 20 69 6e 74 20 6e 69 64 3b 0a 0a 20 20 20 int nid;..
f190: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
f1a0: 22 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 ");.. switch
f1b0: 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73 65 20 32 (objc) {..case 2
f1c0: 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 :.. channelNa
f1d0: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 me = Tcl_GetStri
f1e0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 ngFromObj(objv[1
f1f0: 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 ], NULL);.. b
f200: 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 33 3a 0a reak;...case 3:.
f210: 09 20 20 20 20 69 66 20 28 21 73 74 72 63 6d 70 . if (!strcmp
f220: 20 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 20 (Tcl_GetString
f230: 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 (objv[1]), "-loc
f240: 61 6c 22 29 29 20 7b 0a 09 09 63 68 61 6e 6e 65 al")) {...channe
f250: 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 lName = Tcl_GetS
f260: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
f270: 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 09 62 v[2], NULL);...b
f280: 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 reak;.. }..
f290: 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 2d 74 /* else fall-t
f2a0: 68 72 6f 75 67 68 20 2e 2e 2e 20 2a 2f 0a 23 69 hrough ... */.#i
f2b0: 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 f defined(__GNUC
f2c0: 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 74 74 72 69 __).. __attri
f2d0: 62 75 74 65 5f 5f 28 28 66 61 6c 6c 74 68 72 6f bute__((fallthro
f2e0: 75 67 68 29 29 3b 0a 23 65 6e 64 69 66 0a 09 64 ugh));.#endif..d
f2f0: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 54 63 6c efault:.. Tcl
f300: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
f310: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
f320: 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c ?-local? channel
f330: 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ");.. return
f340: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
f350: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
f360: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
f370: 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c rp, channelName,
f380: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 &mode);. if
f390: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
f3a0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
f3b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
f3c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4d ;. }. /* M
f3d0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
f3e0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
f3f0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
f400: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
f410: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
f420: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 ;. if (Tcl_Ge
f430: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
f440: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
f450: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f lType()) {..Tcl_
f460: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f470: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
f480: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
f490: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
f4a0: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c ..."\": not a TL
f4b0: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c S channel", NULL
f4c0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
f4d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
f4e0: 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 S", "STATUS", "C
f4f0: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
f500: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
f510: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
f520: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
f530: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
f540: 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 te *) Tcl_GetCha
f550: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
f560: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 (chan);.. /*
f570: 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 Get certificate
f580: 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 for peer or self
f590: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
f5a0: 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d == 2) {..peer =
f5b0: 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 SSL_get_peer_ce
f5c0: 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 rtificate(stateP
f5d0: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 tr->ssl);. }
f5e0: 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 else {..peer = S
f5f0: 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 SL_get_certifica
f600: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
f610: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 );. }. if
f620: 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 (peer) {..objPtr
f630: 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 = Tls_NewX509Ob
f640: 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b j(interp, peer);
f650: 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 ..if (objc == 2)
f660: 20 7b 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 { X509_free(pee
f670: 72 29 3b 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 r); }. } else
f680: 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c {..objPtr = Tcl
f690: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
f6a0: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ULL);. }..
f6b0: 20 2f 2a 20 50 65 65 72 20 63 65 72 74 20 63 68 /* Peer cert ch
f6c0: 61 69 6e 20 28 63 6c 69 65 6e 74 20 6f 6e 6c 79 ain (client only
f6d0: 29 20 2a 2f 0a 20 20 20 20 53 54 41 43 4b 5f 4f ) */. STACK_O
f6e0: 46 28 58 35 30 39 29 2a 20 73 73 6c 5f 63 65 72 F(X509)* ssl_cer
f6f0: 74 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 ts = SSL_get_pee
f700: 72 5f 63 65 72 74 5f 63 68 61 69 6e 28 73 74 61 r_cert_chain(sta
f710: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
f720: 20 69 66 20 28 21 70 65 65 72 20 26 26 20 28 73 if (!peer && (s
f730: 73 6c 5f 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c sl_certs == NULL
f740: 20 7c 7c 20 73 6b 5f 58 35 30 39 5f 6e 75 6d 28 || sk_X509_num(
f750: 73 73 6c 5f 63 65 72 74 73 29 20 3d 3d 20 30 29 ssl_certs) == 0)
f760: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f ) {..Tcl_SetErro
f770: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
f780: 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 LS", "STATUS", "
f790: 43 45 52 54 49 46 49 43 41 54 45 22 2c 20 28 63 CERTIFICATE", (c
f7a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
f7b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
f7c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 . }.. /* P
f7d0: 65 65 72 20 6e 61 6d 65 20 66 72 6f 6d 20 63 65 eer name from ce
f7e0: 72 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 rt */. Tcl_Li
f7f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f800: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f810: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
f820: 4f 62 6a 28 22 70 65 65 72 6e 61 6d 65 22 2c 20 Obj("peername",
f830: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
f840: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f850: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f860: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
f870: 4f 62 6a 28 53 53 4c 5f 67 65 74 30 5f 70 65 65 Obj(SSL_get0_pee
f880: 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e rname(statePtr->
f890: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 ssl), -1));..
f8a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
f8b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f8c0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f8d0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 62 69 74 wStringObj("sbit
f8e0: 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 s", -1));. Tc
f8f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
f900: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
f910: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e bjPtr, Tcl_NewIn
f920: 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70 tObj(SSL_get_cip
f930: 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 74 her_bits(statePt
f940: 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b r->ssl, NULL)));
f950: 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 .. ciphers =
f960: 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 (char*)SSL_get_c
f970: 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e ipher(statePtr->
f980: 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 28 63 ssl);. if ((c
f990: 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 iphers != NULL)
f9a0: 26 26 20 28 73 74 72 63 6d 70 28 63 69 70 68 65 && (strcmp(ciphe
f9b0: 72 73 2c 20 22 28 4e 4f 4e 45 29 22 29 20 21 3d rs, "(NONE)") !=
f9c0: 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 0)) {..Tcl_List
f9d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f9e0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f9f0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
fa00: 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29 29 j("cipher", -1))
fa10: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
fa20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
fa30: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
fa40: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 69 70 NewStringObj(cip
fa50: 68 65 72 73 2c 20 2d 31 29 29 3b 0a 20 20 20 20 hers, -1));.
fa60: 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 }.. /* Verify
fa70: 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66 the X509 certif
fa80: 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20 icate presented
fa90: 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 by the peer */.
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 76 65 NewStringObj("ve
fae0: 72 69 66 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29 rification", -1)
faf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
fb00: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
fb10: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a interp, objPtr,.
fb20: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 .Tcl_NewStringOb
fb30: 6a 28 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 j(X509_verify_ce
fb40: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 rt_error_string(
fb50: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 SSL_get_verify_r
fb60: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e esult(statePtr->
fb70: 73 73 6c 29 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 ssl)), -1));..
fb80: 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 /* Report the
fb90: 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f selected protoco
fba0: 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 l as a result of
fbb0: 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e the negotiation
fbc0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 */. SSL_get0
fbd0: 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 _alpn_selected(s
fbe0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 tatePtr->ssl, &p
fbf0: 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 roto, &len);.
fc00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
fc10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
fc20: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
fc30: 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e wStringObj("alpn
fc40: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
fc50: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fc60: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fc70: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
fc80: 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 ingObj((char *)p
fc90: 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 29 roto, (int) len)
fca0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
fcb0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
fcc0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
fcd0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
fce0: 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 ("protocol", -1)
fcf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
fd00: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
fd10: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
fd20: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
fd30: 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e (SSL_get_version
fd40: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c (statePtr->ssl),
fd50: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 -1));.. /* V
fd60: 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 alid for non-RSA
fd70: 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54 signature and T
fd80: 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 54 63 LS 1.3 */. Tc
fd90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
fda0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
fdb0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
fdc0: 72 69 6e 67 4f 62 6a 28 22 73 69 67 6e 61 74 75 ringObj("signatu
fdd0: 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 reHashAlgorithm"
fde0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 , -1));. if (
fdf0: 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 53 53 4c 5f objc == 2 ? SSL_
fe00: 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 get_peer_signatu
fe10: 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d re_nid(statePtr-
fe20: 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20 53 53 >ssl, &nid) : SS
fe30: 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f L_get_signature_
fe40: 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
fe50: 6c 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54 63 6c l, &nid)) {..Tcl
fe60: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fe70: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fe80: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
fe90: 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c ingObj(OBJ_nid2l
fea0: 6e 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 20 20 n(nid), -1));.
feb0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f } else {..Tcl_
fec0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
fed0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
fee0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
fef0: 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a ngObj("", -1));.
ff00: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 }. Tcl_Li
ff10: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
ff20: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
ff30: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
ff40: 4f 62 6a 28 22 73 69 67 6e 61 74 75 72 65 5f 74 Obj("signature_t
ff50: 79 70 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ype", -1));.
ff60: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 if (objc == 2 ?
ff70: 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 SSL_get_peer_sig
ff80: 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 nature_type_nid(
ff90: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
ffa0: 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65 74 5f 73 nid) : SSL_get_s
ffb0: 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 ignature_type_ni
ffc0: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c d(statePtr->ssl,
ffd0: 20 26 6e 69 64 29 29 20 7b 0a 09 54 63 6c 5f 4c &nid)) {..Tcl_L
ffe0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
fff0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
10000 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
10010 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28 gObj(OBJ_nid2ln(
10020 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 nid), -1));.
10030 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 } else {..Tcl_Li
10040 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
10050 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
10060 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
10070 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 20 20 Obj("", -1));.
10080 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 }.. Tcl_Set
10090 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
100a0 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 , objPtr);. r
100b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
100c0 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
100d0 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ntData;.}.../*.
100e0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
100f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10120 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 ----. *. * Conne
10130 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 ctionInfoObjCmd
10140 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 -- return connec
10150 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f tion info from O
10160 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 penSSL.. *. * Re
10170 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 sults:. *.A list
10180 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 of connection i
10190 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nfo. *. *------
101a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
101b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
101c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
101d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
101e0 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f /..static int Co
101f0 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 nnectionInfoObjC
10200 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
10210 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
10220 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
10230 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
10240 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
10250 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
10260 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 chan;../* The c
10270 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 hannel to set a
10280 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 mode on. */.
10290 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
102a0 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 ../* client stat
102b0 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 e for ssl socket
102c0 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
102d0 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 63 6f 6e *objPtr;. con
102e0 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 st SSL *ssl;.
102f0 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 const SSL_CIPHE
10300 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 R *cipher;. c
10310 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e onst SSL_SESSION
10320 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 *session;. c
10330 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
10340 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 6c ar *proto;. l
10350 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 ong mode;.. i
10360 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
10370 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
10380 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
10390 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
103a0 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
103b0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 );. }.. ch
103c0 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
103d0 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f nel(interp, Tcl_
103e0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
103f0 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c (objv[1], NULL),
10400 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
10410 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
10420 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
10430 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
10440 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
10450 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
10460 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
10470 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
10480 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
10490 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
104a0 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 );. if (Tcl_G
104b0 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
104c0 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
104d0 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
104e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
104f0 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
10500 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
10510 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
10520 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 ,.. "\": not
10530 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 a TLS channel",
10540 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 NULL);..Tcl_SetE
10550 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
10560 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 "TLS", "CONNECT
10570 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c ION", "CHANNEL",
10580 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
10590 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
105a0 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
105b0 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 }.. objPt
105c0 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
105d0 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 bj(0, NULL);..
105e0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 /* Connection
105f0 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 info */. stat
10600 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
10610 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e Tcl_GetChannelIn
10620 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 stanceData(chan)
10630 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 ;. ssl = stat
10640 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 ePtr->ssl;. i
10650 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 f (ssl != NULL)
10660 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e {../* connection
10670 20 73 74 61 74 65 20 2a 2f 0a 09 54 63 6c 5f 4c state */..Tcl_L
10680 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10690 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
106a0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
106b0 67 4f 62 6a 28 22 73 74 61 74 65 22 2c 20 2d 31 gObj("state", -1
106c0 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
106d0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
106e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
106f0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 l_NewStringObj(S
10700 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f SL_state_string_
10710 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b long(ssl), -1));
10720 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 .../* Get SNI re
10730 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20 6e quested server n
10740 61 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 ame */..Tcl_List
10750 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
10760 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10770 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
10780 6a 28 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 j("servername",
10790 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
107a0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
107b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
107c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
107d0 28 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e (SSL_get_servern
107e0 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f ame(ssl, TLSEXT_
107f0 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 NAMETYPE_host_na
10800 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 me), -1));.../*
10810 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a Get protocol */.
10820 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
10830 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10840 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
10850 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 wStringObj("prot
10860 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63 ocol", -1));..Tc
10870 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10880 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
10890 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
108a0 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f ringObj(SSL_get_
108b0 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 version(ssl), -1
108c0 29 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 ));.../* Renegot
108d0 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a iation allowed *
108e0 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
108f0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10900 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
10910 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 NewStringObj("re
10920 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20 2d 31 negotiation", -1
10930 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
10940 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
10950 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
10960 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a l_NewStringObj(.
10970 09 20 20 20 20 53 53 4c 5f 67 65 74 5f 73 65 63 . SSL_get_sec
10980 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f ure_renegotiatio
10990 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 20 3f n_support(ssl) ?
109a0 20 22 73 75 70 70 6f 72 74 65 64 22 20 3a 20 22 "supported" : "
109b0 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
109c0 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 -1));.../* Get s
109d0 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f ecurity level */
109e0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
109f0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10a00 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
10a10 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 ewStringObj("sec
10a20 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 2d 31 29 uritylevel", -1)
10a30 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
10a40 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
10a50 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
10a60 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 _NewIntObj(SSL_g
10a70 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 et_security_leve
10a80 6c 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 53 l(ssl)));.../* S
10a90 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 ession info */..
10aa0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
10ab0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
10ac0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
10ad0 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 StringObj("sessi
10ae0 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d 31 29 29 on_reused", -1))
10af0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
10b00 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10b10 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
10b20 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 NewBooleanObj(SS
10b30 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 L_session_reused
10b40 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 49 73 (ssl)));.../* Is
10b50 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a server info */.
10b60 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
10b70 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10b80 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
10b90 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 73 5f 73 wStringObj("is_s
10ba0 65 72 76 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 erver", -1));..T
10bb0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10bc0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10bd0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 objPtr, Tcl_NewB
10be0 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f 69 73 ooleanObj(SSL_is
10bf0 5f 73 65 72 76 65 72 28 73 73 6c 29 29 29 3b 0a _server(ssl)));.
10c00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 }.. /* Ci
10c10 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 pher info */.
10c20 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 cipher = SSL_ge
10c30 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 t_current_cipher
10c40 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 (ssl);. if (c
10c50 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b ipher != NULL) {
10c60 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 ..char buf[BUFSI
10c70 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 Z] = {0};..int b
10c80 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a its, alg_bits;..
10c90 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
10ca0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10cb0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
10cc0 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 wStringObj("ciph
10cd0 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f er", -1));..Tcl_
10ce0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10cf0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
10d00 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10d10 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 ngObj(SSL_CIPHER
10d20 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 _get_name(cipher
10d30 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ), -1));..Tcl_Li
10d40 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
10d50 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
10d60 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
10d70 4f 62 6a 28 22 73 74 61 6e 64 61 72 64 5f 6e 61 Obj("standard_na
10d80 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f me", -1));..Tcl_
10d90 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10da0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
10db0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10dc0 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 ngObj(SSL_CIPHER
10dd0 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 _standard_name(c
10de0 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 ipher), -1));...
10df0 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 bits = SSL_CIPHE
10e00 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 R_get_bits(ciphe
10e10 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 r, &alg_bits);..
10e20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
10e30 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
10e40 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
10e50 53 74 72 69 6e 67 4f 62 6a 28 22 62 69 74 73 22 StringObj("bits"
10e60 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
10e70 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10e80 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10e90 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
10ea0 62 69 74 73 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 bits));..Tcl_Lis
10eb0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10ec0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10ed0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10ee0 62 6a 28 22 73 65 63 72 65 74 5f 62 69 74 73 22 bj("secret_bits"
10ef0 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
10f00 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10f10 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10f20 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
10f30 61 6c 67 5f 62 69 74 73 29 29 3b 0a 09 2f 2a 20 alg_bits));../*
10f40 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 alg_bits is actu
10f50 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 al key secret bi
10f60 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 ts. If use bits
10f70 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f and secret (algo
10f80 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 rithm) bits diff
10f90 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 er,.. the rest
10fa0 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 of the bits are
10fb0 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 fixed, i.e. for
10fc0 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 limited export
10fd0 63 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 ciphers (bits <
10fe0 35 36 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 56) */..Tcl_List
10ff0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
11000 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11010 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
11020 6a 28 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c j("min_version",
11030 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
11040 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
11050 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11060 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
11070 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 j(SSL_CIPHER_get
11080 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29 _version(cipher)
11090 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 , -1));.../* Get
110a0 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 OpenSSL-specifi
110b0 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 c ID, not IANA I
110c0 44 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 D */..Tcl_ListOb
110d0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
110e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
110f0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
11100 22 69 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c "id", -1));..Tcl
11110 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
11120 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
11130 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 jPtr, Tcl_NewInt
11140 4f 62 6a 28 28 69 6e 74 29 20 53 53 4c 5f 43 49 Obj((int) SSL_CI
11150 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 PHER_get_id(ciph
11160 65 72 29 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c er)));...if (SSL
11170 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 _CIPHER_descript
11180 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c ion(cipher, buf,
11190 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d sizeof(buf)) !=
111a0 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 NULL) {.. Tc
111b0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
111c0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
111d0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
111e0 72 69 6e 67 4f 62 6a 28 22 64 65 73 63 72 69 70 ringObj("descrip
111f0 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20 tion", -1));..
11200 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
11210 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
11220 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
11230 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c ewStringObj(buf,
11240 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a -1));..}. }.
11250 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 . /* Session
11260 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 info */. sess
11270 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 ion = SSL_get_se
11280 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 ssion(ssl);.
11290 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e if (session != N
112a0 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e ULL) {..const un
112b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 signed char *tic
112c0 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e ket;..size_t len
112d0 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 2;..unsigned int
112e0 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e ulen;..const un
112f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 signed char *ses
11300 73 69 6f 6e 5f 69 64 3b 0a 09 63 68 61 72 20 62 sion_id;..char b
11310 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 uffer[SSL_MAX_MA
11320 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d STER_KEY_LENGTH]
11330 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 ;.../* Report th
11340 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
11350 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
11360 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f of the ALPN nego
11370 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f tiation */..SSL_
11380 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 SESSION_get0_alp
11390 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 n_selected(sessi
113a0 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e on, &proto, &len
113b0 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 2);..Tcl_ListObj
113c0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
113d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
113e0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
113f0 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 alpn", -1));..Tc
11400 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
11410 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
11420 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
11430 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 ringObj((char *)
11440 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e proto, (int) len
11450 32 29 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 2));.../* Report
11460 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 the selected pr
11470 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 otocol as a resu
11480 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 lt of the NPN ne
11490 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 gotiation */.#if
114a0 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c def USE_NPN..SSL
114b0 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f _get0_next_proto
114c0 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c _negotiated(ssl,
114d0 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b &proto, &ulen);
114e0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
114f0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
11500 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
11510 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 70 6e ewStringObj("npn
11520 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
11530 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
11540 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
11550 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
11560 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 Obj((char *)prot
11570 6f 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b o, (int) ulen));
11580 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 .#endif.../* Res
11590 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a umable session *
115a0 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
115b0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
115c0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
115d0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 NewStringObj("re
115e0 73 75 6d 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a sumable", -1));.
115f0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11600 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11610 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
11620 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 53 45 53 53 wIntObj(SSL_SESS
11630 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 ION_is_resumable
11640 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f (session)));.../
11650 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20 * Session start
11660 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69 time (seconds si
11670 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 54 nce epoch) */..T
11680 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
11690 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
116a0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
116b0 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 72 74 5f tringObj("start_
116c0 74 69 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 time", -1));..Tc
116d0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
116e0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
116f0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f bjPtr, Tcl_NewLo
11700 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f ngObj(SSL_SESSIO
11710 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 N_get_time(sessi
11720 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 on)));.../* Time
11730 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f out value - SSL_
11740 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 CTX_get_timeout
11750 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a (in seconds) */.
11760 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11770 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11780 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
11790 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 6d 65 wStringObj("time
117a0 6f 75 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c out", -1));..Tcl
117b0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
117c0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
117d0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e jPtr, Tcl_NewLon
117e0 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e gObj(SSL_SESSION
117f0 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 _get_timeout(ses
11800 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 sion)));.../* Se
11810 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 ssion ticket lif
11820 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 etime hint (in s
11830 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f econds) */..Tcl_
11840 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
11850 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
11860 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
11870 6e 67 4f 62 6a 28 22 6c 69 66 65 74 69 6d 65 22 ngObj("lifetime"
11880 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
11890 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
118a0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
118b0 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a , Tcl_NewLongObj
118c0 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 (SSL_SESSION_get
118d0 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 _ticket_lifetime
118e0 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 _hint(session)))
118f0 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 ;.../* Session i
11900 64 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 d */..session_id
11910 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
11920 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 et_id(session, &
11930 75 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 ulen);..Tcl_List
11940 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
11950 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11960 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
11970 6a 28 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 j("session_id",
11980 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
11990 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
119a0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
119b0 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 Tcl_NewByteArray
119c0 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 Obj(session_id,
119d0 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 09 (int) ulen));...
119e0 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 /* Session ticke
119f0 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 t - client only
11a00 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f */..SSL_SESSION_
11a10 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 get0_ticket(sess
11a20 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
11a30 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f en2);..Tcl_ListO
11a40 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
11a50 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11a60 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
11a70 28 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 ("session_ticket
11a80 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
11a90 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
11aa0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
11ab0 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 r, Tcl_NewByteAr
11ac0 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 rayObj(ticket, (
11ad0 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f int) len2));.../
11ae0 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74 * Ticket app dat
11af0 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f a */..SSL_SESSIO
11b00 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 N_get0_ticket_ap
11b10 70 64 61 74 61 28 73 65 73 73 69 6f 6e 2c 20 26 pdata(session, &
11b20 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a ticket, &len2);.
11b30 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11b40 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11b50 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
11b60 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 63 6b wStringObj("tick
11b70 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 2d 31 et_app_data", -1
11b80 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
11b90 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
11ba0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
11bb0 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 l_NewByteArrayOb
11bc0 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 j(ticket, (int)
11bd0 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 len2));.../* Get
11be0 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 master key */..
11bf0 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 len2 = SSL_SESSI
11c00 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 ON_get_master_ke
11c10 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 y(session, buffe
11c20 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 r, SSL_MAX_MASTE
11c30 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 R_KEY_LENGTH);..
11c40 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
11c50 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
11c60 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
11c70 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61 73 74 65 StringObj("maste
11c80 72 5f 6b 65 79 22 2c 20 2d 31 29 29 3b 0a 09 54 r_key", -1));..T
11c90 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
11ca0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
11cb0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 objPtr, Tcl_NewB
11cc0 79 74 65 41 72 72 61 79 4f 62 6a 28 62 75 66 66 yteArrayObj(buff
11cd0 65 72 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 er, (int) len2))
11ce0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
11cf0 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f Compression info
11d00 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 */. if (ssl
11d10 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 != NULL) {.#ifde
11d20 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 f HAVE_SSL_COMPR
11d30 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f ESSION..const CO
11d40 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c MP_METHOD *comp,
11d50 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 *expn;..comp =
11d60 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f SSL_get_current_
11d70 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 compression(ssl)
11d80 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 ;..expn = SSL_ge
11d90 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 t_current_expans
11da0 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 54 63 6c 5f ion(ssl);...Tcl_
11db0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
11dc0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
11dd0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
11de0 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 ngObj("compressi
11df0 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f on", -1));..Tcl_
11e00 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
11e10 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
11e20 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
11e30 6e 67 4f 62 6a 28 63 6f 6d 70 20 3f 20 53 53 4c ngObj(comp ? SSL
11e40 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 _COMP_get_name(c
11e50 6f 6d 70 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d omp) : "NONE", -
11e60 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
11e70 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
11e80 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
11e90 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
11ea0 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 "expansion", -1)
11eb0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
11ec0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
11ed0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
11ee0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 65 78 _NewStringObj(ex
11ef0 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 pn ? SSL_COMP_ge
11f00 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 t_name(expn) : "
11f10 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6c NONE", -1));.#el
11f20 73 65 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 se..Tcl_ListObjA
11f30 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
11f40 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
11f50 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 _NewStringObj("c
11f60 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 ompression", -1)
11f70 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
11f80 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
11f90 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
11fa0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e _NewStringObj("N
11fb0 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ONE", -1));..Tcl
11fc0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
11fd0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
11fe0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
11ff0 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f ingObj("expansio
12000 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c n", -1));..Tcl_L
12010 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
12020 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
12030 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
12040 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 gObj("NONE", -1)
12050 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
12060 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 . /* Server i
12070 6e 66 6f 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 nfo */. mode
12080 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 = SSL_CTX_get_se
12090 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 ssion_cache_mode
120a0 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b (statePtr->ctx);
120b0 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 20 . if (mode &
120c0 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f SSL_SESS_CACHE_O
120d0 46 46 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 FF) {..proto = "
120e0 6f 66 66 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 off";. } else
120f0 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f if (mode & SSL_
12100 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e SESS_CACHE_CLIEN
12110 54 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 63 T) {..proto = "c
12120 6c 69 65 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c lient";. } el
12130 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
12140 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 L_SESS_CACHE_SER
12150 56 45 52 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 VER) {..proto =
12160 22 73 65 72 76 65 72 22 3b 0a 20 20 20 20 7d 20 "server";. }
12170 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 else if (mode &
12180 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 SSL_SESS_CACHE_B
12190 4f 54 48 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 OTH) {..proto =
121a0 22 62 6f 74 68 22 3b 0a 20 20 20 20 7d 20 65 6c "both";. } el
121b0 73 65 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 75 se {..proto = "u
121c0 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 20 nknown";. }.
121d0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
121e0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
121f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
12200 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 NewStringObj("se
12210 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 ssion_cache_mode
12220 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
12230 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
12240 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
12250 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
12260 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 2c 20 2d 31 ingObj(proto, -1
12270 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 ));.. Tcl_Set
12280 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
12290 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 , objPtr);. r
122a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
122b0 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
122c0 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ntData;.}.../*.
122d0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
122e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
122f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12310 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 ----. *. * Versi
12320 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 onObjCmd -- retu
12330 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e rn version strin
12340 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a g from OpenSSL..
12350 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
12360 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
12370 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
12380 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
12390 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
123a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
123b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
123c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
123d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
123e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 */.static int.Ve
123f0 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 rsionObjCmd(Clie
12400 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
12410 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
12420 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
12430 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
12440 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
12450 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a l_Obj *objPtr;..
12460 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
12470 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 led");.. objP
12480 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 tr = Tcl_NewStri
12490 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 ngObj(OPENSSL_VE
124a0 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b RSION_TEXT, -1);
124b0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
124c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
124d0 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 jPtr);.. retu
124e0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
124f0 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
12500 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a ata;..objc = obj
12510 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b c;..objv = objv;
12520 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
12530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
12570 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d . * MiscObjCmd -
12580 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a - misc commands.
12590 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
125a0 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
125b0 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
125c0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
125d0 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
125e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
125f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
12620 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 */.static int.Mi
12630 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 scObjCmd(ClientD
12640 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
12650 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
12660 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
12670 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
12680 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69 v[]) {. stati
12690 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f c const char *co
126a0 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 mmands [] = { "r
126b0 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e eq", "strreq", N
126c0 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 ULL };. enum
126d0 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c command { C_REQ,
126e0 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d C_STRREQ, C_DUM
126f0 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d MY };. int cm
12700 64 2c 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 d, isStr;. ch
12710 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d ar buffer[16384]
12720 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
12730 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
12740 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 f (objc < 2) {..
12750 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
12760 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
12770 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 , "subcommand ?a
12780 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 rgs?");..return
12790 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
127a0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
127b0 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 IndexFromObj(int
127c0 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f erp, objv[1], co
127d0 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 mmands, "command
127e0 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 43 ", 0,&cmd) != TC
127f0 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
12800 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
12810 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f .. ERR_clear_
12820 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 error();.. is
12830 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f Str = (cmd == C_
12840 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 STRREQ);. swi
12850 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 tch ((enum comma
12860 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 nd) cmd) {..case
12870 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f C_REQ:..case C_
12880 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 STRREQ: {.. E
12890 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 VP_PKEY *pkey=NU
128a0 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 LL;.. X509 *c
128b0 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 ert=NULL;.. X
128c0 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 509_NAME *name=N
128d0 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 ULL;.. Tcl_Ob
128e0 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 j **listv;..
128f0 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 int listc,i;...
12900 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c BIO *out=NULL
12910 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f ;... char *k_
12920 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b C="",*k_ST="",*k
12930 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b _L="",*k_O="",*k
12940 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c _OU="",*k_CN="",
12950 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 *k_Email="";..
12960 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a char *keyout,*
12970 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 pemout,*str;..
12980 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 int keysize,se
12990 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b rial=0,days=365;
129a0 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
129b0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
129c0 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 x30000000L..
129d0 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 BIGNUM *bne = NU
129e0 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 LL;.. RSA *rs
129f0 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a a = NULL;.#else.
12a00 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 . EVP_PKEY_CT
12a10 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 X *ctx = NULL;.#
12a20 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 endif... if (
12a30 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a (objc<5) || (obj
12a40 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 c>6)) {...Tcl_Wr
12a50 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
12a60 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 p, 2, objv, "key
12a70 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 size keyfile cer
12a80 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a tfile ?info?");.
12a90 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
12aa0 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 OR;.. }...
12ab0 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 if (Tcl_GetIntF
12ac0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
12ad0 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 bjv[2], &keysize
12ae0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
12af0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
12b00 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b R;.. }.. k
12b10 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 eyout=Tcl_GetStr
12b20 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 ing(objv[3]);..
12b30 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 pemout=Tcl_Ge
12b40 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 tString(objv[4])
12b50 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72 ;.. if (isStr
12b60 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 ) {...Tcl_SetVar
12b70 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 (interp,keyout,"
12b80 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 ",0);...Tcl_SetV
12b90 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 ar(interp,pemout
12ba0 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a ,"",0);.. }..
12bb0 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 . if (objc>=6
12bc0 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 ) {...if (Tcl_Li
12bd0 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 stObjGetElements
12be0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d (interp, objv[5]
12bf0 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 ,....&listc, &li
12c00 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 stv) != TCL_OK)
12c10 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 {... return T
12c20 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 CL_ERROR;...}...
12c30 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 .if ((listc%2) !
12c40 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c = 0) {... Tcl
12c50 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
12c60 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c p,"Information l
12c70 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 ist must have ev
12c80 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 en number of arg
12c90 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 uments",NULL);..
12ca0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
12cb0 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 ERROR;...}...for
12cc0 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 (i=0; i<listc;
12cd0 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 i+=2) {... st
12ce0 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 r=Tcl_GetString(
12cf0 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 listv[i]);...
12d00 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
12d10 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 "days")==0) {...
12d20 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 .if (Tcl_GetIntF
12d30 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 romObj(interp,li
12d40 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 stv[i+1],&days)!
12d50 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 =TCL_OK)....
12d60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
12d70 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
12d80 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 f (strcmp(str,"s
12d90 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 erial")==0) {...
12da0 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 .if (Tcl_GetIntF
12db0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 romObj(interp,li
12dc0 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c stv[i+1],&serial
12dd0 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 )!=TCL_OK)....
12de0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
12df0 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 OR;... } else
12e00 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
12e10 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "C")==0) {....k_
12e20 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 C=Tcl_GetString(
12e30 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
12e40 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
12e50 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d rcmp(str,"ST")==
12e60 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 0) {....k_ST=Tcl
12e70 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
12e80 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
12e90 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
12ea0 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 str,"L")==0) {..
12eb0 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 ..k_L=Tcl_GetStr
12ec0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
12ed0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
12ee0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 (strcmp(str,"O"
12ef0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 )==0) {....k_O=T
12f00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
12f10 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
12f20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
12f30 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 p(str,"OU")==0)
12f40 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 {....k_OU=Tcl_Ge
12f50 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
12f60 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
12f70 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
12f80 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 ,"CN")==0) {....
12f90 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 k_CN=Tcl_GetStri
12fa0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
12fb0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
12fc0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 (strcmp(str,"Ema
12fd0 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f il")==0) {....k_
12fe0 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 Email=Tcl_GetStr
12ff0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
13000 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ... } else {.
13010 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
13020 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e (interp,"Unknown
13030 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c parameter",NULL
13040 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c );....return TCL
13050 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a _ERROR;... }.
13060 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 ..}.. }..#if
13070 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
13080 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
13090 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 000L.. bne =
130a0 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 BN_new();.. r
130b0 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a sa = RSA_new();.
130c0 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f . pkey = EVP_
130d0 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 PKEY_new();..
130e0 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c if (bne == NULL
130f0 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 || rsa == NULL
13100 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 || pkey == NULL
13110 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 || !BN_set_word(
13120 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 bne,RSA_F4) ||..
13130 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b .!RSA_generate_k
13140 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 ey_ex(rsa, keysi
13150 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c ze, bne, NULL) |
13160 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 | !EVP_PKEY_assi
13170 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 gn_RSA(pkey, rsa
13180 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f )) {...EVP_PKEY_
13190 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a free(pkey);.../*
131a0 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 RSA_free(rsa);
131b0 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 freed by EVP_PKE
131c0 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 Y_free */...BN_f
131d0 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a ree(bne);.#else.
131e0 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f . pkey = EVP_
131f0 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 RSA_gen((unsigne
13200 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b d int) keysize);
13210 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f .. ctx = EVP_
13220 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 PKEY_CTX_new(pke
13230 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 y,NULL);.. if
13240 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c (pkey == NULL |
13250 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c | ctx == NULL ||
13260 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 !EVP_PKEY_keyge
13270 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 n_init(ctx) ||..
13280 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 .!EVP_PKEY_CTX_s
13290 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 et_rsa_keygen_bi
132a0 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 ts(ctx, keysize)
132b0 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 || !EVP_PKEY_ke
132c0 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 ygen(ctx, &pkey)
132d0 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 ) {...EVP_PKEY_f
132e0 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 ree(pkey);...EVP
132f0 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 _PKEY_CTX_free(c
13300 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 tx);.#endif...Tc
13310 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
13320 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 rp,"Error genera
13330 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 ting private key
13340 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 ",NULL);...retur
13350 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
13360 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 } else {...if
13370 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 (isStr) {...
13380 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f out=BIO_new(BIO_
13390 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 s_mem());...
133a0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 PEM_write_bio_Pr
133b0 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 ivateKey(out,pke
133c0 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 y,NULL,NULL,0,NU
133d0 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 LL,NULL);...
133e0 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 i=BIO_read(out,b
133f0 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 uffer,sizeof(buf
13400 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 fer)-1);... i
13410 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a =(i<0) ? 0 : i;.
13420 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d .. buffer[i]=
13430 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f '\0';... Tcl_
13440 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 SetVar(interp,ke
13450 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a yout,buffer,0);.
13460 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 .. BIO_flush(
13470 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f out);... BIO_
13480 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 free(out);...} e
13490 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d lse {... out=
134a0 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 BIO_new(BIO_s_fi
134b0 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f le());... BIO
134c0 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 _write_filename(
134d0 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 out,keyout);...
134e0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
134f0 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c _PrivateKey(out,
13500 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 pkey,NULL,NULL,0
13510 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ,NULL,NULL);...
13520 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f /* PEM_write_
13530 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 bio_RSAPrivateKe
13540 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c y(out, rsa, NULL
13550 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c , NULL, 0, NULL,
13560 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 NULL); */...
13570 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 BIO_free_all(ou
13580 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 t);.. .}....if (
13590 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 (cert=X509_new()
135a0 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 )==NULL) {...
135b0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
135c0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e nterp,"Error gen
135d0 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 erating certific
135e0 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c ate request",NUL
135f0 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b L);... EVP_PK
13600 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 EY_free(pkey);.#
13610 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
13620 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
13630 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 000000L... BN
13640 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 _free(bne);.#end
13650 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e 28 if... return(
13660 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a TCL_ERROR);...}.
13670 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73 ...X509_set_vers
13680 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 ion(cert,2);...A
13690 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 SN1_INTEGER_set(
136a0 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e X509_get_serialN
136b0 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 69 umber(cert),seri
136c0 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 al);...X509_gmti
136d0 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d me_adj(X509_getm
136e0 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 _notBefore(cert)
136f0 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 ,0);...X509_gmti
13700 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d me_adj(X509_getm
13710 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c _notAfter(cert),
13720 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 (long)60*60*24*d
13730 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 ays);...X509_set
13740 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 _pubkey(cert,pke
13750 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 y);....name=X509
13760 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d _get_subject_nam
13770 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 e(cert);....X509
13780 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
13790 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c by_txt(name,"C",
137a0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
137b0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
137c0 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 har *) k_C, -1,
137d0 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
137e0 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
137f0 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 _txt(name,"ST",
13800 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
13810 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
13820 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 ar *) k_ST, -1,
13830 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
13840 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
13850 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d _txt(name,"L", M
13860 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
13870 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
13880 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 r *) k_L, -1, -1
13890 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
138a0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
138b0 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 xt(name,"O", MBS
138c0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
138d0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
138e0 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 *) k_O, -1, -1,
138f0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
13900 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
13910 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 (name,"OU", MBST
13920 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
13930 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
13940 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 ) k_OU, -1, -1,
13950 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
13960 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
13970 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 (name,"CN", MBST
13980 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
13990 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
139a0 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 ) k_CN, -1, -1,
139b0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
139c0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
139d0 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d (name,"Email", M
139e0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
139f0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
13a00 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 r *) k_Email, -1
13a10 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 , -1, 0);....X50
13a20 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 9_set_subject_na
13a30 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a me(cert,name);..
13a40 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e ..if (!X509_sign
13a50 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 (cert,pkey,EVP_s
13a60 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20 ha256())) {...
13a70 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 X509_free(cert
13a80 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 );... EVP_PKE
13a90 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 Y_free(pkey);.#i
13aa0 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
13ab0 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
13ac0 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 00000L... BN_
13ad0 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 free(bne);.#endi
13ae0 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 f... Tcl_SetR
13af0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 esult(interp,"Er
13b00 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74 ror signing cert
13b10 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a ificate",NULL);.
13b20 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
13b30 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 _ERROR;...}....i
13b40 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 f (isStr) {...
13b50 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
13b60 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 O_s_mem());...
13b70 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
13b80 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a X509(out,cert);.
13b90 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 .. i=BIO_read
13ba0 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 (out,buffer,size
13bb0 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 of(buffer)-1);..
13bc0 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 . i=(i<0) ? 0
13bd0 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 : i;... buff
13be0 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 er[i]='\0';...
13bf0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 Tcl_SetVar(int
13c00 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 erp,pemout,buffe
13c10 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f r,0);... BIO_
13c20 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 flush(out);...
13c30 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b BIO_free(out);
13c40 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 ...} else {...
13c50 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
13c60 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 O_s_file());...
13c70 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c BIO_write_fil
13c80 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 ename(out,pemout
13c90 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 );... PEM_wri
13ca0 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c te_bio_X509(out,
13cb0 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f cert);... BIO
13cc0 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a _free_all(out);.
13cd0 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 ..}....X509_free
13ce0 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b (cert);...EVP_PK
13cf0 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 EY_free(pkey);.#
13d00 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
13d10 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
13d20 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 000000L...BN_fre
13d30 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 e(bne);.#endif..
13d40 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b }..}..break;
13d50 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 . default:..b
13d60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
13d70 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
13d80 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
13d90 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a entData;.}.../**
13da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13db0 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 **/./* Init
13dc0 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a */./****
13dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13de0 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d /../*. *--------
13df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
13e30 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a * Tls_Free --. *
13e40 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
13e50 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 re cleans up whe
13e60 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 n a SSL socket b
13e70 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 ased channel. *.
13e80 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 is closed and it
13e90 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e s reference coun
13ea0 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a t falls below 1.
13eb0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
13ec0 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.none. *. * Sid
13ed0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 e effects:. *.Fr
13ee0 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 ees all the stat
13ef0 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
13f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 ----------. */.v
13f40 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 oid.Tls_Free(cha
13f50 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 r *blockPtr) {.
13f60 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
13f70 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c tr = (State *)bl
13f80 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 ockPtr;.. dpr
13f90 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
13fa0 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 . Tls_Clean(s
13fb0 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b tatePtr);. ck
13fc0 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a free(blockPtr);.
13fd0 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
13fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a ------------. *.
14020 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a * Tls_Clean --.
14030 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
14040 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 dure cleans up w
14050 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 hen a SSL socket
14060 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 based channel.
14070 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 *.is closed and
14080 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f its reference co
14090 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 unt falls below
140a0 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 1. This should.
140b0 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e *.be called syn
140c0 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 chronously by th
140d0 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 e CloseProc, not
140e0 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 in the. *.Event
140f0 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 uallyFree callba
14100 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ck.. *. * Result
14110 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.none. *. *
14120 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
14130 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 *.Frees all the
14140 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d state. *. *-----
14150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
14190 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 */.void Tls_Clea
141a0 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 n(State *statePt
141b0 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 r) {. dprintf
141c0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
141d0 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 /*. * we're
141e0 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 assuming here t
141f0 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 hat we're single
14200 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a -threaded. *
14210 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
14220 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 tr->timer != (Tc
14230 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 l_TimerToken) NU
14240 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 LL) {..Tcl_Delet
14250 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 eTimerHandler(st
14260 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a atePtr->timer);.
14270 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 .statePtr->timer
14280 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a = NULL;. }..
14290 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
142a0 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 ->protos) {..ckf
142b0 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 ree(statePtr->pr
142c0 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 otos);..statePtr
142d0 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b ->protos = NULL;
142e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
142f0 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a tatePtr->bio) {.
14300 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 ./* This will ca
14310 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e ll SSL_shutdown.
14320 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a Bug 1414045 */.
14330 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 .dprintf("BIO_fr
14340 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 ee_all(%p)", sta
14350 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 tePtr->bio);..BI
14360 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 O_free_all(state
14370 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 Ptr->bio);..stat
14380 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c ePtr->bio = NULL
14390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
143a0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b statePtr->ssl) {
143b0 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 ..dprintf("SSL_f
143c0 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 ree(%p)", stateP
143d0 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 tr->ssl);..SSL_f
143e0 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ree(statePtr->ss
143f0 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 l);..statePtr->s
14400 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d sl = NULL;. }
14410 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
14420 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 r->ctx) {..SSL_C
14430 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 TX_free(statePtr
14440 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 ->ctx);..statePt
14450 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 r->ctx = NULL;.
14460 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
14470 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
14480 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {..Tcl_DecrRefC
14490 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 ount(statePtr->c
144a0 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 allback);..state
144b0 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 Ptr->callback =
144c0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
144d0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 if (statePtr->pa
144e0 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 ssword) {..Tcl_D
144f0 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ecrRefCount(stat
14500 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b ePtr->password);
14510 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 ..statePtr->pass
14520 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 word = NULL;.
14530 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
14540 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 Ptr->vcmd) {..Tc
14550 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
14560 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a tatePtr->vcmd);.
14570 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 .statePtr->vcmd
14580 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 = NULL;. }..
14590 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
145a0 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a rning");.}.../*.
145b0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
145c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145f0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
14600 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Init --. *. *.Th
14610 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 is is a package
14620 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 initialization p
14630 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 rocedure, which
14640 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 is called. *.by
14650 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 Tcl when this pa
14660 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 ckage is to be a
14670 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 dded to an inter
14680 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 preter.. *. * Re
14690 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 sults: Ssl conf
146a0 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 igured and loade
146b0 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 d. *. * Side eff
146c0 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 ects:. *. create
146d0 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 the ssl command
146e0 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c , initialize ssl
146f0 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d context. *. *--
14700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14740 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 -. */.DLLEXPORT
14750 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c int Tls_Init(Tcl
14760 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 _Interp *interp)
14770 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 {. const cha
14780 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 r tlsTclInitScri
14790 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 pt[] = {.#includ
147a0 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 e "tls.tcl.h"..0
147b0 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 x00. };..
147c0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
147d0 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 );.. /*.
147e0 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 * We only suppor
147f0 74 20 54 63 6c 20 38 2e 34 20 6f 72 20 6e 65 77 t Tcl 8.4 or new
14800 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 er. */. i
14810 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 5f 54 f (.#ifdef USE_T
14820 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c 5f 49 6e CL_STUBS..Tcl_In
14830 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 itStubs(interp,
14840 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c 73 65 0a "8.4", 0).#else.
14850 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 .Tcl_PkgRequire(
14860 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 22 interp, "Tcl", "
14870 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e 64 69 66 8.4-", 0).#endif
14880 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 .. == NULL) {..r
14890 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
148a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
148b0 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d TlsLibInit(0) !=
148c0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f TCL_OK) {..Tcl_
148d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
148e0 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 erp, "could not
148f0 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c initialize SSL l
14900 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a ibrary", NULL);.
14910 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
14920 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 R;. }.. Tc
14930 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
14940 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
14950 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 :ciphers", Ciphe
14960 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e rsObjCmd, (Clien
14970 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
14980 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
14990 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
149a0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
149b0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f interp, "tls::co
149c0 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 nnection", Conne
149d0 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c ctionInfoObjCmd,
149e0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
149f0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
14a00 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
14a10 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
14a20 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
14a30 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c tls::handshake",
14a40 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 HandshakeObjCmd
14a50 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
14a60 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
14a70 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
14a80 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
14a90 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
14aa0 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 "tls::import", I
14ab0 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c mportObjCmd, (Cl
14ac0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
14ad0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
14ae0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
14af0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
14b00 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
14b10 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d :unimport", Unim
14b20 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 portObjCmd, (Cli
14b30 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
14b40 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
14b50 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
14b60 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
14b70 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
14b80 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f status", StatusO
14b90 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
14ba0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
14bb0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
14bc0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
14bd0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
14be0 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 erp, "tls::versi
14bf0 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 on", VersionObjC
14c00 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
14c10 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
14c20 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
14c30 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
14c40 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
14c50 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d , "tls::misc", M
14c60 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 iscObjCmd, (Clie
14c70 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
14c80 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
14c90 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
14ca0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
14cb0 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 (interp, "tls::p
14cc0 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f rotocols", Proto
14cd0 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 colsObjCmd, (Cli
14ce0 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
14cf0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
14d00 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 ) NULL);.. if
14d10 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c (interp) {..Tcl
14d20 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c _Eval(interp, tl
14d30 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 3b sTclInitScript);
14d40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 . }.. retu
14d50 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 rn(Tcl_PkgProvid
14d60 65 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 22 2c e(interp, "tls",
14d70 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e PACKAGE_VERSION
14d80 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ));.}../*. *----
14d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14dc0 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 --*. *. *.Tls_Sa
14dd0 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 feInit --. *. *.
14de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e10 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 *. *.Standard pr
14e20 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65 64 ocedure required
14e30 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 by 'load'.. *.I
14e40 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20 nitializes this
14e50 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 extension for a
14e60 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 safe interpreter
14e70 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *.-----------
14e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ea0 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 -----*. *. *.Sid
14eb0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 e effects:. *..A
14ec0 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a s of 'Tls_Init'.
14ed0 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a *. *.Result:. *
14ee0 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c ..A standard Tcl
14ef0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a error code.. *.
14f00 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
14f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14f30 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c --------*. */.DL
14f40 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f LEXPORT int Tls_
14f50 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 SafeInit(Tcl_Int
14f60 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 erp *interp) {.
14f70 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
14f80 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ed");. return
14f90 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 (Tls_Init(interp
14fa0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14fe0 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 --*. *. *.TlsLib
14ff0 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d Init --. *. *.--
15000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
15030 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 *.Initializes S
15040 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 SL library once
15050 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a per application.
15060 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.-------------
15070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15090 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 ---*. *. *.Side
150a0 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 effects:. *..ini
150b0 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 tializes SSL lib
150c0 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c rary. *. *.Resul
150d0 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 t:. *..none. *.
150e0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
150f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15110 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 -------*. */.sta
15120 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e tic int TlsLibIn
15130 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c it(int uninitial
15140 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69 ize) {. stati
15150 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 c int initialize
15160 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 d = 0;. int s
15170 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a tatus = TCL_OK;.
15180 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
15190 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
151a0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
151b0 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 ADS). size_t
151c0 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 num_locks;.#endi
151d0 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69 f.. if (unini
151e0 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 tialize) {..if (
151f0 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a !initialized) {.
15200 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 . dprintf("As
15210 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c ked to uninitial
15220 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 ize, but we are
15230 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 not initialized"
15240 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 28 );... return(
15250 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70 TCL_OK);..}...dp
15260 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 rintf("Asked to
15270 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a uninitialize");.
15280 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
15290 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
152a0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
152b0 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 EADS)..Tcl_Mutex
152c0 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a Lock(&init_mx);.
152d0 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 ..if (locks) {..
152e0 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b free(locks);
152f0 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 .. locks = NU
15300 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f LL;.. locksCo
15310 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 unt = 0;..}.#end
15320 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 if..initialized
15330 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 = 0;..#if define
15340 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
15350 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
15360 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f L_THREADS)..Tcl_
15370 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 MutexUnlock(&ini
15380 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 t_mx);.#endif...
15390 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a return(TCL_OK);.
153a0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 }.. if (i
153b0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 nitialized) {..d
153c0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 printf("Called,
153d0 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 but using cached
153e0 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 value");..retur
153f0 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 20 7d n(status);. }
15400 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
15410 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 alled");..#if de
15420 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
15430 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
15440 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 d(TCL_THREADS).
15450 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b Tcl_MutexLock
15460 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 (&init_mx);.#end
15470 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a if. initializ
15480 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 ed = 1;..#if def
15490 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
154a0 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
154b0 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 (TCL_THREADS).
154c0 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b num_locks = 1;
154d0 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 . locksCount
154e0 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b = (int) num_lock
154f0 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d s;. locks = m
15500 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f alloc(sizeof(*lo
15510 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 cks) * num_locks
15520 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f );. memset(lo
15530 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a cks, 0, sizeof(*
15540 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 locks) * num_loc
15550 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 ks);.#endif..
15560 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 /* Initialize B
15570 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e OTH libcrypto an
15580 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 d libssl. */.
15590 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 OPENSSL_init_ss
155a0 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c l(OPENSSL_INIT_L
155b0 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 OAD_SSL_STRINGS
155c0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c | OPENSSL_INIT_L
155d0 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e OAD_CRYPTO_STRIN
155e0 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e GS..| OPENSSL_IN
155f0 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 IT_ADD_ALL_CIPHE
15600 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 RS | OPENSSL_INI
15610 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 T_ADD_ALL_DIGEST
15620 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 S, NULL);.. B
15630 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c IO_new_tcl(NULL,
15640 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 0);..#if 0.
15650 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f /*. * XXX:TO
15660 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20 DO: Remove this
15670 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65 code and replace
15680 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63 6b it with a check
15690 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 . * for enou
156a0 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 gh entropy and d
156b0 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65 o not try to cre
156c0 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 ate our own.
156d0 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72 * terrible entr
156e0 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 opy. */.
156f0 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74 /*. * Seed t
15700 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 he random number
15710 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 generator in th
15720 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 e SSL library,.
15730 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20 * using the
15740 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 do/while constru
15750 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 ct because of th
15760 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 e bug note in th
15770 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c e. * OpenSSL
15780 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 FAQ at http://w
15790 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 ww.openssl.org/s
157a0 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 upport/faq.html#
157b0 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 USER1. *.
157c0 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20 * The crux of
157d0 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 the problem is t
157e0 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f hat Solaris 7 do
157f0 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 es not have a.
15800 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d * /dev/random
15810 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d or /dev/urandom
15820 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 61 device so it ca
15830 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75 nnot gather enou
15840 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 gh. * entrop
15850 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f y from the RAND_
15860 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20 seed() when TLS
15870 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 initializes and
15880 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74 refuses. * t
15890 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61 o go further. Ea
158a0 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f rlier versions o
158b0 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65 f OpenSSL carrie
158c0 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e d on regardless.
158d0 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 . */. sra
158e0 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 nd((unsigned int
158f0 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a ) time((time_t *
15900 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f ) NULL));. do
15910 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 {..for (i = 0;
15920 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 i < 16; i++) {..
15930 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 rnd_seed[i]
15940 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 35 = 1 + (char) (25
15950 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 5.0 * rand()/(RA
15960 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d ND_MAX+1.0));..}
15970 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f ..RAND_seed(rnd_
15980 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 seed, sizeof(rnd
15990 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 _seed));. } w
159a0 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75 hile (RAND_statu
159b0 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 s() != 1);.#endi
159c0 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f f..#if defined(O
159d0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
159e0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
159f0 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 HREADS)..Tcl_Mut
15a00 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d exUnlock(&init_m
15a10 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 x);.#endif...ret
15a20 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a urn(status);.}.