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 2f 2a 2a 2a 2a 2a 2a 2a ADS */../*******
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f *************/./
09a0: 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 * Callbacks
09b0: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a */./*********
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0c 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 49 --------. *. * I
0a20: 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 nfoCallback --.
0a30: 2a 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 *. *.monitors SS
0a40: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f L connection pro
0a50: 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c cess. *. * Resul
0a60: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
0a70: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
0a80: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
0a90: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
0aa0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ae0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
0af0: 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 void.InfoCallbac
0b00: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
0b10: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 , int where, int
0b20: 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 ret) {. Stat
0b30: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
0b40: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 tate*)SSL_get_ap
0b50: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 p_data((SSL *)ss
0b60: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 l);. Tcl_Inte
0b70: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
0b80: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
0b90: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
0ba0: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 tr;. char *ma
0bb0: 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 jor; char *minor
0bc0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
0bd0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
0be0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
0bf0: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
0c00: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e j*)NULL)..return
0c10: 3b 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 ;.. cmdPtr =
0c20: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
0c30: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
0c40: 61 63 6b 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 ack);..#if 0.
0c50: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c if (where & SSL
0c60: 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65 _CB_ALERT) {..se
0c70: 76 20 3d 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79 v = SSL_alert_ty
0c80: 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 pe_string_long(r
0c90: 65 74 29 3b 0a 09 69 66 20 28 73 74 72 63 6d 70 et);..if (strcmp
0ca0: 28 73 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d (sev, "fatal")==
0cb0: 30 29 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65 0) {./* Map to e
0cc0: 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73 rror */.. Tls
0cd0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
0ce0: 20 53 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20 SSL_ERROR(ssl,
0cf0: 30 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 0));.. return
0d00: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ;..}. }.#endi
0d10: 66 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 f. if (where
0d20: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 & SSL_CB_HANDSHA
0d30: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a KE_START) {..maj
0d40: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 or = "handshake"
0d50: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 ;..minor = "star
0d60: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 t";. } else i
0d70: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0d80: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 B_HANDSHAKE_DONE
0d90: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 ) {..major = "ha
0da0: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 ndshake";..minor
0db0: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d = "done";. }
0dc0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 else {..if (whe
0dd0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 re & SSL_CB_ALER
0de0: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 T)..major = "ale
0df0: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 rt";..else if (w
0e00: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f here & SSL_ST_CO
0e10: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 NNECT).major = "
0e20: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 connect";..else
0e30: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
0e40: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f ST_ACCEPT)..majo
0e50: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 r = "accept";..e
0e60: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 lse.....major =
0e70: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 "unknown";...if
0e80: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
0e90: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 READ)..minor = "
0ea0: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 read";..else if
0eb0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
0ec0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 WRITE)..minor =
0ed0: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 "write";..else i
0ee0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0ef0: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d B_LOOP)..minor =
0f00: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 "loop";..else i
0f10: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0f20: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d B_EXIT)..minor =
0f30: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 "exit";..else..
0f40: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e ...minor = "unkn
0f50: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 own";. }..
0f60: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
0f70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
0f80: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
0f90: 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f wStringObj("info
0fa0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
0fb0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
0fc0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
0fd0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
0fe0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
0ff0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
1000: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
1010: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
1020: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1030: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1040: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
1050: 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b Obj(major, -1));
1060: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1070: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1080: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
1090: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
10a0: 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 inor, -1));..
10b0: 20 69 66 20 28 77 68 65 72 65 20 26 20 28 53 53 if (where & (SS
10c0: 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 53 4c 5f 43 42 L_CB_LOOP|SSL_CB
10d0: 5f 45 58 49 54 29 29 20 7b 0a 09 54 63 6c 5f 4c _EXIT)) {..Tcl_L
10e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1100: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
1110: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 StringObj(SSL_st
1120: 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 ate_string_long(
1130: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ssl), -1));.
1140: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 } else if (where
1150: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 & SSL_CB_ALERT)
1160: 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a {..const char *
1170: 63 70 20 3d 20 28 63 68 61 72 20 2a 29 20 53 53 cp = (char *) SS
1180: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 L_alert_desc_str
1190: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 0a ing_long(ret);..
11a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11c0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
11d0: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d wStringObj(cp, -
11e0: 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 1));. } else
11f0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
1200: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
1210: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
1220: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1230: 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 j(SSL_state_stri
1240: 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 ng_long(ssl), -1
1250: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 ));. }. Tc
1260: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 l_Preserve((Clie
1270: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
1280: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 . Tcl_Preserv
1290: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
12a0: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 tatePtr);.. T
12b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
12c0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 28 76 6f cmdPtr);. (vo
12d0: 69 64 29 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 id) Tcl_EvalObjE
12e0: 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 x(interp, cmdPtr
12f0: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 , TCL_EVAL_GLOBA
1300: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 L);. Tcl_Decr
1310: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
1320: 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 ;.. Tcl_Relea
1330: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
1340: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 statePtr);. T
1350: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
1360: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
1370: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
1380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
13c0: 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 . * VerifyCallba
13d0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 ck --. *. *.Moni
13e0: 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 tors SSL certifi
13f0: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 cate validation
1400: 70 72 6f 63 65 73 73 2e 0a 20 2a 09 54 68 69 73 process.. *.This
1410: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 is called whene
1420: 76 65 72 20 61 20 63 65 72 74 69 66 69 63 61 74 ver a certificat
1430: 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 0a 20 e is inspected.
1440: 2a 09 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 *.or decided inv
1450: 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 alid.. *. * Resu
1460: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 lts:. *.A callba
1470: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 ck bound to the
1480: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72 socket may retur
1490: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 n one of:. *.
14a0: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 0...- the certi
14b0: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 ficate is deemed
14c0: 20 69 6e 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 invalid. *.
14d0: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 1...- the certif
14e0: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 icate is deemed
14f0: 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 65 6d 70 valid. *. emp
1500: 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 ty string.- no c
1510: 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 hange to certifi
1520: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a cate validation.
1530: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
1540: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 ts:. *.The err f
1550: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 ield of the curr
1560: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 ently operative
1570: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 State is set. *.
1580: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 to a string de
1590: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c scribing the SSL
15a0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 negotiation fai
15b0: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d lure reason. *--
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1600: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
1610: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 .VerifyCallback(
1620: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f int ok, X509_STO
1630: 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 RE_CTX *ctx) {.
1640: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
1650: 74 72 2c 20 2a 72 65 73 75 6c 74 3b 0a 20 20 20 tr, *result;.
1660: 20 63 68 61 72 20 2a 73 74 72 69 6e 67 3b 0a 20 char *string;.
1670: 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 3b 0a 20 int length;.
1680: 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d SSL *ssl..=
1690: 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 (SSL*)X509_STOR
16a0: 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 E_CTX_get_ex_dat
16b0: 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 a(ctx, SSL_get_e
16c0: 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 x_data_X509_STOR
16d0: 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 E_CTX_idx());.
16e0: 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d X509 *cert..=
16f0: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f X509_STORE_CTX_
1700: 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 get_current_cert
1710: 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 (ctx);. State
1720: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 *statePtr.= (St
1730: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 ate*)SSL_get_app
1740: 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 _data(ssl);.
1750: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
1760: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
1770: 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 nterp;. int d
1780: 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f epth..= X509_STO
1790: 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 RE_CTX_get_error
17a0: 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 _depth(ctx);.
17b0: 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 int err..= X509
17c0: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 _STORE_CTX_get_e
17d0: 72 72 6f 72 28 63 74 78 29 3b 0a 20 20 20 20 69 rror(ctx);. i
17e0: 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 nt code;.. dp
17f0: 72 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25 rintf("Verify: %
1800: 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 d", ok);.. if
1810: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
1820: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
1830: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 73 *)NULL) {..if (s
1840: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 tatePtr->vflags
1850: 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 & SSL_VERIFY_FAI
1860: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 L_IF_NO_PEER_CER
1870: 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e T) {.. return
1880: 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 ok;..} else {..
1890: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d return 1;..}
18a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 . }.. cmdP
18b0: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
18c0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
18d0: 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 callback);. T
18e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
18f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1900: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
1910: 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 tringObj("verify
1920: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
1930: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1940: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
1950: 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 dPtr,..Tcl_NewSt
1960: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
1970: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
1980: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
1990: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
19a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
19b0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
19c0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 70 cl_NewIntObj(dep
19d0: 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 th));. Tcl_Li
19e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
19f0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1a00: 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 r, Tls_NewX509Ob
1a10: 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 j(interp, cert))
1a20: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1a30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1a40: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1a50: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 cl_NewIntObj(ok)
1a60: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
1a70: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1a80: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
1a90: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 .Tcl_NewStringOb
1aa0: 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 j((char*)X509_ve
1ab0: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f rify_cert_error_
1ac0: 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 string(err), -1)
1ad0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
1ae0: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
1af0: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 ) interp);. T
1b00: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
1b10: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
1b20: 72 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 r);.. statePt
1b30: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
1b40: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 TCL_CALLBACK;..
1b50: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
1b60: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
1b70: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c code = Tcl_Eval
1b80: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d ObjEx(interp, cm
1b90: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 dPtr, TCL_EVAL_G
1ba0: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 LOBAL);. if (
1bb0: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 code != TCL_OK)
1bc0: 7b 0a 09 2f 2a 20 49 74 20 67 6f 74 20 61 6e 20 {../* It got an
1bd0: 65 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 error - reject t
1be0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 09 he certificate..
1bf0: 09 2a 2f 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a .*/.#if (TCL_MAJ
1c00: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
1c10: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
1c20: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
1c30: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
1c40: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
1c50: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
1c60: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
1c70: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 09 code);.#endif..
1c80: 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c ok = 0;. } el
1c90: 73 65 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54 se {..result = T
1ca0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
1cb0: 69 6e 74 65 72 70 29 3b 0a 09 73 74 72 69 6e 67 interp);..string
1cc0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
1cd0: 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 2c 20 FromObj(result,
1ce0: 26 6c 65 6e 67 74 68 29 3b 0a 09 2f 2a 20 41 6e &length);../* An
1cf0: 20 65 6d 70 74 79 20 72 65 73 75 6c 74 20 6c 65 empty result le
1d00: 61 76 65 73 20 76 65 72 69 66 69 63 61 74 69 6f aves verificatio
1d10: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f 0a n unchanged..*/.
1d20: 09 69 66 20 28 73 74 72 69 6e 67 20 21 3d 20 4e .if (string != N
1d30: 55 4c 4c 20 26 26 20 6c 65 6e 67 74 68 20 3e 20 ULL && length >
1d40: 30 29 20 7b 0a 09 20 20 20 20 63 6f 64 65 20 3d 0) {.. code =
1d50: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f Tcl_GetIntFromO
1d60: 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c bj(interp, resul
1d70: 74 2c 20 26 6f 6b 29 3b 0a 09 20 20 20 20 69 66 t, &ok);.. if
1d80: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b (code != TCL_OK
1d90: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ) {.#if (TCL_MAJ
1da0: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
1db0: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
1dc0: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 09 54 63 ERSION < 6)...Tc
1dd0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f l_BackgroundErro
1de0: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 r(interp);.#else
1df0: 0a 09 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e ...Tcl_Backgroun
1e00: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 dException(inter
1e10: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 p, code);.#endif
1e20: 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20 20 20 20 ...ok = 0;..
1e30: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 }..}. }. T
1e40: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
1e50: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 73 74 cmdPtr);.. st
1e60: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d atePtr->flags &=
1e70: 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 ~(TLS_TCL_CALLB
1e80: 41 43 4b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 ACK);.. Tcl_R
1e90: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
1ea0: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 ta) statePtr);.
1eb0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
1ec0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
1ed0: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 rp);. return(
1ee0: 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 ok);./* By defau
1ef0: 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 lt, leave verifi
1f00: 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 cation unchanged
1f10: 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ..*/.}.../*. *--
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f60: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f -. *. * Tls_Erro
1f70: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 r --. *. *.Calls
1f80: 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 24 callback with $
1f90: 66 64 20 61 6e 64 20 24 6d 73 67 20 2d 20 73 6f fd and $msg - so
1fa0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63 61 the callback ca
1fb0: 6e 20 64 65 63 69 64 65 0a 20 2a 09 77 68 61 74 n decide. *.what
1fc0: 20 74 6f 20 64 6f 20 77 69 74 68 20 65 72 72 6f to do with erro
1fd0: 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 rs.. *. * Side e
1fe0: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 ffects:. *.The e
1ff0: 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 rr field of the
2000: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 currently operat
2010: 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 ive State is set
2020: 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e . *. to a strin
2030: 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 g describing the
2040: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e SSL negotiation
2050: 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a failure reason.
2060: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20a0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 -----. */.void.T
20b0: 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 2a ls_Error(State *
20c0: 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 2a statePtr, char *
20d0: 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 msg) {. Tcl_I
20e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
20f0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
2100: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
2110: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
2120: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ode;.. dprint
2130: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
2140: 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d 73 if (msg && *ms
2150: 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 g) {..Tcl_SetErr
2160: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
2170: 53 53 4c 22 2c 20 6d 73 67 2c 20 28 63 68 61 72 SSL", msg, (char
2180: 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 *)NULL);. }
2190: 65 6c 73 65 20 7b 0a 09 6d 73 67 20 3d 20 54 63 else {..msg = Tc
21a0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
21b0: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 bj(Tcl_GetObjRes
21c0: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55 4c ult(interp), NUL
21d0: 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 L);. }. st
21e0: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 atePtr->err = ms
21f0: 67 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 g;.. if (stat
2200: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
2210: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
2220: 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 ) {..char buf[BU
2230: 46 53 49 5a 5d 3b 0a 09 73 70 72 69 6e 74 66 28 FSIZ];..sprintf(
2240: 62 75 66 2c 20 22 53 53 4c 20 63 68 61 6e 6e 65 buf, "SSL channe
2250: 6c 20 5c 22 25 73 5c 22 3a 20 65 72 72 6f 72 3a l \"%s\": error:
2260: 20 25 73 22 2c 0a 09 20 20 20 20 54 63 6c 5f 47 %s",.. Tcl_G
2270: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
2280: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 6d atePtr->self), m
2290: 73 67 29 3b 0a 09 54 63 6c 5f 53 65 74 52 65 73 sg);..Tcl_SetRes
22a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 62 75 66 2c ult(interp, buf,
22b0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a TCL_VOLATILE);.
22c0: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 #if (TCL_MAJOR_V
22d0: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 ERSION == 8) &&
22e0: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 (TCL_MINOR_VERSI
22f0: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 ON < 6)..Tcl_Bac
2300: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 kgroundError(int
2310: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c erp);.#else..Tcl
2320: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 _BackgroundExcep
2330: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 54 43 4c tion(interp, TCL
2340: 5f 45 52 52 4f 52 29 3b 0a 23 65 6e 64 69 66 0a _ERROR);.#endif.
2350: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 .return;. }.
2360: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
2370: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
2380: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
2390: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ;.. Tcl_ListO
23a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
23b0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
23c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
23d0: 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a ("error", -1));.
23e0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
23f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2400: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
2410: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
2420: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
2430: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
2440: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
2450: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2460: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2470: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
2480: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 wStringObj(msg,
2490: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 -1));.. Tcl_P
24a0: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
24b0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
24c0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
24d0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
24e0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ePtr);.. Tcl_
24f0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
2500: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d Ptr);. code =
2510: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 Tcl_EvalObjEx(i
2520: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2530: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b CL_EVAL_GLOBAL);
2540: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d . if (code !=
2550: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 TCL_OK) {.#if (
2560: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
2570: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f N == 8) && (TCL_
2580: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 MINOR_VERSION <
2590: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6)..Tcl_Backgrou
25a0: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ndError(interp);
25b0: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b .#else..Tcl_Back
25c0: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 groundException(
25d0: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 interp, code);.#
25e0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 endif. }.
25f0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
2600: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 (cmdPtr);. Tc
2610: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
2620: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
2630: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 ;. Tcl_Releas
2640: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
2650: 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 nterp);.}.../*.
2660: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26a0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f ----. *. * KeyLo
26b0: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a gCallback --. *.
26c0: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 *.Write receive
26d0: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f d key data to lo
26e0: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 g file.. *. * Si
26f0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
2700: 6f 6e 65 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d one. *----------
2710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
2750: 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 id KeyLogCallbac
2760: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
2770: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 , const char *li
2780: 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a ne) {. char *
2790: 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c str = getenv(SSL
27a0: 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 KEYLOGFILE);.
27b0: 20 46 49 4c 45 20 2a 66 64 3b 0a 20 20 20 20 69 FILE *fd;. i
27c0: 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 f (str) {..fd =
27d0: 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b fopen(str, "a");
27e0: 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 ..fprintf(fd, "%
27f0: 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c s\n",line);..fcl
2800: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d ose(fd);. }.}
2810: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
2820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
2860: 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 * Password Callb
2870: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c ack --. *. *.Cal
2880: 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 77 led when a passw
2890: 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 74 6f ord is needed to
28a0: 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e 64 20 unpack RSA and
28b0: 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 76 61 PEM keys.. *.Eva
28c0: 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 61 73 ls any bound pas
28d0: 73 77 6f 72 64 20 73 63 72 69 70 74 20 61 6e 64 sword script and
28e0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65 73 returns the res
28f0: 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 70 61 ult as. *.the pa
2900: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e 0a 20 ssword string..
2910: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2950: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
2960: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c int.PasswordCall
2970: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 back(char *buf,
2980: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 int size, int ve
2990: 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 61 74 rify, void *udat
29a0: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a a) {. State *
29b0: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 statePtr.= (Stat
29c0: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 e *) udata;.
29d0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
29e0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
29f0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
2a00: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
2a10: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 int code;.. d
2a20: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
2a30: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
2a40: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d Ptr->password ==
2a50: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 NULL) {..if (Tc
2a60: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c l_EvalEx(interp,
2a70: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 "tls::password"
2a80: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 , -1, TCL_EVAL_G
2a90: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b LOBAL) == TCL_OK
2aa0: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 ) {.. char *r
2ab0: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 et = (char *) Tc
2ac0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c l_GetStringResul
2ad0: 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 t(interp);..
2ae0: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 strncpy(buf, ret
2af0: 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 , (size_t) size)
2b00: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 ;.. return (i
2b10: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a nt)strlen(ret);.
2b20: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 .} else {.. r
2b30: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 eturn -1;..}.
2b40: 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d }.. cmdPtr =
2b50: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
2b60: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 j(statePtr->pass
2b70: 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f word);.. Tcl_
2b80: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
2b90: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
2ba0: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
2bb0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
2bc0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c tePtr);.. Tcl
2bd0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
2be0: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 dPtr);. code
2bf0: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 = Tcl_EvalObjEx(
2c00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2c10: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
2c20: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 ;. if (code !
2c30: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 = TCL_OK) {.#if
2c40: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
2c50: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
2c60: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
2c70: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
2c80: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 undError(interp)
2c90: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 ;.#else..Tcl_Bac
2ca0: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e kgroundException
2cb0: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a (interp, code);.
2cc0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 #endif. }.
2cd0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
2ce0: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 t(cmdPtr);..
2cf0: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
2d00: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
2d10: 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 63 6f 64 r);.. if (cod
2d20: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 e == TCL_OK) {..
2d30: 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 char *ret = (cha
2d40: 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 r *) Tcl_GetStri
2d50: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 ngResult(interp)
2d60: 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e 28 72 65 ;..if (strlen(re
2d70: 74 29 20 3c 20 73 69 7a 65 20 2d 20 31 29 20 7b t) < size - 1) {
2d80: 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 .. strncpy(bu
2d90: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 f, ret, (size_t)
2da0: 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 54 63 6c size);.. Tcl
2db0: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
2dc0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 Data) interp);..
2dd0: 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 return (int)
2de0: 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 0a strlen(ret);..}.
2df0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 }. Tcl_Re
2e00: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
2e10: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 a) interp);.
2e20: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76 65 72 69 return -1;..veri
2e30: 66 79 20 3d 20 76 65 72 69 66 79 3b 0a 7d 0a 0c fy = verify;.}..
2e40: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2e90: 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b Session Callback
2ea0: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a for Clients --.
2eb0: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 *. *.Called whe
2ec0: 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 n a new session
2ed0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 is added to the
2ee0: 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e cache. In TLS 1.
2ef0: 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 3. *.this may be
2f00: 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 received multip
2f10: 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 le times after t
2f20: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f he handshake. Fo
2f30: 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 r. *.earlier ver
2f40: 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c sions, this will
2f50: 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 be received dur
2f60: 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b ing the handshak
2f70: 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 e.. *.This is th
2f80: 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20 e preferred way
2f90: 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 to obtain a resu
2fa0: 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 mable session..
2fb0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
2fc0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
2fd0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
2fe0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
2ff0: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
3000: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 eturn codes:. *.
3010: 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 0 = error where
3020: 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 session will be
3030: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f immediately remo
3040: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 ved from the int
3050: 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 ernal cache.. *.
3060: 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 1 = success wher
3070: 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 e app retains se
3080: 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e ssion in session
3090: 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 cache, and must
30a0: 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f call SSL_SESSIO
30b0: 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f N_free() when do
30c0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3110: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 .static int.Sess
3120: 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 ionCallback(cons
3130: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f t SSL *ssl, SSL_
3140: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e SESSION *session
3150: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
3160: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
3170: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
3180: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a ta((SSL *)ssl);.
3190: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
31a0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
31b0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
31c0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
31d0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
31e0: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
31f0: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
3200: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
3210: 6e 5f 69 64 3b 0a 20 20 20 20 69 6e 74 20 63 6f n_id;. int co
3220: 64 65 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c de;. size_t l
3230: 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 en2;. unsigne
3240: 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 d int ulen;..
3250: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
3260: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
3270: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
3280: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
3290: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
32a0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
32b0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
32c0: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 sl == NULL) {..r
32d0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
32e0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
32f0: 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 }.. cmdPtr =
3300: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
3310: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
3320: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
3330: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
3340: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
3350: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
3360: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d Obj("session", -
3370: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 1));.. /* Ses
3380: 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 sion id */. s
3390: 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f ession_id = SSL_
33a0: 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 SESSION_get_id(s
33b0: 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a ession, &ulen);.
33c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
33d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
33e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
33f0: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a _NewByteArrayObj
3400: 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e (session_id, (in
3410: 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 t) ulen));..
3420: 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 /* Session ticke
3430: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 t */. SSL_SES
3440: 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
3450: 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 (session, &ticke
3460: 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 t, &len2);. T
3470: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3480: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3490: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 cmdPtr, Tcl_NewB
34a0: 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b yteArrayObj(tick
34b0: 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 et, (int) len2))
34c0: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 ;.. /* Lifeti
34d0: 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 me - number of s
34e0: 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 econds */. Tc
34f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3500: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3510: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c mdPtr,..Tcl_NewL
3520: 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 ongObj((long) SS
3530: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
3540: 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 cket_lifetime_hi
3550: 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a nt(session)));..
3560: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
3570: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
3580: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 terp);. Tcl_P
3590: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
35a0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
35b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
35c0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
35d0: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 code = Tcl_Ev
35e0: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 alObjEx(interp,
35f0: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c cmdPtr, TCL_EVAL
3600: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 _GLOBAL);. if
3610: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b (code != TCL_OK
3620: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ) {.#if (TCL_MAJ
3630: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
3640: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
3650: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
3660: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
3670: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
3680: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
3690: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
36a0: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 code);.#endif.
36b0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
36c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
36d0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 );.. Tcl_Rele
36e0: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
36f0: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 statePtr);.
3700: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
3710: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
3720: 3b 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d ; return 0;.}
3730: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
3740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
3780: 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 * ALPN Callback
3790: 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 for Servers --.
37a0: 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 *. *.Perform ser
37b0: 76 65 72 2d 73 69 64 65 20 70 72 6f 74 6f 63 6f ver-side protoco
37c0: 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c l (http/1.1, h2,
37d0: 20 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 h3, etc.) selec
37e0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 tion for the. *.
37f0: 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 incoming connect
3800: 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 ion. Called afte
3810: 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 r Hello and serv
3820: 65 72 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 09 er callbacks. *.
3830: 57 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 Where 'out' is s
3840: 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
3850: 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 and 'in' is the
3860: 20 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 peer advertised
3870: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 list.. *. * Res
3880: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
3890: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
38a0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
38b0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
38c0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
38d0: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 des:. *.SSL_TLSE
38e0: 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 XT_ERR_OK: ALPN
38f0: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 protocol selecte
3900: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f d. The connectio
3910: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 n continues.. *.
3920: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
3930: 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 LERT_FATAL: Ther
3940: 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 e was no overlap
3950: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 between the cli
3960: 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 ent's. *. sup
3970: 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 plied list and t
3980: 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 he server config
3990: 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e uration. The con
39a0: 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 nection will be
39b0: 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f aborted.. *.SSL_
39c0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
39d0: 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 : ALPN protocol
39e0: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e not selected, e.
39f0: 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 g., because no A
3a00: 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f LPN. *. proto
3a10: 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 cols are configu
3a20: 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e red for this con
3a30: 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e nection. The con
3a40: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
3a50: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d s.. *. *--------
3a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
3aa0: 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 static int.ALPNC
3ab0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
3ac0: 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e L *ssl, const un
3ad0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 signed char **ou
3ae0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 t, unsigned char
3af0: 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 *outlen,..const
3b00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
3b10: 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 in, unsigned int
3b20: 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 inlen, void *ar
3b30: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a g) {. State *
3b40: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
3b50: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f e*)arg;. Tcl_
3b60: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d Interp *interp.=
3b70: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
3b80: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
3b90: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 cmdPtr;. int
3ba0: 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20 code, res;..
3bb0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
3bc0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 );.. if (ssl
3bd0: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d == NULL || arg =
3be0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
3bf0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
3c00: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
3c10: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f /* Select pro
3c20: 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20 tocol */. if
3c30: 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 (SSL_select_next
3c40: 5f 70 72 6f 74 6f 28 6f 75 74 2c 20 6f 75 74 6c _proto(out, outl
3c50: 65 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 en, statePtr->pr
3c60: 6f 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d 3e otos, statePtr->
3c70: 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c protos_len,..in,
3c80: 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 inlen) == OPENS
3c90: 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 SL_NPN_NEGOTIATE
3ca0: 44 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f D) {..res = SSL_
3cb0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
3cc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 } else {../*
3cd0: 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75 No overlap, so u
3ce0: 73 65 20 66 69 72 73 74 20 63 6c 69 65 6e 74 20 se first client
3cf0: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 72 65 73 protocol */..res
3d00: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 = SSL_TLSEXT_ER
3d10: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a R_NOACK;. }..
3d20: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
3d30: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
3d40: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
3d50: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
3d60: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
3d70: 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 .. cmdPtr = T
3d80: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
3d90: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
3da0: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 ck);. Tcl_Lis
3db0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3dc0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3dd0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
3de0: 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b bj("alpn", -1));
3df0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
3e00: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3e10: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
3e20: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a l_NewStringObj(*
3e30: 6f 75 74 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 out, -1));..
3e40: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c Tcl_Preserve((Cl
3e50: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 ientData) interp
3e60: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 );. Tcl_Prese
3e70: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 rve((ClientData)
3e80: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 statePtr);..
3e90: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
3ea0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 t(cmdPtr);. c
3eb0: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 ode = Tcl_EvalOb
3ec0: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 jEx(interp, cmdP
3ed0: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f tr, TCL_EVAL_GLO
3ee0: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f BAL);. if (co
3ef0: 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a de != TCL_OK) {.
3f00: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 #if (TCL_MAJOR_V
3f10: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 ERSION == 8) &&
3f20: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 (TCL_MINOR_VERSI
3f30: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 ON < 6)..Tcl_Bac
3f40: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 kgroundError(int
3f50: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c erp);.#else..Tcl
3f60: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 _BackgroundExcep
3f70: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 tion(interp, cod
3f80: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d e);.#endif. }
3f90: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
3fa0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a Count(cmdPtr);..
3fb0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
3fc0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
3fd0: 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f tePtr);. Tcl_
3fe0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
3ff0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
4000: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a return res;.}.
4010: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
4060: 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f SNI Callback fo
4070: 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a r Servers --. *.
4080: 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65 *.Perform serve
4090: 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e r-side SNI hostn
40a0: 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 ame selection af
40b0: 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e ter receiving SN
40c0: 49 20 68 65 61 64 65 72 2e 0a 20 2a 09 43 61 6c I header.. *.Cal
40d0: 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 led after hello
40e0: 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 callback but bef
40f0: 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 ore ALPN callbac
4100: 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 k.. *. * Results
4110: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.None. *. *
4120: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
4130: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 .Calls callback
4140: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a (if defined). *.
4150: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a * Return codes:
4160: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
4170: 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e RR_OK: SNI hostn
4180: 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e ame is accepted.
4190: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
41a0: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
41b0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 L_TLSEXT_ERR_ALE
41c0: 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f RT_FATAL: SNI ho
41d0: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
41e0: 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e cepted. The conn
41f0: 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 ection. *. is
4200: 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c aborted. Defaul
4210: 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 t for alert is S
4220: 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a SL_AD_UNRECOGNIZ
4230: 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f ED_NAME.. *.SSL_
4240: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 TLSEXT_ERR_ALERT
4250: 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f _WARNING: SNI ho
4260: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
4270: 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 cepted, warning
4280: 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e alert. *. sen
4290: 74 20 28 6e 6f 74 20 69 6e 20 54 4c 53 76 31 2e t (not in TLSv1.
42a0: 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 3). The connecti
42b0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
42c0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
42d0: 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e NOACK: SNI hostn
42e0: 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 ame is not accep
42f0: 74 65 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e ted and not ackn
4300: 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 owledged,. *.
4310: 20 65 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 e.g. if SNI has
4320: 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 not been config
4330: 75 72 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 ured. The connec
4340: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a tion continues..
4350: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
43a0: 74 69 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 tic int.SNICallb
43b0: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
43c0: 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 sl, int *alert,
43d0: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 void *arg) {.
43e0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
43f0: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a = (State*)arg;.
4400: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
4410: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
4420: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
4430: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
4440: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 int code;.
4450: 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 char *serverna
4460: 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 me = NULL;..
4470: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
4480: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 );.. if (ssl
4490: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d == NULL || arg =
44a0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
44b0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
44c0: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
44d0: 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 servername =
44e0: 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 SSL_get_serverna
44f0: 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e me(ssl, TLSEXT_N
4500: 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d AMETYPE_host_nam
4510: 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72 e);. if (!ser
4520: 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 vername || serve
4530: 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 rname[0] == '\0'
4540: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 ) {. retu
4550: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
4560: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a R_NOACK;. }..
4570: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
4580: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
4590: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
45a0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
45b0: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
45c0: 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 .. cmdPtr = T
45d0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
45e0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
45f0: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 ck);. Tcl_Lis
4600: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4610: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4620: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
4630: 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b 0a bj("sni", -1));.
4640: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4650: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4660: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
4670: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 _NewStringObj(se
4680: 72 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b rvername , -1));
4690: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 .. Tcl_Preser
46a0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
46b0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c interp);. Tcl
46c0: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
46d0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
46e0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 ;.. Tcl_IncrR
46f0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
4700: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f . code = Tcl_
4710: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 EvalObjEx(interp
4720: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 , cmdPtr, TCL_EV
4730: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 AL_GLOBAL);.
4740: 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f if (code != TCL_
4750: 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d OK) {.#if (TCL_M
4760: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 AJOR_VERSION ==
4770: 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 8) && (TCL_MINOR
4780: 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 _VERSION < 6)..T
4790: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 cl_BackgroundErr
47a0: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 or(interp);.#els
47b0: 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e e..Tcl_Backgroun
47c0: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 dException(inter
47d0: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 p, code);.#endif
47e0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
47f0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
4800: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 tr);.. Tcl_Re
4810: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
4820: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 a) statePtr);.
4830: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 Tcl_Release((C
4840: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 lientData) inter
4850: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 p);. return S
4860: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
4870: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
48c0: 2a 0a 20 2a 20 48 65 6c 6c 6f 20 48 61 6e 64 73 *. * Hello Hands
48d0: 68 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f hake Callback fo
48e0: 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a r Servers --. *.
48f0: 20 2a 09 55 73 65 64 20 62 79 20 73 65 72 76 65 *.Used by serve
4900: 72 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 r to examine the
4910: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 server name ind
4920: 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 ication (SNI) ex
4930: 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 tension. *.provi
4940: 64 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e ded by the clien
4950: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 t in order to se
4960: 6c 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 lect an appropri
4970: 61 74 65 20 63 65 72 74 69 66 69 63 61 74 65 20 ate certificate
4980: 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 to. *.present, a
4990: 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f nd make other co
49a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 nfiguration adju
49b0: 73 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 stments relevant
49c0: 20 74 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a to that server.
49d0: 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 *.name and its
49e0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 configuration. T
49f0: 68 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 his includes swa
4a00: 70 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 pping out the as
4a10: 73 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f sociated. *.SSL_
4a20: 43 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 CTX pointer, mod
4a30: 69 66 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 ifying the serve
4a40: 72 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d r's list of perm
4a50: 69 74 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f itted TLS versio
4a60: 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 ns,. *.changing
4a70: 74 68 65 20 73 65 72 76 65 72 27 73 20 63 69 70 the server's cip
4a80: 68 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 her list in resp
4a90: 6f 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 onse to the clie
4aa0: 6e 74 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 nt's cipher list
4ab0: 2c 20 65 74 63 2e 0a 20 2a 0a 20 2a 20 52 65 73 , etc.. *. * Res
4ac0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
4ad0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
4ae0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
4af0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
4b00: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
4b10: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 des:. *.SSL_CLIE
4b20: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 20 3d NT_HELLO_RETRY =
4b30: 20 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e suspend the han
4b40: 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 dshake, and the
4b50: 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 handshake functi
4b60: 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 on will return i
4b70: 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 mmediately. *.SS
4b80: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
4b90: 52 52 4f 52 20 3d 20 66 61 69 6c 75 72 65 2c 20 RROR = failure,
4ba0: 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 terminate connec
4bb0: 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 tion. Set alert
4bc0: 74 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 to error code..
4bd0: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c *.SSL_CLIENT_HEL
4be0: 4c 4f 5f 53 55 43 43 45 53 53 20 3d 20 73 75 63 LO_SUCCESS = suc
4bf0: 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d cess. *. *------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4c40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c /.static int.Hel
4c50: 6c 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 loCallback(const
4c60: 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a SSL *ssl, int *
4c70: 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 alert, void *arg
4c80: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
4c90: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
4ca0: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 *)arg;. Tcl_I
4cb0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
4cc0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
4cd0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
4ce0: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
4cf0: 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 ode;. const c
4d00: 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 3b har *servername;
4d10: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
4d20: 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 ned char *p;.
4d30: 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 6d size_t len, rem
4d40: 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70 72 aining;.. dpr
4d50: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
4d60: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
4d70: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 r->callback == (
4d80: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b Tcl_Obj*)NULL) {
4d90: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
4da0: 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 ENT_HELLO_SUCCES
4db0: 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 S;. } else if
4dc0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (ssl == NULL ||
4dd0: 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a arg == NULL) {.
4de0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
4df0: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
4e00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 }.. /* Ge
4e10: 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 t names */. i
4e20: 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 f (!SSL_client_h
4e30: 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 ello_get0_ext(ss
4e40: 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 l, TLSEXT_TYPE_s
4e50: 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 erver_name, &p,
4e60: 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 &remaining) || r
4e70: 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b emaining <= 2) {
4e80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 . return
4e90: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
4ea0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
4eb0: 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 /* Extract th
4ec0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 e length of the
4ed0: 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 6f 66 supplied list of
4ee0: 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c names. */. l
4ef0: 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 en = (*(p++) <<
4f00: 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 8);. len += *
4f10: 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c (p++);. if (l
4f20: 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e en + 2 != remain
4f30: 69 6e 67 29 20 7b 0a 20 20 20 20 20 20 20 20 72 ing) {. r
4f40: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
4f50: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
4f60: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e }. remainin
4f70: 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a g = len;.. /*
4f80: 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70 72 61 The list in pra
4f90: 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 ctice only has a
4fa0: 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c single element,
4fb0: 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 so we only cons
4fc0: 69 64 65 72 20 74 68 65 20 66 69 72 73 74 20 6f ider the first o
4fd0: 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 ne. */. if (r
4fe0: 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c emaining == 0 ||
4ff0: 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f *p++ != TLSEXT_
5000: 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 NAMETYPE_host_na
5010: 6d 65 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 me) {. re
5020: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
5030: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
5040: 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 }. remaining
5050: 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 --;.. /* Now
5060: 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70 we can finally p
5070: 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 65 ull out the byte
5080: 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20 array with the
5090: 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e actual hostname.
50a0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 */. if (rema
50b0: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 20 20 ining <= 2) {.
50c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c return SSL
50d0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
50e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c ROR;. }. l
50f0: 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 en = (*(p++) <<
5100: 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 8);. len += *
5110: 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c (p++);. if (l
5120: 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 en + 2 > remaini
5130: 6e 67 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 ng) {. re
5140: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
5150: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
5160: 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 }. remaining
5170: 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76 = len;. serv
5180: 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 ername = (const
5190: 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20 63 char *)p;.. c
51a0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
51b0: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
51c0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 r->callback);.
51d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
51e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
51f0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
5200: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c ewStringObj("hel
5210: 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lo", -1));. T
5220: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
5230: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
5240: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
5250: 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e tringObj(servern
5260: 61 6d 65 2c 20 28 69 6e 74 29 20 6c 65 6e 29 29 ame, (int) len))
5270: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 ;.. Tcl_Prese
5280: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 rve((ClientData)
5290: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 interp);. Tc
52a0: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 l_Preserve((Clie
52b0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
52c0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 );.. Tcl_Incr
52d0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
52e0: 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c ;. code = Tcl
52f0: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 _EvalObjEx(inter
5300: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 p, cmdPtr, TCL_E
5310: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 VAL_GLOBAL);.
5320: 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c if (code != TCL
5330: 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f _OK) {.#if (TCL_
5340: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d MAJOR_VERSION ==
5350: 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 8) && (TCL_MINO
5360: 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 R_VERSION < 6)..
5370: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 Tcl_BackgroundEr
5380: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c ror(interp);.#el
5390: 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 se..Tcl_Backgrou
53a0: 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 ndException(inte
53b0: 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 rp, code);.#endi
53c0: 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f f. }. Tcl_
53d0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
53e0: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 Ptr);.. Tcl_R
53f0: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
5400: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 ta) statePtr);.
5410: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
5420: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
5430: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 rp);. return
5440: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
5450: 5f 53 55 43 43 45 53 53 3b 0a 7d 0a 0c 0a 2f 2a _SUCCESS;.}.../*
5460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5470: 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 ***/./* Commands
5480: 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a */./***
5490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
54a0: 2a 2f 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
54f0: 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 * CiphersObjCmd
5500: 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 -- list availab
5510: 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a le ciphers. *. *
5520: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
5530: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 is invoked to pr
5540: 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a ocess the "tls::
5550: 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 ciphers" command
5560: 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 . *.to list avai
5570: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 lable ciphers, b
5580: 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 ased upon protoc
5590: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a ol selected.. *.
55a0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
55b0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
55c0: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a sult list.. *. *
55d0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
55e0: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 *.constructs and
55f0: 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f destroys SSL co
5600: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 ntext (CTX). *.
5610: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
5620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5650: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
5660: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 const char *prot
5670: 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 ocols[] = {.."ss
5680: 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c l2", "ssl3", "tl
5690: 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 s1", "tls1.1", "
56a0: 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 tls1.2", "tls1.3
56b0: 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 ", NULL.};.enum
56c0: 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 protocol {. T
56d0: 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c LS_SSL2, TLS_SSL
56e0: 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 3, TLS_TLS1, TLS
56f0: 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 _TLS1_1, TLS_TLS
5700: 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 1_2, TLS_TLS1_3,
5710: 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 TLS_NONE.};..st
5720: 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 atic int.Ciphers
5730: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
5740: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
5750: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
5760: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
5770: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
5780: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ]) {. Tcl_Obj
5790: 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b *objPtr = NULL;
57a0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 . SSL_CTX *ct
57b0: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 x = NULL;. SS
57c0: 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 L *ssl = NULL;.
57d0: 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f STACK_OF(SSL_
57e0: 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 CIPHER) *sk;.
57f0: 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b 42 char *cp, buf[B
5800: 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 UFSIZ];. int
5810: 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20 3d index, verbose =
5820: 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 65 0, use_supporte
5830: 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 d = 0;.. dpri
5840: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
5850: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 if ((objc <
5860: 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 2) || (objc > 4)
5870: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
5880: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
5890: 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c objv, "protocol
58a0: 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 ?verbose? ?supp
58b0: 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 orted?");..retur
58c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
58d0: 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 }. if (Tcl_G
58e0: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 etIndexFromObj(i
58f0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 nterp, objv[1],
5900: 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 protocols, "prot
5910: 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 ocol", 0, &index
5920: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
5930: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
5940: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
5950: 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 (objc > 2) && Tc
5960: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d l_GetBooleanFrom
5970: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
5980: 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 [2], &verbose) !
5990: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
59a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
59b0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 }. if ((ob
59c0: 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 jc > 3) && Tcl_G
59d0: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a etBooleanFromObj
59e0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d (interp, objv[3]
59f0: 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 , &use_supported
5a00: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
5a10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
5a20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
5a30: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
5a40: 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e . switch ((en
5a50: 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 um protocol)inde
5a60: 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 x) {..case TLS_S
5a70: 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c SL2:.#if OPENSSL
5a80: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
5a90: 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c >= 0x10100000L |
5aa0: 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c | defined(NO_SSL
5ab0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
5ac0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 ENSSL_NO_SSL2)..
5ad0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
5ae0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
5af0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
5b00: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
5b10: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
5b20: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
5b30: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
5b40: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 ctx = SSL_CT
5b50: 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65 74 68 X_new(SSLv2_meth
5b60: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 od()); break;.#e
5b70: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 ndif..case TLS_S
5b80: 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 SL3:.#if defined
5b90: 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 (NO_SSL3) || def
5ba0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
5bb0: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
5bc0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
5bd0: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 _METHOD).. Tc
5be0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
5bf0: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
5c00: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
5c10: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
5c20: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
5c30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
5c40: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 R;.#else.. ct
5c50: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 x = SSL_CTX_new(
5c60: 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 29 3b SSLv3_method());
5c70: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
5c80: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 case TLS_TLS1:.#
5c90: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
5ca0: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f S1) || defined(O
5cb0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 PENSSL_NO_TLS1)
5cc0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
5cd0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
5ce0: 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 D).. Tcl_Appe
5cf0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
5d00: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 protocols[index
5d10: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e ], ": protocol n
5d20: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
5d30: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
5d40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c n TCL_ERROR;.#el
5d50: 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 se.. ctx = SS
5d60: 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f L_CTX_new(TLSv1_
5d70: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b method()); break
5d80: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 ;.#endif..case T
5d90: 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 LS_TLS1_1:.#if d
5da0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
5db0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
5dc0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 NSSL_NO_TLS1_1)
5dd0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
5de0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 SL_NO_TLS1_1_MET
5df0: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 HOD).. Tcl_Ap
5e00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
5e10: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
5e20: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
5e30: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
5e40: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
5e50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
5e60: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 else.. ctx =
5e70: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 SSL_CTX_new(TLSv
5e80: 31 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 1_1_method()); b
5e90: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
5ea0: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 se TLS_TLS1_2:.#
5eb0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
5ec0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
5ed0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
5ee0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
5ef0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
5f00: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 _METHOD).. Tc
5f10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
5f20: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
5f30: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
5f40: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
5f50: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
5f60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
5f70: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 R;.#else.. ct
5f80: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 x = SSL_CTX_new(
5f90: 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29 TLSv1_2_method()
5fa0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
5fb0: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f ..case TLS_TLS1_
5fc0: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 3:.#if defined(N
5fd0: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 O_TLS1_3) || def
5fe0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
5ff0: 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 63 6c TLS1_3).. Tcl
6000: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
6010: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
6020: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
6030: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
6040: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 d", NULL);..
6050: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
6060: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 ;.#else.. ctx
6070: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 = SSL_CTX_new(T
6080: 4c 53 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 20 20 LS_method());.
6090: 20 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43 54 SSL_CT
60a0: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f X_set_min_proto_
60b0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 version(ctx, TLS
60c0: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 1_3_VERSION);..
60d0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d SSL_CTX_set_m
60e0: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e ax_proto_version
60f0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 (ctx, TLS1_3_VER
6100: 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 SION);.. brea
6110: 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75 k;.#endif..defau
6120: 6c 74 3a 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a lt:.. break;.
6130: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 74 }. if (ct
6140: 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 x == NULL) {..Tc
6150: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
6160: 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c nterp, REASON(),
6170: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
6180: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
6190: 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f .. ssl = SSL_
61a0: 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 new(ctx);. if
61b0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b (ssl == NULL) {
61c0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
61d0: 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f lt(interp, REASO
61e0: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c N(), NULL);..SSL
61f0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
6200: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
6210: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6220: 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 Use list and or
6230: 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20 der as would be
6240: 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 sent in a Client
6250: 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 Hello or all ava
6260: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a ilable ciphers *
6270: 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75 /. if (use_su
6280: 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d pported) {..sk =
6290: 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 SSL_get1_suppor
62a0: 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29 ted_ciphers(ssl)
62b0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
62c0: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 sk = SSL_get_cip
62d0: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d hers(ssl);. }
62e0: 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 .. if (sk !=
62f0: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 NULL) {..if (!ve
6300: 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f 62 rbose) {.. ob
6310: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
6320: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
6330: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 . for (int i
6340: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f = 0; i < sk_SSL_
6350: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 CIPHER_num(sk);
6360: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 i++) {...const S
6370: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 SL_CIPHER *c = s
6380: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c k_SSL_CIPHER_val
6390: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 ue(sk, i);...if
63a0: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 (c == NULL) cont
63b0: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 inue;..../* ciph
63c0: 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 er name or (NONE
63d0: 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f ) */...cp = SSL_
63e0: 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 CIPHER_get_name(
63f0: 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 c);...if (cp ==
6400: 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 NULL) break;...T
6410: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6420: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6430: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
6440: 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29 tringObj(cp, -1)
6450: 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c );.. }...} el
6460: 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 se {.. objPtr
6470: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 = Tcl_NewString
6480: 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 Obj("",0);..
6490: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 for (int i = 0;
64a0: 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 i < sk_SSL_CIPHE
64b0: 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 R_num(sk); i++)
64c0: 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 {...const SSL_CI
64d0: 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c PHER *c = sk_SSL
64e0: 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b _CIPHER_value(sk
64f0: 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d , i);...if (c ==
6500: 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b NULL) continue;
6510: 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 ..../* textual d
6520: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 escription of th
6530: 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 e cipher */...if
6540: 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 (SSL_CIPHER_des
6550: 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c cription(c, buf,
6560: 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d sizeof(buf)) !=
6570: 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 NULL) {... T
6580: 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f cl_AppendToObj(o
6590: 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 69 6e 74 bjPtr, buf, (int
65a0: 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a ) strlen(buf));.
65b0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 ..} else {...
65c0: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a Tcl_AppendToObj
65d0: 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 (objPtr, "UNKNOW
65e0: 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 N\n", 8);...}..
65f0: 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 }..}..if (use
6600: 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 _supported) {..
6610: 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 sk_SSL_CIPHER
6620: 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 _free(sk);..}.
6630: 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 }. SSL_free
6640: 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 (ssl);. SSL_C
6650: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 TX_free(ctx);..
6660: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
6670: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
6680: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
6690: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 TCL_OK;..clientD
66a0: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
66b0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d ----------------
66f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
6700: 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 *. * ProtocolsOb
6710: 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 jCmd -- list ava
6720: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 ilable protocols
6730: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
6740: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
6750: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 to process the
6760: 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 "tls::protocols"
6770: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c command. *.to l
6780: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 ist available pr
6790: 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 otocols.. *. * R
67a0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
67b0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
67c0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 list.. *. * Sid
67d0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f e effects:. *.no
67e0: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ne. *. *--------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6810: 2d 2d 2d 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 0a 20 2a 2f 0a -----------. */.
6830: 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f static int.Proto
6840: 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e colsObjCmd(Clien
6850: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
6860: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
6870: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
6880: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
6890: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
68a0: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 _Obj *objPtr;..
68b0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
68c0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
68d0: 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c bjc != 1) {..Tcl
68e0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
68f0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
6900: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
6910: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
6920: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
6930: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
6940: 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c L);..#if OPENSSL
6950: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
6960: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 < 0x10100000L &&
6970: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
6980: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
6990: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
69a0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
69b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
69c0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
69d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
69e0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 otocols[TLS_SSL2
69f0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
6a00: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
6a10: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
6a20: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
6a30: 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 3). Tcl_ListO
6a40: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
6a50: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
6a60: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
6a70: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 (protocols[TLS_S
6a80: 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 SL3], -1));.#end
6a90: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
6aa0: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 NO_TLS1) && !def
6ab0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
6ac0: 54 4c 53 31 29 0a 20 20 20 20 54 63 6c 5f 4c 69 TLS1). Tcl_Li
6ad0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
6ae0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
6af0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
6b00: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
6b10: 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 S_TLS1], -1));.#
6b20: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
6b30: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
6b40: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
6b50: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 L_NO_TLS1_1).
6b60: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
6b70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
6b80: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
6b90: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
6ba0: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d cols[TLS_TLS1_1]
6bb0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
6bc0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
6bd0: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
6be0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
6bf0: 53 31 5f 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 S1_2). Tcl_Li
6c00: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
6c10: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
6c20: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
6c30: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
6c40: 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b S_TLS1_2], -1));
6c50: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
6c60: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
6c70: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
6c80: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
6c90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
6ca0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
6cb0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
6cc0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
6cd0: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f tocols[TLS_TLS1_
6ce0: 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 3], -1));.#endif
6cf0: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
6d00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
6d10: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
6d20: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
6d30: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
6d40: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d90: 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b -. *. * Handshak
6da0: 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a eObjCmd --. *. *
6db0: 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 .This command is
6dc0: 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 used to verify
6dd0: 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 whether the hand
6de0: 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 shake is complet
6df0: 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a e. *.or not.. *.
6e00: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
6e10: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
6e20: 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 sult. 1 means ha
6e30: 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 ndshake complete
6e40: 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e , 0 means pendin
6e50: 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 g.. *. * Side ef
6e60: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f fects:. *.May fo
6e70: 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 rce SSL negotiat
6e80: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 ion to take plac
6e90: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
6ee0: 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73 static int Hands
6ef0: 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e hakeObjCmd(Clien
6f00: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
6f10: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
6f20: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
6f30: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
6f40: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
6f50: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 _Channel chan;
6f60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61 /* The cha
6f70: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
6f80: 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 de on. */. St
6f90: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20 ate *statePtr;
6fa0: 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 /* client
6fb0: 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f state for ssl so
6fc0: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 cket */. cons
6fd0: 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d t char *errStr =
6fe0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 NULL;. int r
6ff0: 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 et = 1;. int
7000: 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 err = 0;.. dp
7010: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
7020: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
7030: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
7040: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
7050: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
7060: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 el");..return(TC
7070: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a L_ERROR);. }.
7080: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
7090: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
70a0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
70b0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
70c0: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 NULL), NULL);.
70d0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
70e0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
70f0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c L) {..return(TCL
7100: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a _ERROR);. }..
7110: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
7120: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
7130: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
7140: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
7150: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
7160: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 el(chan);. if
7170: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
7180: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
7190: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
71a0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
71b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
71c0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
71d0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
71e0: 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f e(chan), "\": no
71f0: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 t a TLS channel"
7200: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
7210: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
7220: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 }. statePtr
7230: 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 = (State *)Tcl_G
7240: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
7250: 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 eData(chan);..
7260: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 dprintf("Calli
7270: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f ng Tls_WaitForCo
7280: 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 nnect");. ret
7290: 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f = Tls_WaitForCo
72a0: 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 nnect(statePtr,
72b0: 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 &err, 1);. dp
72c0: 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 rintf("Tls_WaitF
72d0: 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e orConnect return
72e0: 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a ed: %i", ret);..
72f0: 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 if (ret < 0
7300: 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 && ((statePtr->f
7310: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 lags & TLS_TCL_A
7320: 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d SYNC) && (err ==
7330: 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 EAGAIN))) {..dp
7340: 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 rintf("Async set
7350: 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 and err = EAGAI
7360: 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 N");..ret = 0;.
7370: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 } else if (re
7380: 74 20 3c 20 30 29 20 7b 0a 09 65 72 72 53 74 72 t < 0) {..errStr
7390: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 = statePtr->err
73a0: 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 ;..Tcl_ResetResu
73b0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c lt(interp);..Tcl
73c0: 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a _SetErrno(err);.
73d0: 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c ..if (!errStr ||
73e0: 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 (*errStr == 0))
73f0: 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d {.. errStr =
7400: 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 Tcl_PosixError(
7410: 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 interp);..}...Tc
7420: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
7430: 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b nterp, "handshak
7440: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 e failed: ", err
7450: 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 Str, (char *) NU
7460: 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 LL);..dprintf("R
7470: 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 eturning TCL_ERR
7480: 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b OR with handshak
7490: 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 e failed: %s", e
74a0: 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 rrStr);..return(
74b0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
74c0: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 } else {..if (er
74d0: 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 r != 0) {.. d
74e0: 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 printf("Got an e
74f0: 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 rror with a comp
7500: 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a leted handshake:
7510: 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 err = %i", err)
7520: 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 ;..}..ret = 1;.
7530: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
7540: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c f("Returning TCL
7550: 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 _OK with data \"
7560: 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 %i\"", ret);.
7570: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
7580: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 t(interp, Tcl_Ne
7590: 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 wIntObj(ret));.
75a0: 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b return(TCL_OK
75b0: 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d );..clientData =
75c0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a clientData;.}..
75d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
75e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7610: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 --------. *. * I
7620: 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 mportObjCmd --.
7630: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
7640: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ure is invoked t
7650: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 o process the "s
7660: 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 sl" command. *.
7670: 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e *.The ssl comman
7680: 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 d pushes SSL ove
7690: 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 r a (newly conne
76a0: 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 cted) tcp socket
76b0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
76c0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
76d0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
76e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
76f0: 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 .May modify the
7700: 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 behavior of an I
7710: 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a O channel.. *. *
7720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7760: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
7770: 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 nt.ImportObjCmd(
7780: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
7790: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
77a0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
77b0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
77c0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
77d0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
77e0: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e an;../* The chan
77f0: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
7800: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 e on. */. Sta
7810: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f te *statePtr;../
7820: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
7830: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
7840: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 . SSL_CTX *ct
7850: 78 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c x. = NULL
7860: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 ;. Tcl_Obj *s
7870: 63 72 69 70 74 09 20 20 20 20 20 20 20 20 3d 20 cript. =
7880: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
7890: 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 20 j *password.
78a0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
78b0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 Tcl_DString uppe
78c0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
78d0: 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ion, upperChanne
78e0: 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 lBlocking, upper
78f0: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c ChannelEncoding,
7900: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 upperChannelEOF
7910: 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 Char;. int id
7920: 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 x, len;. int
7930: 66 6c 61 67 73 09 09 20 20 20 20 20 20 20 20 3d flags.. =
7940: 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 TLS_TCL_INIT;.
7950: 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 20 int server..
7960: 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69 = 0;./* i
7970: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 s connection inc
7980: 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e oming or outgoin
7990: 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a g? */. char *
79a0: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 keyfile.
79b0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
79c0: 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20 20 20 *certfile.
79d0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 = NULL;. u
79e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 nsigned char *ke
79f0: 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 y .= NULL;.
7a00: 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20 20 20 int key_len
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b = 0;
7a20: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
7a30: 61 72 20 2a 63 65 72 74 20 20 20 20 20 20 20 20 ar *cert
7a40: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 = NULL;. int
7a50: 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 20 cert_len
7a60: 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 = 0;.
7a70: 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 09 char *ciphers.
7a80: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
7a90: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 char *cipher
7aa0: 73 75 69 74 65 73 09 20 20 20 20 20 20 20 20 3d suites. =
7ab0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
7ac0: 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 *CAfile.
7ad0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
7ae0: 20 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 20 *CAdir..
7af0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
7b00: 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 20 r *DHparams.
7b10: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
7b20: 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 char *model..
7b30: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
7b40: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
7b50: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
7b60: 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f ;./* hostname fo
7b70: 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e r Server Name In
7b80: 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 dication */.
7b90: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
7ba0: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20 har *session_id
7bb0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
7bc0: 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c Obj *alpn..= NUL
7bd0: 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 L;. int ssl2
7be0: 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 = 0, ssl3 = 0;.
7bf0: 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c int tls1 = 1,
7c00: 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 tls1_1 = 1, tls
7c10: 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 1_2 = 1, tls1_3
7c20: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f = 1;. int pro
7c30: 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 to = 0, level =
7c40: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 -1;. int veri
7c50: 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 fy = 0, require
7c60: 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 = 0, request = 1
7c70: 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 , post_handshake
7c80: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e = 0;.. dprin
7c90: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 tf("Called");..#
7ca0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
7cb0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
7cc0: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 100000L && !defi
7cd0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
7ce0: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL2) && !defined
7cf0: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 (NO_SSL2) && def
7d00: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 ined(NO_SSL3) &&
7d10: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
7d20: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f ) && defined(NO_
7d30: 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66 69 6e TLS1_1) && defin
7d40: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 ed(NO_TLS1_2) &&
7d50: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
7d60: 5f 33 29 0a 20 20 20 20 73 73 6c 32 20 3d 20 31 _3). ssl2 = 1
7d70: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
7d80: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7d90: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
7da0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 ed(NO_SSL3) && d
7db0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
7dc0: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
7dd0: 53 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e S1) && defined(N
7de0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66 O_TLS1_1) && def
7df0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
7e00: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
7e10: 53 31 5f 33 29 0a 20 20 20 20 73 73 6c 33 20 3d S1_3). ssl3 =
7e20: 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 1;.#endif.#if d
7e30: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
7e40: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
7e50: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 SL_NO_TLS1).
7e60: 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 tls1 = 0;.#endif
7e70: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
7e80: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
7e90: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7ea0: 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 S1_1). tls1_1
7eb0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
7ec0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
7ed0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
7ee0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
7ef0: 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 ). tls1_2 = 0
7f00: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
7f10: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
7f20: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
7f30: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
7f40: 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 tls1_3 = 0;.#e
7f50: 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 ndif.. if (ob
7f60: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 jc < 2) {..Tcl_W
7f70: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
7f80: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
7f90: 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 annel ?options?"
7fa0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
7fb0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
7fc0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
7fd0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
7fe0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
7ff0: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c Obj(objv[1], NUL
8000: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 L), NULL);. i
8010: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
8020: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
8030: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
8040: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
8050: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
8060: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
8070: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
8080: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
8090: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
80a0: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 an);.. for (i
80b0: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 dx = 2; idx < ob
80c0: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 jc; idx++) {..ch
80d0: 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 ar *opt = Tcl_Ge
80e0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
80f0: 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b bjv[idx], NULL);
8100: 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d ...if (opt[0] !=
8110: 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b '-').. break
8120: 3b 0a 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64 ;...OPTSTR("-cad
8130: 69 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 ir", CAdir);..OP
8140: 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 TSTR("-cafile",
8150: 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 CAfile);..OPTSTR
8160: 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 ("-certfile", ce
8170: 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 rtfile);..OPTSTR
8180: 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 ("-cipher", ciph
8190: 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ers);..OPTSTR("-
81a0: 63 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 ciphers", cipher
81b0: 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 s);..OPTSTR("-ci
81c0: 70 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 phersuites", cip
81d0: 68 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 hersuites);..OPT
81e0: 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 OBJ("-command",
81f0: 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 script);..OPTSTR
8200: 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 ("-dhparams", DH
8210: 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 53 54 52 params);..OPTSTR
8220: 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 ("-keyfile", key
8230: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 file);..OPTSTR("
8240: 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b -model", model);
8250: 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 ..OPTOBJ("-passw
8260: 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b ord", password);
8270: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 ..OPTBOOL("-post
8280: 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 _handshake", pos
8290: 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f t_handshake);..O
82a0: 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 PTBOOL("-require
82b0: 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 ", require);..OP
82c0: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 TBOOL("-request"
82d0: 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 , request);..OPT
82e0: 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 6c 65 INT("-securityle
82f0: 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f vel", level);..O
8300: 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 PTBOOL("-server"
8310: 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 , server);..OPTS
8320: 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 TR("-servername"
8330: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 , servername);..
8340: 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e OPTSTR("-session
8350: 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 _id", session_id
8360: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 );..OPTOBJ("-alp
8370: 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 42 n", alpn);..OPTB
8380: 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c OOL("-ssl2", ssl
8390: 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 2);..OPTBOOL("-s
83a0: 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 sl3", ssl3);..OP
83b0: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 TBOOL("-tls1", t
83c0: 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 ls1);..OPTBOOL("
83d0: 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 -tls1.1", tls1_1
83e0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
83f0: 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a s1.2", tls1_2);.
8400: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e .OPTBOOL("-tls1.
8410: 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 3", tls1_3);..OP
8420: 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 TBYTE("-cert", c
8430: 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a ert, cert_len);.
8440: 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c .OPTBYTE("-key",
8450: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a key, key_len);.
8460: 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e ..OPTBAD("option
8470: 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 ", "-alpn, -cadi
8480: 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 r, -cafile, -cer
8490: 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 t, -certfile, -c
84a0: 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 ipher, -ciphersu
84b0: 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 ites, -command,
84c0: 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c -dhparams, -key,
84d0: 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 -keyfile, -mode
84e0: 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 72 l, -password, -r
84f0: 65 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73 74 equire, -request
8500: 2c 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c , -securitylevel
8510: 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 , -server, -serv
8520: 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e ername, -session
8530: 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c _id, -ssl2, -ssl
8540: 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 3, -tls1, -tls1.
8550: 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 6f 72 20 2d 1, -tls1.2, or -
8560: 74 6c 73 31 2e 33 22 29 3b 0a 0a 09 72 65 74 75 tls1.3");...retu
8570: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
8580: 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 }. if (requ
8590: 65 73 74 29 09 20 20 20 20 76 65 72 69 66 79 20 est). verify
85a0: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c |= SSL_VERIFY_CL
85b0: 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f IENT_ONCE | SSL_
85c0: 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 VERIFY_PEER;.
85d0: 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 if (request &&
85e0: 72 65 71 75 69 72 65 29 20 76 65 72 69 66 79 20 require) verify
85f0: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 |= SSL_VERIFY_FA
8600: 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 IL_IF_NO_PEER_CE
8610: 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 RT;. if (requ
8620: 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 est && post_hand
8630: 73 68 61 6b 65 29 20 20 76 65 72 69 66 79 20 7c shake) verify |
8640: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 = SSL_VERIFY_POS
8650: 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 T_HANDSHAKE;.
8660: 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 if (verify == 0
8670: 29 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 ).verify = SSL_V
8680: 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 ERIFY_NONE;..
8690: 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 proto |= (ssl2
86a0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 ? TLS_PROTO_SSL2
86b0: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f : 0);. proto
86c0: 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f |= (ssl3 ? TLS_
86d0: 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b PROTO_SSL3 : 0);
86e0: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 . proto |= (t
86f0: 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f ls1 ? TLS_PROTO_
8700: 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 TLS1 : 0);. p
8710: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 roto |= (tls1_1
8720: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 ? TLS_PROTO_TLS1
8730: 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f _1 : 0);. pro
8740: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 to |= (tls1_2 ?
8750: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 TLS_PROTO_TLS1_2
8760: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f : 0);. proto
8770: 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c |= (tls1_3 ? TL
8780: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a S_PROTO_TLS1_3 :
8790: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 0);.. /* res
87a0: 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c et to NULL if bl
87b0: 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 ank string provi
87c0: 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 ded */. if (c
87d0: 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 ert && !*cert)..
87e0: 20 20 20 20 20 20 20 20 63 65 72 74 09 20 20 20 cert.
87f0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
8800: 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 if (key && !*ke
8810: 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 y).. key.
8820: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
8830: 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 if (certfile
8840: 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 && !*certfile)
8850: 20 20 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 certfile
8860: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 .= NULL;. if
8870: 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 (keyfile && !*ke
8880: 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 yfile)..keyfile.
8890: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
88a0: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 if (ciphers
88b0: 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 && !*ciphers).
88c0: 20 20 20 20 20 20 63 69 70 68 65 72 73 09 20 20 ciphers.
88d0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
88e0: 20 20 69 66 20 28 63 69 70 68 65 72 73 75 69 74 if (ciphersuit
88f0: 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 es && !*ciphersu
8900: 69 74 65 73 29 20 63 69 70 68 65 72 73 75 69 74 ites) ciphersuit
8910: 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 es = NULL;.
8920: 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 if (CAfile &&
8930: 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 !*CAfile).
8940: 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 CAfile.
8950: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
8960: 28 43 41 64 69 72 20 26 26 20 21 2a 43 41 64 69 (CAdir && !*CAdi
8970: 72 29 09 20 20 20 20 20 20 20 20 43 41 64 69 72 r). CAdir
8980: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
8990: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d . if (DHparam
89a0: 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 s && !*DHparams)
89b0: 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d . DHparam
89c0: 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b s = NULL;
89d0: 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c .. /* new SSL
89e0: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 state */. st
89f0: 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 atePtr..= (State
8a00: 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 *) ckalloc((uns
8a10: 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 igned) sizeof(St
8a20: 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 ate));. memse
8a30: 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 t(statePtr, 0, s
8a40: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a izeof(State));..
8a50: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c statePtr->fl
8a60: 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 ags.= flags;.
8a70: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
8a80: 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 p.= interp;.
8a90: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 statePtr->vflags
8aa0: 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 .= verify;. s
8ab0: 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 tatePtr->err.= "
8ac0: 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 ";.. /* alloc
8ad0: 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 ate script */.
8ae0: 20 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a if (script) {.
8af0: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 .(void) Tcl_GetS
8b00: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 tringFromObj(scr
8b10: 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 ipt, &len);..if
8b20: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 (len) {.. sta
8b30: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
8b40: 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 = script;.. T
8b50: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
8b60: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
8b70: 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ck);..}. }..
8b80: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 /* allocate p
8b90: 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 assword */. i
8ba0: 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 f (password) {..
8bb0: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 (void) Tcl_GetSt
8bc0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 ringFromObj(pass
8bd0: 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 word, &len);..if
8be0: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 (len) {.. st
8bf0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
8c00: 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 = password;..
8c10: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
8c20: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 nt(statePtr->pas
8c30: 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d sword);..}. }
8c40: 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 .. if (model
8c50: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 != NULL) {..int
8c60: 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 mode;../* Get th
8c70: 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 e "model" contex
8c80: 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c t */..chan = Tcl
8c90: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
8ca0: 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 rp, model, &mode
8cb0: 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 );..if (chan ==
8cc0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
8cd0: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 LL) {.. Tls_F
8ce0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
8cf0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
8d00: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
8d10: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 }.../*.. * Make
8d20: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
8d30: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
8d40: 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 hannel.. */..cha
8d50: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
8d60: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 annel(chan);..if
8d70: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
8d80: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
8d90: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
8da0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
8db0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
8dc0: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
8dd0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
8de0: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 lName(chan),..."
8df0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
8e00: 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 annel", NULL);..
8e10: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
8e20: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
8e30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
8e40: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 _ERROR;..}..ctx
8e50: 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f = ((State *)Tcl_
8e60: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
8e70: 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 ceData(chan))->c
8e80: 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b tx;. } else {
8e90: 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43 54 58 ..if ((ctx = CTX
8ea0: 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20 _Init(statePtr,
8eb0: 73 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b server, proto, k
8ec0: 65 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 eyfile, certfile
8ed0: 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 6b 65 79 , key, cert, key
8ee0: 5f 6c 65 6e 2c 0a 09 20 20 20 20 63 65 72 74 5f _len,.. cert_
8ef0: 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 69 len, CAdir, CAfi
8f00: 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 le, ciphers, cip
8f10: 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c hersuites, level
8f20: 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 , DHparams)) ==
8f30: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 NULL) {.. Tls
8f40: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
8f50: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
8f60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8f70: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 ..}. }.. s
8f80: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 tatePtr->ctx = c
8f90: 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 tx;.. /*.
8fa0: 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 * We need to ma
8fb0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 ke sure that the
8fc0: 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 channel works i
8fd0: 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 n binary (for th
8fe0: 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 e. * encrypt
8ff0: 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 ion not to get g
9000: 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 oofed up)..
9010: 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 * We only want t
9020: 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 o adjust the buf
9030: 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 fering in pre-v2
9040: 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 channels, where
9050: 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 . * each cha
9060: 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 nnel in the stac
9070: 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 k maintained its
9080: 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 own buffers..
9090: 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 */. Tcl_DS
90a0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
90b0: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
90c0: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 on);. Tcl_DSt
90d0: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
90e0: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b hannelBlocking);
90f0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
9100: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
9110: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 elEOFChar);.
9120: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
9130: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
9140: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f oding);. Tcl_
9150: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
9160: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
9170: 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 -eofchar", &uppe
9180: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
9190: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
91a0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
91b0: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 p, chan, "-encod
91c0: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e ing", &upperChan
91d0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 nelEncoding);.
91e0: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
91f0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
9200: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 han, "-translati
9210: 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e on", &upperChann
9220: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
9230: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e Tcl_GetChann
9240: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
9250: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e chan, "-blockin
9260: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 g", &upperChanne
9270: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 lBlocking);.
9280: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
9290: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
92a0: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
92b0: 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 ", "binary");.
92c0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
92d0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
92e0: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 han, "-blocking"
92f0: 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 , "true");. d
9300: 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e printf("Consumin
9310: 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 g Tcl channel %s
9320: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
9330: 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 lName(chan));.
9340: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 statePtr->self
9350: 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e = Tcl_StackChan
9360: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f nel(interp, Tls_
9370: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 ChannelType(), (
9380: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
9390: 65 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 ePtr, (TCL_READA
93a0: 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 BLE | TCL_WRITAB
93b0: 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 LE), chan);.
93c0: 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 dprintf("Created
93d0: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 channel named %
93e0: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e s", Tcl_GetChann
93f0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
9400: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 >self));. if
9410: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 (statePtr->self
9420: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
9430: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a NULL) {../*.. *
9440: 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 No use of Tcl_E
9450: 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 ventuallyFree be
9460: 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c cause no possibl
9470: 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a e Tcl_Preserve..
9480: 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 . */..Tls_Free((
9490: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
94a0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
94b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
94c0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
94d0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 ption(interp, st
94e0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d atePtr->self, "-
94f0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 translation", Tc
9500: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
9510: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
9520: 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 slation));. T
9530: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
9540: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
9550: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e ePtr->self, "-en
9560: 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 coding", Tcl_DSt
9570: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
9580: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
9590: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
95a0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
95b0: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
95c0: 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 lf, "-eofchar",
95d0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
95e0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f (&upperChannelEO
95f0: 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c FChar));. Tcl
9600: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
9610: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
9620: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 tr->self, "-bloc
9630: 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 king", Tcl_DStri
9640: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
9650: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b annelBlocking));
9660: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
9670: 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 SSL Initializati
9680: 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 on. */. s
9690: 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 tatePtr->ssl = S
96a0: 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d SL_new(statePtr-
96b0: 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 >ctx);. if (!
96c0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b statePtr->ssl) {
96d0: 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 ../* SSL library
96e0: 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 error */..Tcl_A
96f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
9700: 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f rp, "couldn't co
9710: 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 nstruct ssl sess
9720: 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 ion: ", REASON()
9730: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9740: 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 ;..Tls_Free((cha
9750: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
9760: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
9770: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
9780: 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 Set host server
9790: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 name */. if
97a0: 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 (servername) {..
97b0: 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76 /* Sets the serv
97c0: 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 er name indicati
97d0: 6f 6e 20 28 53 4e 49 29 20 43 6c 69 65 6e 74 48 on (SNI) ClientH
97e0: 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a ello extension *
97f0: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f /..if (!SSL_set_
9800: 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 tlsext_host_name
9810: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
9820: 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 servername) && r
9830: 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 equire) {.. T
9840: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
9850: 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 interp, "setting
9860: 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 TLS host name e
9870: 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 xtension failed"
9880: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9890: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6c ;. Tl
98a0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
98b0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 statePtr);.
98c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 return TC
98d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 L_ERROR;.
98e0: 20 7d 0a 0a 09 2f 2a 20 43 6f 6e 66 69 67 75 72 }.../* Configur
98f0: 65 20 73 65 72 76 65 72 20 68 6f 73 74 20 6e 61 e server host na
9900: 6d 65 20 63 68 65 63 6b 73 20 69 6e 20 74 68 65 me checks in the
9910: 20 53 53 4c 20 63 6c 69 65 6e 74 2e 20 53 65 74 SSL client. Set
9920: 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 74 6f DNS hostname to
9930: 0a 09 20 20 20 6e 61 6d 65 20 66 6f 72 20 70 65 .. name for pe
9940: 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20 63 er certificate c
9950: 68 65 63 6b 73 2e 20 53 53 4c 5f 73 65 74 31 5f hecks. SSL_set1_
9960: 68 6f 73 74 20 68 61 73 20 6c 69 6d 69 74 61 74 host has limitat
9970: 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 ions. */..if (!S
9980: 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 SL_add1_host(sta
9990: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 tePtr->ssl, serv
99a0: 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 ername)) {..
99b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
99c0: 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e (interp, "settin
99d0: 67 20 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 g DNS host name
99e0: 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a failed", (char *
99f0: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 ) NULL);.
9a00: 20 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 Tls_Free((c
9a10: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
9a20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 ;. re
9a30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9a40: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
9a50: 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 Resume session
9a60: 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 id */. if (se
9a70: 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c ssion_id && strl
9a80: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c en(session_id) <
9a90: 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 = SSL_MAX_SID_CT
9aa0: 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 X_LENGTH) {../*
9ab0: 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_set_session(
9ac0: 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 ) */..if (!SSL_S
9ad0: 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 ESSION_set1_id_c
9ae0: 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 ontext(SSL_get_s
9af0: 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d ession(statePtr-
9b00: 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 >ssl), session_i
9b10: 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 d, (unsigned int
9b20: 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e ) strlen(session
9b30: 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 _id))) {.. Tc
9b40: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
9b50: 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 nterp, "Resume s
9b60: 65 73 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 ession id ", ses
9b70: 73 69 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 sion_id, " faile
9b80: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
9b90: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 L);.
9ba0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
9bb0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 ) statePtr);.
9bc0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 return
9bd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
9be0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 61 6c 70 }.. if (alp
9bf0: 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 n) {../* Convert
9c00: 20 61 20 54 63 6c 20 6c 69 73 74 20 69 6e 74 6f a Tcl list into
9c10: 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 a protocol-list
9c20: 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 in wire-format
9c30: 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 */..unsigned cha
9c40: 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 r *protos, *p;..
9c50: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f unsigned int pro
9c60: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e tos_len = 0;..in
9c70: 74 20 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 t i, len, cnt;..
9c80: 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a Tcl_Obj **list;.
9c90: 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 ..if (Tcl_ListOb
9ca0: 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 jGetElements(int
9cb0: 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c erp, alpn, &cnt,
9cc0: 20 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f &list) != TCL_O
9cd0: 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 K) {.. Tls_Fr
9ce0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
9cf0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
9d00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
9d10: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 .../* Determine
9d20: 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 the memory requi
9d30: 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 red for the prot
9d40: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f ocol-list */..fo
9d50: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e r (i = 0; i < cn
9d60: 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 t; i++) {.. T
9d70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
9d80: 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 Obj(list[i], &le
9d90: 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e n);.. if (len
9da0: 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f > 255) {...Tcl_
9db0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
9dc0: 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f erp, "ALPN proto
9dd0: 63 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e col name too lon
9de0: 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c g", (char *) NUL
9df0: 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 L);...Tls_Free((
9e00: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
9e10: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
9e20: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 ERROR;.. }..
9e30: 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d protos_len +=
9e40: 20 31 20 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 1 + len;..}.../
9e50: 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 * Build the comp
9e60: 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 lete protocol-li
9e70: 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 st */..protos =
9e80: 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c ckalloc(protos_l
9e90: 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f en);../* protoco
9ea0: 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 l-lists consist
9eb0: 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d of 8-bit length-
9ec0: 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 prefixed, byte s
9ed0: 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 trings */..for (
9ee0: 69 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f i = 0, p = proto
9ef0: 73 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 s; i < cnt; i++)
9f00: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 {.. char *st
9f10: 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e r = Tcl_GetStrin
9f20: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d gFromObj(list[i]
9f30: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 , &len);.. *p
9f40: 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 6d ++ = len;.. m
9f50: 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 6c 65 emcpy(p, str, le
9f60: 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 n);.. p += le
9f70: 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 n;..}.../* SSL_s
9f80: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d et_alpn_protos m
9f90: 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 akes a copy of t
9fa0: 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 he protocol-list
9fb0: 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 */../* Note: Th
9fc0: 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 is functions rev
9fd0: 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72 6e erses the return
9fe0: 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f value conventio
9ff0: 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 n */..if (SSL_se
a000: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 t_alpn_protos(st
a010: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f atePtr->ssl, pro
a020: 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 tos, protos_len)
a030: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
a040: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
a050: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73 65 74 , "failed to set
a060: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 22 ALPN protocols"
a070: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
a080: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
a090: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
a0a0: 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 r);.. ckfree(
a0b0: 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 protos);.. re
a0c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
a0d0: 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 .}.../* Store pr
a0e0: 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a otocols list */.
a0f0: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
a100: 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 s = protos;..sta
a110: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 tePtr->protos_le
a120: 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a n = protos_len;.
a130: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 } else {..st
a140: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d atePtr->protos =
a150: 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 NULL;..statePtr
a160: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 ->protos_len = 0
a170: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a ;. }.. /*.
a180: 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 * SSL Callb
a190: 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 acks. */.
a1a0: 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 SSL_set_app_dat
a1b0: 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c a(statePtr->ssl,
a1c0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
a1d0: 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 r);./* point bac
a1e0: 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 k to us */. S
a1f0: 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 SL_set_verify(st
a200: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 atePtr->ssl, ver
a210: 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 ify, VerifyCallb
a220: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 ack);. SSL_CT
a230: 58 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 X_set_info_callb
a240: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ack(statePtr->ct
a250: 78 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 x, InfoCallback)
a260: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 ;.. /* Create
a270: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f Tcl_Channel BIO
a280: 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 Handler */.
a290: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 statePtr->p_bio.
a2a0: 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 = BIO_new_tcl(st
a2b0: 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c atePtr, BIO_NOCL
a2c0: 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 OSE);. stateP
a2d0: 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 tr->bio.= BIO_ne
a2e0: 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a w(BIO_f_ssl());.
a2f0: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 29 . if (server)
a300: 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 {../* Server ca
a310: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f llbacks */..SSL_
a320: 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 CTX_set_tlsext_s
a330: 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 ervername_arg(st
a340: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f atePtr->ctx, (vo
a350: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
a360: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 .SSL_CTX_set_tls
a370: 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 ext_servername_c
a380: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 allback(statePtr
a390: 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 ->ctx, SNICallba
a3a0: 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 ck);..SSL_CTX_se
a3b0: 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 t_client_hello_c
a3c0: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c b(statePtr->ctx,
a3d0: 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 HelloCallback,
a3e0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
a3f0: 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 );..if (statePtr
a400: 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c ->protos != NULL
a410: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 ) {.. SSL_CTX
a420: 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 _set_alpn_select
a430: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
a440: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c x, ALPNCallback,
a450: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
a460: 72 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 r);..}.../* Enab
a470: 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e le server to sen
a480: 64 20 63 65 72 74 20 72 65 71 75 65 73 74 20 61 d cert request a
a490: 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 fter handshake (
a4a0: 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f TLS 1.3 only) */
a4b0: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 ..if (request &&
a4c0: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 post_handshake)
a4d0: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 {.. SSL_veri
a4e0: 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 fy_client_post_h
a4f0: 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 andshake(statePt
a500: 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 73 74 r->ssl);..}...st
a510: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d atePtr->flags |=
a520: 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b TLS_TCL_SERVER;
a530: 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 ..SSL_set_accept
a540: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d _state(statePtr-
a550: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 >ssl);. } els
a560: 65 20 7b 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 e {../* Session
a570: 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f caching */..SSL_
a580: 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f CTX_set_session_
a590: 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 cache_mode(state
a5a0: 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 Ptr->ctx, SSL_SE
a5b0: 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 SS_CACHE_CLIENT
a5c0: 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 | SSL_SESS_CACHE
a5d0: 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f _NO_INTERNAL_STO
a5e0: 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 RE);..SSL_CTX_se
a5f0: 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 ss_set_new_cb(st
a600: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 atePtr->ctx, Ses
a610: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a sionCallback);..
a620: 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 ./* Enable post
a630: 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e handshake Authen
a640: 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 tication extensi
a650: 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 on. TLS 1.3 only
a660: 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f , not http/2. */
a670: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 ..if (request &&
a680: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 post_handshake)
a690: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f {.. SSL_set_
a6a0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 post_handshake_a
a6b0: 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 uth(statePtr->ss
a6c0: 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 53 53 4c 5f l, 1);..}...SSL_
a6d0: 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 set_connect_stat
a6e0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
a6f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f ;. }. SSL_
a700: 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 set_bio(statePtr
a710: 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d ->ssl, statePtr-
a720: 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 >p_bio, statePtr
a730: 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 ->p_bio);. BI
a740: 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 O_set_ssl(stateP
a750: 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 tr->bio, statePt
a760: 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c r->ssl, BIO_NOCL
a770: 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 OSE);.. /*.
a780: 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 * End of SSL
a790: 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 Init. */.
a7a0: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e dprintf("Return
a7b0: 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 ing %s", Tcl_Get
a7c0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
a7d0: 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 ePtr->self));.
a7e0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 Tcl_SetResult(
a7f0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 interp, (char *)
a800: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
a810: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
a820: 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c lf), TCL_VOLATIL
a830: 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 E);.. return
a840: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 TCL_OK;..clientD
a850: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
a860: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
a870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
a8b0: 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a *. * UnimportObj
a8c0: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
a8d0: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
a8e0: 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 nvoked to remove
a8f0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
a900: 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a nnel filter.. *.
a910: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
a920: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
a930: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
a940: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 effects:. *.May
a950: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 modify the beha
a960: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 vior of an IO ch
a970: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d annel.. *. *----
a980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
a9c0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 */.static int.U
a9d0: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c nimportObjCmd(Cl
a9e0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
a9f0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
aa00: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
aa10: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
aa20: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
aa30: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
aa40: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
aa50: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
aa60: 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 on. */.. dpri
aa70: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
aa80: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 if (objc !=
aa90: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
aaa0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
aab0: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c , objv, "channel
aac0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
aad0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
aae0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
aaf0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
ab00: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
ab10: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 jv[1]), NULL);.
ab20: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
ab30: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
ab40: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
ab50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
ab60: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
ab70: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
ab80: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
ab90: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
aba0: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
abb0: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 l(chan);.. if
abc0: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
abd0: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
abe0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
abf0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
ac00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
ac10: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
ac20: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
ac30: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 e(chan),..."\":
ac40: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
ac50: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 l", NULL);..retu
ac60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
ac70: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c }.. if (Tcl
ac80: 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 _UnstackChannel(
ac90: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d interp, chan) ==
aca0: 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 TCL_ERROR) {..r
acb0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
acc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 . }.. retu
acd0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
ace0: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
acf0: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
ad00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad40: 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 -. *. * CTX_Init
ad50: 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 -- construct a
ad60: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 SSL_CTX instance
ad70: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
ad80: 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 *.A valid SSL_C
ad90: 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e TX instance or N
ada0: 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ULL.. *. * Side
adb0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 effects:. *.cons
adc0: 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 tructs SSL conte
add0: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d xt (CTX). *. *--
ade0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
adf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ae00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ae10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ae20: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c -. */.static SSL
ae30: 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 _CTX *.CTX_Init(
ae40: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c State *statePtr,
ae50: 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 int isServer, i
ae60: 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a nt proto, char *
ae70: 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 keyfile, char *c
ae80: 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 ertfile,. uns
ae90: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c igned char *key,
aea0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
aeb0: 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 cert, int key_le
aec0: 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c n, int cert_len,
aed0: 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 char *CAdir,.
aee0: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 char *CAfile,
aef0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 char *ciphers, c
af00: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
af10: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 s, int level, ch
af20: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a ar *DHparams) {.
af30: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
af40: 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 interp = statePt
af50: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 r->interp;. S
af60: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 SL_CTX *ctx = NU
af70: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 LL;. Tcl_DStr
af80: 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f ing ds;. Tcl_
af90: 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 DString ds1;.
afa0: 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 int off = 0;.
afb0: 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 int load_priva
afc0: 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 te_key;. cons
afd0: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 t SSL_METHOD *me
afe0: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e thod;.. dprin
aff0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
b000: 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b if (!proto) {
b010: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
b020: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 lt(interp, "no v
b030: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 alid protocol se
b040: 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a lected", NULL);.
b050: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
b060: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 }.. /* crea
b070: 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a te SSL context *
b080: 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 /.#if OPENSSL_VE
b090: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 RSION_NUMBER >=
b0a0: 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 0x10100000L || d
b0b0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
b0c0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
b0d0: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 SL_NO_SSL2).
b0e0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
b0f0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c o, TLS_PROTO_SSL
b100: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 2)) {..Tcl_Appen
b110: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
b120: 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e "SSL2 protocol n
b130: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
b140: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
b150: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
b160: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
b170: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
b180: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
b190: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
b1a0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
b1b0: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c TO_SSL3)) {..Tcl
b1c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
b1d0: 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 terp, "SSL3 prot
b1e0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
b1f0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
b200: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
b210: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
b220: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 ed(NO_TLS1) || d
b230: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
b240: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 O_TLS1). if (
b250: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
b260: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 LS_PROTO_TLS1))
b270: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
b280: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
b290: 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.0 protocol no
b2a0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
b2b0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
b2c0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
b2d0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
b2e0: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_1) || define
b2f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
b300: 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 1_1). if (ENA
b310: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
b320: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b PROTO_TLS1_1)) {
b330: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
b340: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 lt(interp, "TLS
b350: 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 1.1 protocol not
b360: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
b370: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
b380: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
b390: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
b3a0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
b3b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
b3c0: 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 _2). if (ENAB
b3d0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
b3e0: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a ROTO_TLS1_2)) {.
b3f0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
b400: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
b410: 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .2 protocol not
b420: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
b430: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
b440: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 . }.#endif.#i
b450: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
b460: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_3) || defined(
b470: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
b480: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 3). if (ENABL
b490: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
b4a0: 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 OTO_TLS1_3)) {..
b4b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
b4c0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e (interp, "TLS 1.
b4d0: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 3 protocol not s
b4e0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
b4f0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
b500: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 }.#endif..
b510: 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 switch (proto)
b520: 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 {.#if OPENSSL_V
b530: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
b540: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 0x10100000L && !
b550: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
b560: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
b570: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 NSSL_NO_SSL2).
b580: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
b590: 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d _SSL2:..method =
b5a0: 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 isServer ? SSLv
b5b0: 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 2_server_method(
b5c0: 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 ) : SSLv2_client
b5d0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
b5e0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
b5f0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
b600: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
b610: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 SSL_NO_SSL3) &&
b620: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
b630: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 _NO_SSL3_METHOD)
b640: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
b650: 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f OTO_SSL3:..metho
b660: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 d = isServer ? S
b670: 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 SLv3_server_meth
b680: 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 od() : SSLv3_cli
b690: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
b6a0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
b6b0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
b6c0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
b6d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 PENSSL_NO_TLS1)
b6e0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
b6f0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 SSL_NO_TLS1_METH
b700: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 OD). case TLS
b710: 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 _PROTO_TLS1:..me
b720: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
b730: 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d ? TLSv1_server_m
b740: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f ethod() : TLSv1_
b750: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
b760: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
b770: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
b780: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
b790: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
b7a0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
b7b0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
b7c0: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_1_METHOD).
b7d0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
b7e0: 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 TLS1_1:..method
b7f0: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 = isServer ? TLS
b800: 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 v1_1_server_meth
b810: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 od() : TLSv1_1_c
b820: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
b830: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
b840: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
b850: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
b860: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
b870: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
b880: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
b890: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_2_METHOD).
b8a0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
b8b0: 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_2:..method =
b8c0: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
b8d0: 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 1_2_server_metho
b8e0: 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c d() : TLSv1_2_cl
b8f0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
b900: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
b910: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
b920: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
b930: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
b940: 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 1_3). case TL
b950: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a S_PROTO_TLS1_3:.
b960: 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 ./* Use the gene
b970: 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 ric method and c
b980: 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 onstraint range
b990: 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 after context is
b9a0: 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 created */..met
b9b0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
b9c0: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 TLS_server_meth
b9d0: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e od() : TLS_clien
b9e0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
b9f0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 ak;.#endif. d
ba00: 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f efault:../* Nego
ba10: 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 tiate highest av
ba20: 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 ailable SSL/TLS
ba30: 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 version */..meth
ba40: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
ba50: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f TLS_server_metho
ba60: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 d() : TLS_client
ba70: 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f _method();.#if O
ba80: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
ba90: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
baa0: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 00L && !defined(
bab0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 NO_SSL2) && !def
bac0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
bad0: 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 SSL2)..off |= (E
bae0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
baf0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 S_PROTO_SSL2)
bb00: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
bb10: 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 SSLv2);.#endif.#
bb20: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 if !defined(NO_S
bb30: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
bb40: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
bb50: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
bb60: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
bb70: 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 OTO_SSL3) ? 0
bb80: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 : SSL_OP_NO_SSLv
bb90: 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 3);.#endif.#if !
bba0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
bbb0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
bbc0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f NSSL_NO_TLS1)..o
bbd0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
bbe0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
bbf0: 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 TLS1) ? 0 : SS
bc00: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a L_OP_NO_TLSv1);.
bc10: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
bc20: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 ned(NO_TLS1_1) &
bc30: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
bc40: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f SL_NO_TLS1_1)..o
bc50: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
bc60: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
bc70: 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 TLS1_1) ? 0 : SS
bc80: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 L_OP_NO_TLSv1_1)
bc90: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
bca0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
bcb0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
bcc0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a NSSL_NO_TLS1_2).
bcd0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
bce0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
bcf0: 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 O_TLS1_2) ? 0 :
bd00: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f SSL_OP_NO_TLSv1_
bd10: 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 2);.#endif.#if !
bd20: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
bd30: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
bd40: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
bd50: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
bd60: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
bd70: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 OTO_TLS1_3) ? 0
bd80: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
bd90: 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 1_3);.#endif..br
bda0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 eak;. }..
bdb0: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
bdc0: 29 3b 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c );. ctx = SSL
bdd0: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 _CTX_new(method)
bde0: 3b 0a 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 ;.. if (!ctx)
bdf0: 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 {..return(NULL)
be00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
be10: 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f (getenv(SSLKEYLO
be20: 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 GFILE)) {..SSL_C
be30: 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 TX_set_keylog_ca
be40: 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c llback(ctx, KeyL
be50: 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 ogCallback);.
be60: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 }..#if !defined
be70: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 (NO_TLS1_3) && !
be80: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
be90: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 NO_TLS1_3). i
bea0: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f f (proto == TLS_
beb0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a PROTO_TLS1_3) {.
bec0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e .SSL_CTX_set_min
bed0: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
bee0: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
bef0: 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 ON);..SSL_CTX_se
bf00: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 t_max_proto_vers
bf10: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
bf20: 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a VERSION);. }.
bf30: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 #endif.. /* F
bf40: 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 orce cipher sele
bf50: 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 ction order by s
bf60: 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 erver */. if
bf70: 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 (!isServer) {..S
bf80: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
bf90: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 ns(ctx, SSL_OP_C
bfa0: 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 IPHER_SERVER_PRE
bfb0: 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a FERENCE);. }.
bfc0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
bfd0: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 _app_data(ctx, (
bfe0: 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f void*)interp);./
bff0: 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 * remember the i
c000: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 nterpreter */.
c010: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 SSL_CTX_set_op
c020: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
c030: 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 P_ALL);./* all S
c040: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e SL bug workaroun
c050: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 ds */. SSL_CT
c060: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
c070: 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 x, off);../* dis
c080: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 able protocol ve
c090: 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 rsions */.#if OP
c0a0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
c0b0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 MBER < 0x1010100
c0c0: 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 0L. SSL_CTX_s
c0d0: 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c et_mode(ctx, SSL
c0e0: 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 _MODE_AUTO_RETRY
c0f0: 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 );./* handle new
c100: 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 handshakes in b
c110: 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 ackground. On by
c120: 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e default in Open
c130: 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 SSL 1.1.1. */.#e
c140: 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 ndif. SSL_CTX
c150: 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f _sess_set_cache_
c160: 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a size(ctx, 128);.
c170: 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72 . /* Set user
c180: 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 73 defined ciphers
c190: 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73 2c , cipher suites,
c1a0: 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65 and security le
c1b0: 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 vel */. if ((
c1c0: 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 ciphers != NULL)
c1d0: 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 && !SSL_CTX_set
c1e0: 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 _cipher_list(ctx
c1f0: 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 20 , ciphers)) {..
c200: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
c210: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 ult(interp, "Set
c220: 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a ciphers failed:
c230: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 No valid cipher
c240: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c s", (char *) NUL
c250: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
c260: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
c270: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 return NULL;.
c280: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 }. if ((cip
c290: 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c hersuites != NUL
c2a0: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 L) && !SSL_CTX_s
c2b0: 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 et_ciphersuites(
c2c0: 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 ctx, ciphersuite
c2d0: 73 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 s)) {.. Tcl_A
c2e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
c2f0: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 20 rp, "Set cipher
c300: 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e suites failed: N
c310: 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 o valid ciphers"
c320: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
c330: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
c340: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
c350: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
c360: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 }.. /* Set se
c370: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a curity level */.
c380: 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 if (level >
c390: 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 -1 && level < 6)
c3a0: 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 {../* SSL_set_s
c3b0: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f ecurity_level */
c3c0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 ..SSL_CTX_set_se
c3d0: 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 curity_level(ctx
c3e0: 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a , level);. }.
c3f0: 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 . /* set some
c400: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 callbacks */.
c410: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 SSL_CTX_set_de
c420: 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 fault_passwd_cb(
c430: 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c ctx, PasswordCal
c440: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f lback);. SSL_
c450: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
c460: 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 passwd_cb_userda
c470: 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 ta(ctx, (void *)
c480: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
c490: 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 65 /* read a Diffie
c4a0: 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 -Hellman paramet
c4b0: 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 ers file, or use
c4c0: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e the built-in on
c4d0: 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e e */.#ifdef OPEN
c4e0: 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 SSL_NO_DH. if
c4f0: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 (DHparams != NU
c500: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
c510: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
c520: 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 "DH parameter su
c530: 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 pport not availa
c540: 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ble", (char *) N
c550: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
c560: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
c570: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
c580: 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 lse. {..DH* d
c590: 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 h;..if (DHparams
c5a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
c5b0: 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 BIO *bio;..
c5c0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
c5d0: 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d &ds);.. bio =
c5e0: 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 BIO_new_file(F2
c5f0: 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 N(DHparams, &ds)
c600: 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 , "r");.. if
c610: 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 (!bio) {...Tcl_D
c620: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
c630: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
c640: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 ult(interp, "Cou
c650: 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 ld not find DH p
c660: 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c arameters file",
c670: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
c680: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
c690: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e ctx);...return N
c6a0: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ULL;.. }...
c6b0: 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f dh = PEM_read_
c6c0: 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f bio_DHparams(bio
c6d0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 , NULL, NULL, NU
c6e0: 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 LL);.. BIO_fr
c6f0: 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 ee(bio);.. Tc
c700: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
c710: 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 s);.. if (!dh
c720: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
c730: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
c740: 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 Could not read D
c750: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f H parameters fro
c760: 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a m file", (char *
c770: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
c780: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
c790: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 return NULL;..
c7a0: 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 }..} else {..
c7b0: 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50 61 dh = get_dhPa
c7c0: 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f rams();..}..SSL_
c7d0: 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 CTX_set_tmp_dh(c
c7e0: 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 tx, dh);..DH_fre
c7f0: 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e e(dh);. }.#en
c800: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 dif.. /* set
c810: 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 our certificate
c820: 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 */. load_priv
c830: 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 ate_key = 0;.
c840: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d if (certfile !=
c850: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 NULL) {..load_p
c860: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a rivate_key = 1;.
c870: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 ..Tcl_DStringIni
c880: 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 t(&ds);...if (SS
c890: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 L_CTX_use_certif
c8a0: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 icate_file(ctx,
c8b0: 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 F2N(certfile, &d
c8c0: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 s), SSL_FILETYPE
c8d0: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 _PEM) <= 0) {..
c8e0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
c8f0: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 ee(&ds);.. Tc
c900: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
c910: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
c920: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 o set certificat
c930: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 e file ", certfi
c940: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 le, ": ",....
c950: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 REASON(), (cha
c960: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
c970: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
c980: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
c990: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 NULL;..}. } e
c9a0: 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 lse if (cert !=
c9b0: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 NULL) {..load_pr
c9c0: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 ivate_key = 1;..
c9d0: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
c9e0: 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 certificate_ASN1
c9f0: 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 (ctx, cert_len,
ca00: 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 cert) <= 0) {..
ca10: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
ca20: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 ee(&ds);.. Tc
ca30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
ca40: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
ca50: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 o set certificat
ca60: 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 e: ",.... RE
ca70: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
ca80: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
ca90: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
caa0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
cab0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
cac0: 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 {..certfile = (c
cad0: 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 har*)X509_get_de
cae0: 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 fault_cert_file(
caf0: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 );...if (SSL_CTX
cb00: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
cb10: 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 _file(ctx, certf
cb20: 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ile, SSL_FILETYP
cb30: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 E_PEM) <= 0) {.#
cb40: 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 if 0.. Tcl_DS
cb50: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
cb60: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
cb70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
cb80: 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 nable to use def
cb90: 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 ault certificate
cba0: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c file ", certfil
cbb0: 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 e, ": ",....
cbc0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
cbd0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
cbe0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
cbf0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
cc00: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 ULL;.#endif..}.
cc10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 }.. /* set
cc20: 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 our private key
cc30: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 */. if (load
cc40: 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a _private_key) {.
cc50: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 .if (keyfile ==
cc60: 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e NULL && key == N
cc70: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 ULL) {.. keyf
cc80: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a ile = certfile;.
cc90: 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 .}...if (keyfile
cca0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
ccb0: 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 /* get the priv
ccc0: 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 ate key associat
ccd0: 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 ed with this cer
cce0: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 tificate */..
ccf0: 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 if (keyfile ==
cd00: 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c NULL) {...keyfil
cd10: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 e = certfile;..
cd20: 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 }... if (S
cd30: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 SL_CTX_use_Priva
cd40: 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 teKey_file(ctx,
cd50: 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 F2N(keyfile, &ds
cd60: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ), SSL_FILETYPE_
cd70: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 PEM) <= 0) {...T
cd80: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
cd90: 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 ds);.../* flush
cda0: 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 the passphrase w
cdb0: 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 hich might be le
cdc0: 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 ft in the result
cdd0: 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 */...Tcl_SetRes
cde0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c ult(interp, NULL
cdf0: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 , TCL_STATIC);..
ce00: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
ce10: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
ce20: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 e to set public
ce30: 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 key file ", keyf
ce40: 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 ile, " ",....
ce50: 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 REASON(),
ce60: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
ce70: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
ce80: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
ce90: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 LL;.. }..
cea0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
ceb0: 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 &ds);...} else i
cec0: 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 f (key != NULL)
ced0: 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 {.. if (SSL_C
cee0: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 TX_use_PrivateKe
cef0: 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f y_ASN1(EVP_PKEY_
cf00: 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 RSA, ctx, key,ke
cf10: 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 y_len) <= 0) {..
cf20: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
cf30: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 (&ds);.../* flus
cf40: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 h the passphrase
cf50: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 which might be
cf60: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 left in the resu
cf70: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 lt */...Tcl_SetR
cf80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 esult(interp, NU
cf90: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b LL, TCL_STATIC);
cfa0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
cfb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
cfc0: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 ble to set publi
cfd0: 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e c key: ", REASON
cfe0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
cff0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
d000: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
d010: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 n NULL;.. }..
d020: 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f }../* Now we kno
d030: 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 w that a key and
d040: 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 cert have been
d050: 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 set against.. *
d060: 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 the SSL context
d070: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 */..if (!SSL_CTX
d080: 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b _check_private_k
d090: 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 ey(ctx)) {..
d0a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d0b0: 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 (interp, "privat
d0c0: 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d e key does not m
d0d0: 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69 atch the certifi
d0e0: 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 cate public key"
d0f0: 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20 ,.... (char
d100: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
d110: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
d120: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
d130: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 LL;..}. }..
d140: 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63 /* Set verific
d150: 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 ation CAs */.
d160: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
d170: 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 (&ds);. Tcl_D
d180: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 StringInit(&ds1)
d190: 3b 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 ;. if (!SSL_C
d1a0: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c TX_load_verify_l
d1b0: 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 ocations(ctx, F2
d1c0: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 N(CAfile, &ds),
d1d0: 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29 F2N(CAdir, &ds1)
d1e0: 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 ) ||..!SSL_CTX_s
d1f0: 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 et_default_verif
d200: 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a y_paths(ctx)) {.
d210: 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 #if 0..Tcl_DStri
d220: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63 ngFree(&ds);..Tc
d230: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
d240: 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 s1);../* Don't c
d250: 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66 urrently care if
d260: 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 this fails */..
d270: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d280: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65 (interp, "SSL de
d290: 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 74 fault verify pat
d2a0: 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c hs: ", REASON(),
d2b0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d2c0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
d2d0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
d2e0: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a L;.#endif. }.
d2f0: 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f . /* https://
d300: 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f sourceforge.net/
d310: 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a p/tls/bugs/57/ *
d320: 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 /. /* XXX:TOD
d330: 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 O: Let the user
d340: 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 supply values he
d350: 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f re instead of so
d360: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 mething that exi
d370: 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 sts on the files
d380: 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 ystem */. if
d390: 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 (CAfile != NULL)
d3a0: 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 {..STACK_OF(X50
d3b0: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 9_NAME) *certNam
d3c0: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c es = SSL_load_cl
d3d0: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e ient_CA_file(F2N
d3e0: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a (CAfile, &ds));.
d3f0: 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 .if (certNames !
d400: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 = NULL) {.. S
d410: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
d420: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 t_CA_list(ctx, c
d430: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 ertNames);..}.
d440: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
d450: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 ringFree(&ds);.
d460: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
d470: 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 ee(&ds1);. re
d480: 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a turn ctx;.}.../*
d490: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
d4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d4d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 ------. *. * Sta
d4e0: 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 tusObjCmd -- ret
d4f0: 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 urn certificate
d500: 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 for connected pe
d510: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
d520: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
d530: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
d540: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
d550: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
d560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d5a0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
d5b0: 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 t.StatusObjCmd(C
d5c0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
d5d0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
d5e0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
d5f0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
d600: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
d610: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
d620: 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 ;. X509 *peer
d630: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f ;. Tcl_Obj *o
d640: 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 bjPtr;. Tcl_C
d650: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 hannel chan;.
d660: 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 char *channelNa
d670: 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 me, *ciphers;.
d680: 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 int mode;.
d690: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
d6a0: 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 har *proto;.
d6b0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e unsigned int len
d6c0: 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 3b 0a 0a ;. int nid;..
d6d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
d6e0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 77 69 74 led");.. swit
d6f0: 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73 ch (objc) {..cas
d700: 65 20 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65 e 2:.. channe
d710: 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 lName = Tcl_GetS
d720: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
d730: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 v[1], NULL);..
d740: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 break;...case
d750: 33 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 72 3:.. if (!str
d760: 63 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 69 cmp (Tcl_GetStri
d770: 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d ng (objv[1]), "-
d780: 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 61 local")) {...cha
d790: 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 nnelName = Tcl_G
d7a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
d7b0: 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a objv[2], NULL);.
d7c0: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a ..break;.. }.
d7d0: 09 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c . /* else fal
d7e0: 6c 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20 2a 2f l-through ... */
d7f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 .#if defined(__G
d800: 4e 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 74 NUC__).. __at
d810: 74 72 69 62 75 74 65 5f 5f 28 28 66 61 6c 6c 74 tribute__((fallt
d820: 68 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64 69 66 hrough));.#endif
d830: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 ..default:..
d840: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
d850: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
d860: 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e , "?-local? chan
d870: 6e 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74 75 nel");.. retu
d880: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
d890: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
d8a0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
d8b0: 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 nterp, channelNa
d8c0: 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 me, &mode);.
d8d0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
d8e0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
d8f0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
d900: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f ROR;. }. /
d910: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
d920: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
d930: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
d940: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
d950: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
d960: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c an);. if (Tcl
d970: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
d980: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
d990: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
d9a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d9b0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
d9c0: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
d9d0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
d9e0: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 n),..."\": not a
d9f0: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
da00: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
da10: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
da20: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 statePtr = (S
da30: 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 tate *) Tcl_GetC
da40: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
da50: 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 ta(chan);. if
da60: 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
da70: 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 peer = SSL_get_p
da80: 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 eer_certificate(
da90: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
daa0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 } else {..pe
dab0: 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 er = SSL_get_cer
dac0: 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 tificate(statePt
dad0: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 r->ssl);. }.
dae0: 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 if (peer) {..
daf0: 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 objPtr = Tls_New
db00: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 X509Obj(interp,
db10: 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 peer);..if (objc
db20: 20 3d 3d 20 32 29 20 7b 20 58 35 30 39 5f 66 72 == 2) { X509_fr
db30: 65 65 28 70 65 65 72 29 3b 20 7d 0a 20 20 20 20 ee(peer); }.
db40: 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 } else {..objPtr
db50: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
db60: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 j(0, NULL);.
db70: 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 63 }.. /* Peer c
db80: 65 72 74 20 63 68 61 69 6e 20 28 63 6c 69 65 6e ert chain (clien
db90: 74 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20 53 t only) */. S
dba0: 54 41 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20 73 TACK_OF(X509)* s
dbb0: 73 6c 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f 67 sl_certs = SSL_g
dbc0: 65 74 5f 70 65 65 72 5f 63 65 72 74 5f 63 68 61 et_peer_cert_cha
dbd0: 69 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c in(statePtr->ssl
dbe0: 29 3b 0a 20 20 20 20 69 66 20 28 21 70 65 65 72 );. if (!peer
dbf0: 20 26 26 20 28 73 73 6c 5f 63 65 72 74 73 20 3d && (ssl_certs =
dc00: 3d 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35 30 = NULL || sk_X50
dc10: 39 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 74 73 29 9_num(ssl_certs)
dc20: 20 3d 3d 20 30 29 29 20 7b 0a 09 72 65 74 75 72 == 0)) {..retur
dc30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
dc40: 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 }.. /* Peer
dc50: 6e 61 6d 65 20 66 72 6f 6d 20 63 65 72 74 20 2a name from cert *
dc60: 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 /. Tcl_ListOb
dc70: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
dc80: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
dc90: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
dca0: 22 70 65 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29 "peername", -1))
dcb0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
dcc0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
dcd0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
dce0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
dcf0: 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d SSL_get0_peernam
dd00: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
dd10: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c , -1));.. Tcl
dd20: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
dd30: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
dd40: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
dd50: 69 6e 67 4f 62 6a 28 22 73 62 69 74 73 22 2c 20 ingObj("sbits",
dd60: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
dd70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
dd80: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
dd90: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a r, Tcl_NewIntObj
dda0: 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f (SSL_get_cipher_
ddb0: 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 bits(statePtr->s
ddc0: 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 sl, NULL)));..
ddd0: 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 ciphers = (cha
dde0: 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 r*)SSL_get_ciphe
ddf0: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 r(statePtr->ssl)
de00: 3b 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 ;. if ((ciphe
de10: 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 28 rs != NULL) && (
de20: 73 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c 20 strcmp(ciphers,
de30: 22 28 4e 4f 4e 45 29 22 29 20 21 3d 20 30 29 29 "(NONE)") != 0))
de40: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
de50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
de60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
de70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 _NewStringObj("c
de80: 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 ipher", -1));..T
de90: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
dea0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
deb0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
dec0: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 tringObj(SSL_get
ded0: 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 _cipher(statePtr
dee0: 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 ->ssl), -1));.
def0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 }.. /* Veri
df00: 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 fy the X509 cert
df10: 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 ificate presente
df20: 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f d by the peer */
df30: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
df40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
df50: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
df60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
df70: 76 65 72 69 66 69 63 61 74 69 6f 6e 22 2c 20 2d verification", -
df80: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
df90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
dfa0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
dfb0: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 ,..Tcl_NewString
dfc0: 4f 62 6a 28 58 35 30 39 5f 76 65 72 69 66 79 5f Obj(X509_verify_
dfd0: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e cert_error_strin
dfe0: 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 g(SSL_get_verify
dff0: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 _result(statePtr
e000: 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 29 3b 0a 0a ->ssl)), -1));..
e010: 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 /* Report th
e020: 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
e030: 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
e040: 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 of the negotiati
e050: 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 on */. SSL_ge
e060: 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 t0_alpn_selected
e070: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
e080: 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 &proto, &len);.
e090: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
e0a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
e0b0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
e0c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c NewStringObj("al
e0d0: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 pn", -1));. T
e0e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
e0f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
e100: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
e110: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a tringObj((char *
e120: 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 )proto, (int) le
e130: 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 n));. Tcl_Lis
e140: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
e150: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
e160: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
e170: 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d bj("protocol", -
e180: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
e190: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
e1a0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
e1b0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
e1c0: 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 bj(SSL_get_versi
e1d0: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c on(statePtr->ssl
e1e0: 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a ), -1));.. /*
e1f0: 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 Valid for non-R
e200: 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 SA signature and
e210: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 TLS 1.3 */.
e220: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e230: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e240: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
e250: 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 67 6e 61 StringObj("signa
e260: 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 tureHashAlgorith
e270: 6d 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 m", -1));. if
e280: 20 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 53 53 (objc == 2 ? SS
e290: 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 L_get_peer_signa
e2a0: 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 ture_nid(statePt
e2b0: 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20 r->ssl, &nid) :
e2c0: 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 SSL_get_signatur
e2d0: 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
e2e0: 73 73 6c 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54 ssl, &nid)) {..T
e2f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
e300: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
e310: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
e320: 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 tringObj(OBJ_nid
e330: 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 2ln(nid), -1));.
e340: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
e350: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
e360: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
e370: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
e380: 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 ringObj("", -1))
e390: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
e3a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
e3b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
e3c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
e3d0: 6e 67 4f 62 6a 28 22 73 69 67 6e 61 74 75 72 65 ngObj("signature
e3e0: 5f 74 79 70 65 22 2c 20 2d 31 29 29 3b 0a 20 20 _type", -1));.
e3f0: 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 20 if (objc == 2
e400: 3f 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 ? SSL_get_peer_s
e410: 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 ignature_type_ni
e420: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c d(statePtr->ssl,
e430: 20 26 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65 74 &nid) : SSL_get
e440: 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f _signature_type_
e450: 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
e460: 6c 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54 63 6c l, &nid)) {..Tcl
e470: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
e480: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
e490: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
e4a0: 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c ingObj(OBJ_nid2l
e4b0: 6e 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 20 20 n(nid), -1));.
e4c0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f } else {..Tcl_
e4d0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
e4e0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
e4f0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
e500: 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a ngObj("", -1));.
e510: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 }.. Tcl_S
e520: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
e530: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
e540: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
e550: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
e560: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
e570: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
e580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e5b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e ------. *. * Con
e5c0: 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d nectionInfoObjCm
e5d0: 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e d -- return conn
e5e0: 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d ection info from
e5f0: 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 OpenSSL.. *. *
e600: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 Results:. *.A li
e610: 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e st of connection
e620: 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d info. *. *----
e630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
e670: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 */..static int
e680: 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 ConnectionInfoOb
e690: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
e6a0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
e6b0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
e6c0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
e6d0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
e6e0: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e {. Tcl_Chann
e6f0: 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 el chan;../* The
e700: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 channel to set
e710: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 a mode on. */.
e720: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
e730: 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 r;../* client st
e740: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b ate for ssl sock
e750: 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 et */. Tcl_Ob
e760: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 63 j *objPtr;. c
e770: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 onst SSL *ssl;.
e780: 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 const SSL_CIP
e790: 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 HER *cipher;.
e7a0: 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 const SSL_SESSI
e7b0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 ON *session;.
e7c0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
e7d0: 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 char *proto;.
e7e0: 20 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20 long mode;..
e7f0: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 if (objc != 2)
e800: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
e810: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
e820: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b bjv, "channel");
e830: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
e840: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
e850: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
e860: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 annel(interp, Tc
e870: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
e880: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c bj(objv[1], NULL
e890: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 ), NULL);. if
e8a0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
e8b0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
e8c0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
e8d0: 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f R);. }.. /
e8e0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
e8f0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
e900: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
e910: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
e920: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
e930: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c an);. if (Tcl
e940: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
e950: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
e960: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
e970: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e980: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
e990: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
e9a0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
e9b0: 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 n), "\": not a T
e9c0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
e9d0: 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f L);..return(TCL_
e9e0: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 ERROR);. }..
e9f0: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
ea00: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
ea10: 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e LL);.. /* Con
ea20: 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a nection info */.
ea30: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
ea40: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
ea50: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
ea60: 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 ta(chan);. ss
ea70: 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 l = statePtr->ss
ea80: 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 l;. if (ssl !
ea90: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f = NULL) {../* co
eaa0: 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a nnection state *
eab0: 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
eac0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
ead0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
eae0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 NewStringObj("st
eaf0: 61 74 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ate", -1));..Tcl
eb00: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
eb10: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
eb20: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
eb30: 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 ingObj(SSL_state
eb40: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c _string_long(ssl
eb50: 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 ), -1));.../* Ge
eb60: 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 t SNI requested
eb70: 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 server name */..
eb80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
eb90: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
eba0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
ebb0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 72 76 65 StringObj("serve
ebc0: 72 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 rname", -1));..T
ebd0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
ebe0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
ebf0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
ec00: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 tringObj(SSL_get
ec10: 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c _servername(ssl,
ec20: 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 TLSEXT_NAMETYPE
ec30: 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 _host_name), -1)
ec40: 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 );.../* Get prot
ec50: 6f 63 6f 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 ocol */..Tcl_Lis
ec60: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
ec70: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
ec80: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
ec90: 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d bj("protocol", -
eca0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
ecb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
ecc0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
ecd0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
ece0: 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 SSL_get_version(
ecf0: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a ssl), -1));.../*
ed00: 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 Renegotiation a
ed10: 6c 6c 6f 77 65 64 20 2a 2f 0a 09 54 63 6c 5f 4c llowed */..Tcl_L
ed20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
ed30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
ed40: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
ed50: 67 4f 62 6a 28 22 72 65 6e 65 67 6f 74 69 61 74 gObj("renegotiat
ed60: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ion", -1));..Tcl
ed70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
ed80: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
ed90: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
eda0: 69 6e 67 4f 62 6a 28 0a 09 20 20 20 20 53 53 4c ingObj(.. SSL
edb0: 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 _get_secure_rene
edc0: 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 gotiation_suppor
edd0: 74 28 73 73 6c 29 20 3f 20 22 73 75 70 70 6f 72 t(ssl) ? "suppor
ede0: 74 65 64 22 20 3a 20 22 6e 6f 74 20 73 75 70 70 ted" : "not supp
edf0: 6f 72 74 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 orted", -1));...
ee00: 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 20 /* Get security
ee10: 6c 65 76 65 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 level */..Tcl_Li
ee20: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
ee30: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
ee40: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
ee50: 4f 62 6a 28 22 73 65 63 75 72 69 74 79 6c 65 76 Obj("securitylev
ee60: 65 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f el", -1));..Tcl_
ee70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
ee80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
ee90: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
eea0: 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 bj(SSL_get_secur
eeb0: 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 29 ity_level(ssl)))
eec0: 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 ;.../* Session i
eed0: 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 nfo */..Tcl_List
eee0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
eef0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
ef00: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
ef10: 6a 28 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 j("session_reuse
ef20: 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c d", -1));..Tcl_L
ef30: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
ef40: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
ef50: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 tr, Tcl_NewBoole
ef60: 61 6e 4f 62 6a 28 53 53 4c 5f 73 65 73 73 69 6f anObj(SSL_sessio
ef70: 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 29 3b n_reused(ssl)));
ef80: 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 .../* Is server
ef90: 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 info */..Tcl_Lis
efa0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
efb0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
efc0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
efd0: 62 6a 28 22 69 73 5f 73 65 72 76 65 72 22 2c 20 bj("is_server",
efe0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
eff0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f000: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f010: 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 Tcl_NewBooleanOb
f020: 6a 28 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 j(SSL_is_server(
f030: 73 73 6c 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 ssl)));. }..
f040: 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 /* Cipher inf
f050: 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 o */. cipher
f060: 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e = SSL_get_curren
f070: 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 t_cipher(ssl);.
f080: 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d if (cipher !=
f090: 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 NULL) {..char b
f0a0: 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d uf[BUFSIZ] = {0}
f0b0: 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 ;..int bits, alg
f0c0: 5f 62 69 74 73 3b 0a 0a 09 54 63 6c 5f 4c 69 73 _bits;...Tcl_Lis
f0d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
f0e0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
f0f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
f100: 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29 bj("cipher", -1)
f110: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
f120: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f130: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f140: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
f150: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d L_CIPHER_get_nam
f160: 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b e(cipher), -1));
f170: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
f180: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f190: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f1a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 ewStringObj("sta
f1b0: 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 2d 31 29 ndard_name", -1)
f1c0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
f1d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f1e0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f1f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
f200: 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 L_CIPHER_standar
f210: 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 d_name(cipher),
f220: 2d 31 29 29 3b 0a 0a 09 62 69 74 73 20 3d 20 53 -1));...bits = S
f230: 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 SL_CIPHER_get_bi
f240: 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f ts(cipher, &alg_
f250: 62 69 74 73 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 bits);..Tcl_List
f260: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f270: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f280: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
f290: 6a 28 22 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a j("bits", -1));.
f2a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
f2b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f2c0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f2d0: 77 49 6e 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a wIntObj(bits));.
f2e0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
f2f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f300: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f310: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 72 wStringObj("secr
f320: 65 74 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a et_bits", -1));.
f330: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
f340: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f350: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f360: 77 49 6e 74 4f 62 6a 28 61 6c 67 5f 62 69 74 73 wIntObj(alg_bits
f370: 29 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 ));../* alg_bits
f380: 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 is actual key s
f390: 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 ecret bits. If u
f3a0: 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 se bits and secr
f3b0: 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 et (algorithm) b
f3c0: 69 74 73 20 64 69 66 66 65 72 2c 0a 20 20 20 20 its differ,.
f3d0: 20 20 20 20 20 20 20 74 68 65 20 72 65 73 74 20 the rest
f3e0: 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20 of the bits are
f3f0: 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 fixed, i.e. for
f400: 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 limited export c
f410: 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 iphers (bits < 5
f420: 36 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 6) */..Tcl_ListO
f430: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f440: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f450: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
f460: 28 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 ("min_version",
f470: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
f480: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f490: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f4a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
f4b0: 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f (SSL_CIPHER_get_
f4c0: 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c version(cipher),
f4d0: 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 -1));.../* Get
f4e0: 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 OpenSSL-specific
f4f0: 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 ID, not IANA ID
f500: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
f510: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
f520: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
f530: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
f540: 69 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f id", -1));..Tcl_
f550: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
f560: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
f570: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
f580: 62 6a 28 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 bj((int) SSL_CIP
f590: 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 HER_get_id(ciphe
f5a0: 72 29 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f r)));...if (SSL_
f5b0: 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 CIPHER_descripti
f5c0: 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 on(cipher, buf,
f5d0: 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 sizeof(buf)) !=
f5e0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c NULL) {.. Tcl
f5f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
f600: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
f610: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
f620: 69 6e 67 4f 62 6a 28 22 64 65 73 63 72 69 70 74 ingObj("descript
f630: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 ion", -1));..
f640: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
f650: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f660: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f670: 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20 wStringObj(buf,
f680: 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a -1));..}. }..
f690: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 /* Session i
f6a0: 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 nfo */. sessi
f6b0: 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 on = SSL_get_ses
f6c0: 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 sion(ssl);. i
f6d0: 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 f (session != NU
f6e0: 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 LL) {..const uns
f6f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b igned char *tick
f700: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 et;..size_t len2
f710: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 ;..unsigned int
f720: 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 ulen;..const uns
f730: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 igned char *sess
f740: 69 6f 6e 5f 69 64 3b 0a 09 63 68 61 72 20 62 75 ion_id;..char bu
f750: 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 ffer[SSL_MAX_MAS
f760: 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b TER_KEY_LENGTH];
f770: 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 .../* Report the
f780: 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 selected protoc
f790: 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f ol as a result o
f7a0: 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 f the ALPN negot
f7b0: 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 iation */..SSL_S
f7c0: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e ESSION_get0_alpn
f7d0: 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f _selected(sessio
f7e0: 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 n, &proto, &len2
f7f0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
f800: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f810: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f820: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 _NewStringObj("a
f830: 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c lpn", -1));..Tcl
f840: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
f850: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
f860: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
f870: 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 ingObj((char *)p
f880: 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 32 roto, (int) len2
f890: 29 29 3b 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 ));.../* Resumab
f8a0: 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 54 le session */..T
f8b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
f8c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
f8d0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
f8e0: 74 72 69 6e 67 4f 62 6a 28 22 72 65 73 75 6d 61 tringObj("resuma
f8f0: 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ble", -1));..Tcl
f900: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
f910: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
f920: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 jPtr, Tcl_NewInt
f930: 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f Obj(SSL_SESSION_
f940: 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 is_resumable(ses
f950: 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 sion)));.../* Se
f960: 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 ssion start time
f970: 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 (seconds since
f980: 65 70 6f 63 68 29 20 2a 2f 0a 09 54 63 6c 5f 4c epoch) */..Tcl_L
f990: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f9a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f9b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
f9c0: 67 4f 62 6a 28 22 73 74 61 72 74 5f 74 69 6d 65 gObj("start_time
f9d0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
f9e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f9f0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
fa00: 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 r, Tcl_NewLongOb
fa10: 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 j(SSL_SESSION_ge
fa20: 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 t_time(session))
fa30: 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 );.../* Timeout
fa40: 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f value - SSL_CTX_
fa50: 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 get_timeout (in
fa60: 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 6c seconds) */..Tcl
fa70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fa80: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fa90: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
faa0: 69 6e 67 4f 62 6a 28 22 74 69 6d 65 6f 75 74 22 ingObj("timeout"
fab0: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
fac0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
fad0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
fae0: 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a , Tcl_NewLongObj
faf0: 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 (SSL_SESSION_get
fb00: 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e _timeout(session
fb10: 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f )));.../* Sessio
fb20: 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d n ticket lifetim
fb30: 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e e hint (in secon
fb40: 64 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 ds) */..Tcl_List
fb50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
fb60: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
fb70: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
fb80: 6a 28 22 6c 69 66 65 74 69 6d 65 22 2c 20 2d 31 j("lifetime", -1
fb90: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
fba0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
fbb0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
fbc0: 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c l_NewLongObj(SSL
fbd0: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 _SESSION_get_tic
fbe0: 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e ket_lifetime_hin
fbf0: 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 t(session)));...
fc00: 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f /* Session id */
fc10: 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 ..session_id = S
fc20: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 SL_SESSION_get_i
fc30: 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e d(session, &ulen
fc40: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
fc50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
fc60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
fc70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
fc80: 65 73 73 69 6f 6e 5f 69 64 22 2c 20 2d 31 29 29 ession_id", -1))
fc90: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
fca0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
fcb0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
fcc0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
fcd0: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 session_id, (int
fce0: 29 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 53 ) ulen));.../* S
fcf0: 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 ession ticket -
fd00: 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 client only */..
fd10: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
fd20: 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c _ticket(session,
fd30: 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 &ticket, &len2)
fd40: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
fd50: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
fd60: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
fd70: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 NewStringObj("se
fd80: 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 2d ssion_ticket", -
fd90: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
fda0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
fdb0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
fdc0: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f cl_NewByteArrayO
fdd0: 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 bj(ticket, (int)
fde0: 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 54 69 len2));.../* Ti
fdf0: 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f cket app data */
fe00: 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 ..SSL_SESSION_ge
fe10: 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 t0_ticket_appdat
fe20: 61 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b a(session, &tick
fe30: 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c et, &len2);..Tcl
fe40: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fe50: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fe60: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
fe70: 69 6e 67 4f 62 6a 28 22 74 69 63 6b 65 74 5f 61 ingObj("ticket_a
fe80: 70 70 5f 64 61 74 61 22 2c 20 2d 31 29 29 3b 0a pp_data", -1));.
fe90: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
fea0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
feb0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
fec0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 wByteArrayObj(ti
fed0: 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 cket, (int) len2
fee0: 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 ));.../* Get mas
fef0: 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 ter key */..len2
ff00: 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
ff10: 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 et_master_key(se
ff20: 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 ssion, buffer, S
ff30: 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 SL_MAX_MASTER_KE
ff40: 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 54 63 6c 5f Y_LENGTH);..Tcl_
ff50: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
ff60: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
ff70: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
ff80: 6e 67 4f 62 6a 28 22 6d 61 73 74 65 72 5f 6b 65 ngObj("master_ke
ff90: 79 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c y", -1));..Tcl_L
ffa0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
ffb0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
ffc0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 tr, Tcl_NewByteA
ffd0: 72 72 61 79 4f 62 6a 28 62 75 66 66 65 72 2c 20 rrayObj(buffer,
ffe0: 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 20 20 (int) len2));.
fff0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 }.. /* Comp
10000 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a ression info */.
10010 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e if (ssl != N
10020 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 ULL) {.#ifdef HA
10030 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 VE_SSL_COMPRESSI
10040 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d ON..const COMP_M
10050 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 ETHOD *comp, *ex
10060 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f pn;..comp = SSL_
10070 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 get_current_comp
10080 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 ression(ssl);..e
10090 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 xpn = SSL_get_cu
100a0 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 rrent_expansion(
100b0 73 73 6c 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 ssl);...Tcl_List
100c0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
100d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
100e0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
100f0 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c j("compression",
10100 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
10110 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
10120 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10130 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
10140 6a 28 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d j(comp ? SSL_COM
10150 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 P_get_name(comp)
10160 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b : "NONE", -1));
10170 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
10180 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10190 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
101a0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 ewStringObj("exp
101b0 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 ansion", -1));..
101c0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
101d0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
101e0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
101f0 53 74 72 69 6e 67 4f 62 6a 28 65 78 70 6e 20 3f StringObj(expn ?
10200 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 SSL_COMP_get_na
10210 6d 65 28 65 78 70 6e 29 20 3a 20 22 4e 4f 4e 45 me(expn) : "NONE
10220 22 2c 20 2d 31 29 29 3b 0a 23 65 6c 73 65 0a 09 ", -1));.#else..
10230 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
10240 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
10250 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
10260 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 StringObj("compr
10270 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 ession", -1));..
10280 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
10290 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
102a0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
102b0 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 StringObj("NONE"
102c0 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
102d0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
102e0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
102f0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10300 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 bj("expansion",
10310 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
10320 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10330 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10340 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10350 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 ("NONE", -1));.#
10360 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 endif. }..
10370 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 /* Server info
10380 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 */. mode = SS
10390 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f L_CTX_get_sessio
103a0 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 n_cache_mode(sta
103b0 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 tePtr->ctx);.
103c0 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f if (mode & SSL_
103d0 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 SESS_CACHE_OFF)
103e0 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 6f 66 66 22 {..proto = "off"
103f0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
10400 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 (mode & SSL_SESS
10410 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b _CACHE_CLIENT) {
10420 0a 09 70 72 6f 74 6f 20 3d 20 22 63 6c 69 65 6e ..proto = "clien
10430 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 t";. } else i
10440 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 f (mode & SSL_SE
10450 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 SS_CACHE_SERVER)
10460 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 73 65 72 {..proto = "ser
10470 76 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ver";. } else
10480 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f if (mode & SSL_
10490 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 SESS_CACHE_BOTH)
104a0 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 62 6f 74 {..proto = "bot
104b0 68 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b h";. } else {
104c0 0a 09 70 72 6f 74 6f 20 3d 20 22 75 6e 6b 6e 6f ..proto = "unkno
104d0 77 6e 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 wn";. }. T
104e0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
104f0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10500 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
10510 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f tringObj("sessio
10520 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 2d n_cache_mode", -
10530 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
10540 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10550 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10560 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10570 62 6a 28 70 72 6f 74 6f 2c 20 2d 31 29 29 3b 0a bj(proto, -1));.
10580 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
10590 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
105a0 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
105b0 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e n TCL_OK;..clien
105c0 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
105d0 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ta;.}.../*. *---
105e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
105f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10620 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 . *. * VersionOb
10630 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 jCmd -- return v
10640 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 ersion string fr
10650 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 om OpenSSL.. *.
10660 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
10670 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
10680 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
10690 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
106a0 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
106b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
106c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
106d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
106e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
106f0 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f tatic int.Versio
10700 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 nObjCmd(ClientDa
10710 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
10720 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
10730 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
10740 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
10750 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
10760 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 j *objPtr;..
10770 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
10780 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d );.. objPtr =
10790 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
107a0 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f j(OPENSSL_VERSIO
107b0 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 N_TEXT, -1);.
107c0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
107d0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
107e0 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
107f0 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
10800 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
10810 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 ..objc = objc;..
10820 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c objv = objv;.}..
10830 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
10840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10870 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
10880 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 MiscObjCmd -- mi
10890 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 sc commands. *.
108a0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
108b0 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
108c0 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
108d0 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
108e0 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
108f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
10930 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 tatic int.MiscOb
10940 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
10950 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
10960 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
10970 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
10980 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
10990 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f {. static co
109a0 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e nst char *comman
109b0 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c ds [] = { "req",
109c0 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 "strreq", NULL
109d0 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d };. enum comm
109e0 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 and { C_REQ, C_S
109f0 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d TRREQ, C_DUMMY }
10a00 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 ;. int cmd, i
10a10 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62 sStr;. char b
10a20 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 uffer[16384];..
10a30 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
10a40 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
10a50 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f bjc < 2) {..Tcl_
10a60 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
10a70 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 erp, 1, objv, "s
10a80 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f ubcommand ?args?
10a90 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
10aa0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
10ab0 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 if (Tcl_GetInde
10ac0 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c xFromObj(interp,
10ad0 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e objv[1], comman
10ae0 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 ds, "command", 0
10af0 2c 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b ,&cmd) != TCL_OK
10b00 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
10b10 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
10b20 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d isStr = (cmd =
10b30 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 = C_STRREQ);.
10b40 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 switch ((enum c
10b50 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 ommand) cmd) {..
10b60 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 case C_REQ:..cas
10b70 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 e C_STRREQ: {..
10b80 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 EVP_PKEY *pke
10b90 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 y=NULL;.. X50
10ba0 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 9 *cert=NULL;..
10bb0 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 X509_NAME *na
10bc0 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 me=NULL;.. Tc
10bd0 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 l_Obj **listv;..
10be0 20 20 20 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b int listc,i;
10bf0 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d ... BIO *out=
10c00 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 NULL;... char
10c10 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 *k_C="",*k_ST="
10c20 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 ",*k_L="",*k_O="
10c30 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e ",*k_OU="",*k_CN
10c40 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b ="",*k_Email="";
10c50 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f .. char *keyo
10c60 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b ut,*pemout,*str;
10c70 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a .. int keysiz
10c80 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d e,serial=0,days=
10c90 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 365;..#if OPENSS
10ca0 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
10cb0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
10cc0 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 BIGNUM *bne
10cd0 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 = NULL;.. RSA
10ce0 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 *rsa = NULL;.#e
10cf0 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 lse.. EVP_PKE
10d00 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c Y_CTX *ctx = NUL
10d10 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 L;.#endif...
10d20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 if ((objc<5) ||
10d30 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 (objc>6)) {...Tc
10d40 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
10d50 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 nterp, 2, objv,
10d60 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 "keysize keyfile
10d70 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f certfile ?info?
10d80 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c ");...return TCL
10d90 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a _ERROR;.. }..
10da0 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
10db0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 IntFromObj(inter
10dc0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 p, objv[2], &key
10dd0 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 size) != TCL_OK)
10de0 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f {...return TCL_
10df0 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 ERROR;.. }..
10e00 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 keyout=Tcl_Ge
10e10 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 tString(objv[3])
10e20 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 ;.. pemout=Tc
10e30 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
10e40 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 [4]);.. if (i
10e50 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 sStr) {...Tcl_Se
10e60 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f tVar(interp,keyo
10e70 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f ut,"",0);...Tcl_
10e80 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 SetVar(interp,pe
10e90 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 mout,"",0);..
10ea0 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a }... if (obj
10eb0 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 c>=6) {...if (Tc
10ec0 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d l_ListObjGetElem
10ed0 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a ents(interp, obj
10ee0 76 5b 35 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c v[5],....&listc,
10ef0 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f &listv) != TCL_
10f00 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 OK) {... retu
10f10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
10f20 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 }....if ((listc%
10f30 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 2) != 0) {...
10f40 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
10f50 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 nterp,"Informati
10f60 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 on list must hav
10f70 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 e even number of
10f80 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c arguments",NULL
10f90 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 );... return
10fa0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 TCL_ERROR;...}..
10fb0 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 .for (i=0; i<lis
10fc0 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 tc; i+=2) {...
10fd0 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 str=Tcl_GetStr
10fe0 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 ing(listv[i]);..
10ff0 09 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 . if (strcmp(
11000 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 str,"days")==0)
11010 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 {....if (Tcl_Get
11020 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 IntFromObj(inter
11030 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 p,listv[i+1],&da
11040 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 ys)!=TCL_OK)....
11050 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
11060 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c RROR;... } el
11070 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
11080 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 r,"serial")==0)
11090 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 {....if (Tcl_Get
110a0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 IntFromObj(inter
110b0 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 p,listv[i+1],&se
110c0 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 rial)!=TCL_OK)..
110d0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
110e0 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 _ERROR;... }
110f0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
11100 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 str,"C")==0) {..
11110 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 ..k_C=Tcl_GetStr
11120 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
11130 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
11140 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 (strcmp(str,"ST
11150 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 ")==0) {....k_ST
11160 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
11170 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
11180 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
11190 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 cmp(str,"L")==0)
111a0 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 {....k_L=Tcl_Ge
111b0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
111c0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
111d0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
111e0 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"O")==0) {....k
111f0 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _O=Tcl_GetString
11200 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
11210 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
11220 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d trcmp(str,"OU")=
11230 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 =0) {....k_OU=Tc
11240 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
11250 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
11260 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
11270 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b (str,"CN")==0) {
11280 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 ....k_CN=Tcl_Get
11290 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
112a0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
112b0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
112c0 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 "Email")==0) {..
112d0 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 ..k_Email=Tcl_Ge
112e0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
112f0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
11300 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 e {....Tcl_SetRe
11310 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b sult(interp,"Unk
11320 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c nown parameter",
11330 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e NULL);....return
11340 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 TCL_ERROR;...
11350 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a }...}.. }..
11360 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
11370 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
11380 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 0000000L.. bn
11390 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 e = BN_new();..
113a0 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 rsa = RSA_new
113b0 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 ();.. pkey =
113c0 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a EVP_PKEY_new();.
113d0 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 . if (bne ==
113e0 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e NULL || rsa == N
113f0 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e ULL || pkey == N
11400 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 ULL || !BN_set_w
11410 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 ord(bne,RSA_F4)
11420 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 ||...!RSA_genera
11430 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b te_key_ex(rsa, k
11440 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c eysize, bne, NUL
11450 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f L) || !EVP_PKEY_
11460 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c assign_RSA(pkey,
11470 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 rsa)) {...EVP_P
11480 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
11490 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 ../* RSA_free(rs
114a0 61 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 a); freed by EVP
114b0 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 _PKEY_free */...
114c0 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
114d0 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 lse.. pkey =
114e0 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 EVP_RSA_gen((uns
114f0 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 igned int) keysi
11500 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 ze);.. ctx =
11510 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 EVP_PKEY_CTX_new
11520 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 (pkey,NULL);..
11530 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 if (pkey == NU
11540 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c LL || ctx == NUL
11550 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b L || !EVP_PKEY_k
11560 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 eygen_init(ctx)
11570 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 ||...!EVP_PKEY_C
11580 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 TX_set_rsa_keyge
11590 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 n_bits(ctx, keys
115a0 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 ize) || !EVP_PKE
115b0 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 Y_keygen(ctx, &p
115c0 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b key)) {...EVP_PK
115d0 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 EY_free(pkey);..
115e0 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 .EVP_PKEY_CTX_fr
115f0 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a ee(ctx);.#endif.
11600 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 ..Tcl_SetResult(
11610 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 interp,"Error ge
11620 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 nerating private
11630 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 key",NULL);...r
11640 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
11650 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 .. } else {..
11660 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 .if (isStr) {...
11670 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
11680 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 BIO_s_mem());...
11690 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 PEM_write_bi
116a0 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 o_PrivateKey(out
116b0 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c ,pkey,NULL,NULL,
116c0 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 0,NULL,NULL);...
116d0 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f i=BIO_read(o
116e0 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 ut,buffer,sizeof
116f0 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 (buffer)-1);...
11700 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a i=(i<0) ? 0 :
11710 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 i;... buffer
11720 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 [i]='\0';...
11730 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 Tcl_SetVar(inter
11740 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c p,keyout,buffer,
11750 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 0);... BIO_fl
11760 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 ush(out);...
11770 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 BIO_free(out);..
11780 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 .} else {...
11790 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f out=BIO_new(BIO_
117a0 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 s_file());...
117b0 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e BIO_write_filen
117c0 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b ame(out,keyout);
117d0 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 ... PEM_write
117e0 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 _bio_PrivateKey(
117f0 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 out,pkey,NULL,NU
11800 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b LL,0,NULL,NULL);
11810 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 ... /* PEM_wr
11820 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 ite_bio_RSAPriva
11830 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 teKey(out, rsa,
11840 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e NULL, NULL, 0, N
11850 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 ULL, NULL); */..
11860 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c . BIO_free_al
11870 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 l(out);.. .}....
11880 69 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e if ((cert=X509_n
11890 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 ew())==NULL) {..
118a0 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
118b0 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 lt(interp,"Error
118c0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 generating cert
118d0 69 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 ificate request"
118e0 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 ,NULL);... EV
118f0 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 P_PKEY_free(pkey
11900 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 );.#if OPENSSL_V
11910 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
11920 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 0x30000000L...
11930 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a BN_free(bne);.
11940 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 #endif... ret
11950 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
11960 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f ..}....X509_set_
11970 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b version(cert,2);
11980 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f ...ASN1_INTEGER_
11990 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 set(X509_get_ser
119a0 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c ialNumber(cert),
119b0 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f serial);...X509_
119c0 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f gmtime_adj(X509_
119d0 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 getm_notBefore(c
119e0 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f ert),0);...X509_
119f0 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f gmtime_adj(X509_
11a00 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 getm_notAfter(ce
11a10 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a rt),(long)60*60*
11a20 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 24*days);...X509
11a30 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 _set_pubkey(cert
11a40 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d ,pkey);....name=
11a50 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 X509_get_subject
11a60 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 _name(cert);....
11a70 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
11a80 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
11a90 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 "C", MBSTRING_AS
11aa0 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
11ab0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 ed char *) k_C,
11ac0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
11ad0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
11ae0 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 y_by_txt(name,"S
11af0 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 T", MBSTRING_ASC
11b00 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
11b10 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 d char *) k_ST,
11b20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
11b30 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
11b40 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c y_by_txt(name,"L
11b50 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
11b60 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
11b70 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 char *) k_L, -1
11b80 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
11b90 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
11ba0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c by_txt(name,"O",
11bb0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
11bc0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
11bd0 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 har *) k_O, -1,
11be0 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
11bf0 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
11c00 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 _txt(name,"OU",
11c10 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
11c20 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
11c30 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 ar *) k_OU, -1,
11c40 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
11c50 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
11c60 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 _txt(name,"CN",
11c70 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
11c80 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
11c90 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 ar *) k_CN, -1,
11ca0 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
11cb0 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
11cc0 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c _txt(name,"Email
11cd0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
11ce0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
11cf0 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c char *) k_Email
11d00 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 , -1, -1, 0);...
11d10 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 .X509_set_subjec
11d20 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 t_name(cert,name
11d30 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f );....if (!X509_
11d40 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 sign(cert,pkey,E
11d50 56 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a VP_sha256())) {.
11d60 09 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 .. X509_free(
11d70 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 cert);... EVP
11d80 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
11d90 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
11da0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
11db0 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 x30000000L...
11dc0 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 BN_free(bne);.#
11dd0 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f endif... Tcl_
11de0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
11df0 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 ,"Error signing
11e00 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c certificate",NUL
11e10 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e L);... return
11e20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a TCL_ERROR;...}.
11e30 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a ...if (isStr) {.
11e40 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
11e50 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a w(BIO_s_mem());.
11e60 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
11e70 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 bio_X509(out,cer
11e80 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f t);... i=BIO_
11e90 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c read(out,buffer,
11ea0 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 sizeof(buffer)-1
11eb0 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 );... i=(i<0)
11ec0 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 ? 0 : i;...
11ed0 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a buffer[i]='\0';.
11ee0 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 .. Tcl_SetVar
11ef0 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 (interp,pemout,b
11f00 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 uffer,0);...
11f10 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a BIO_flush(out);.
11f20 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f .. BIO_free(o
11f30 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a ut);...} else {.
11f40 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
11f50 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b w(BIO_s_file());
11f60 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 ... BIO_write
11f70 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 _filename(out,pe
11f80 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d mout);... PEM
11f90 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 _write_bio_X509(
11fa0 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 out,cert);...
11fb0 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 BIO_free_all(ou
11fc0 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f t);...}....X509_
11fd0 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 free(cert);...EV
11fe0 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 P_PKEY_free(pkey
11ff0 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 );.#if OPENSSL_V
12000 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
12010 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 0x30000000L...BN
12020 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 _free(bne);.#end
12030 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 if.. }..}..br
12040 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 eak;. default
12050 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a :..break;. }.
12060 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
12070 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d K;..clientData =
12080 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c clientData;.}..
12090 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
120a0 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 ******/./* Init
120b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f */./
120c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
120d0 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ****/../*. *----
120e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
120f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
12120 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d *. * Tls_Free -
12130 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
12140 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 cedure cleans up
12150 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b when a SSL sock
12160 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c et based channel
12170 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e . *.is closed an
12180 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 d its reference
12190 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f count falls belo
121a0 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 w 1. *. * Result
121b0 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.none. *. *
121c0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
121d0 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 *.Frees all the
121e0 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d state. *. *-----
121f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
12230 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 */.void.Tls_Free
12240 28 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 (char *blockPtr)
12250 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
12260 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
12270 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 *)blockPtr;..
12280 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
12290 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 ");.. Tls_Cle
122a0 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 an(statePtr);.
122b0 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 ckfree(blockPt
122c0 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d r);.}.../*. *---
122d0 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e . *. * Tls_Clean
12320 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
12330 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 rocedure cleans
12340 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f up when a SSL so
12350 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e cket based chann
12360 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 el. *.is closed
12370 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 and its referenc
12380 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 e count falls be
12390 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f low 1. This sho
123a0 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 uld. *.be called
123b0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 synchronously b
123c0 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c y the CloseProc,
123d0 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 not in the. *.E
123e0 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 ventuallyFree ca
123f0 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 llback.. *. * Re
12400 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 sults:. *.none.
12410 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
12420 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 s:. *.Frees all
12430 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d the state. *. *-
12440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12480 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f --. */.void Tls_
12490 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 Clean(State *sta
124a0 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 tePtr) {. dpr
124b0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
124c0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 . /*. * w
124d0 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 e're assuming he
124e0 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 re that we're si
124f0 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 ngle-threaded.
12500 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 */. if (st
12510 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d atePtr->timer !=
12520 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e (Tcl_TimerToken
12530 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 ) NULL) {..Tcl_D
12540 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 eleteTimerHandle
12550 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 r(statePtr->time
12560 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 r);..statePtr->t
12570 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 imer = NULL;.
12580 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 }.. if (stat
12590 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a ePtr->protos) {.
125a0 09 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 .ckfree(statePtr
125b0 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 ->protos);..stat
125c0 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e ePtr->protos = N
125d0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
125e0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f f (statePtr->bio
125f0 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c ) {../* This wil
12600 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 l call SSL_shutd
12610 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 own. Bug 1414045
12620 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 */..dprintf("BI
12630 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c O_free_all(%p)",
12640 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b statePtr->bio);
12650 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 ..BIO_free_all(s
12660 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 tatePtr->bio);..
12670 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 statePtr->bio =
12680 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
12690 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 if (statePtr->ss
126a0 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 l) {..dprintf("S
126b0 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 SL_free(%p)", st
126c0 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 atePtr->ssl);..S
126d0 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 SL_free(statePtr
126e0 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 ->ssl);..statePt
126f0 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 r->ssl = NULL;.
12700 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
12710 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 tePtr->ctx) {..S
12720 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 SL_CTX_free(stat
12730 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 ePtr->ctx);..sta
12740 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c tePtr->ctx = NUL
12750 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
12760 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
12770 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 ack) {..Tcl_Decr
12780 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
12790 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 r->callback);..s
127a0 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
127b0 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a k = NULL;. }.
127c0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
127d0 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 ->password) {..T
127e0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
127f0 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
12800 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e rd);..statePtr->
12810 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b password = NULL;
12820 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 . }.. dpri
12830 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 ntf("Returning")
12840 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
12850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
12890 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d *. * Tls_Init --
128a0 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 . *. *.This is a
128b0 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c package initial
128c0 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 ization procedur
128d0 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c e, which is call
128e0 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 ed. *.by Tcl whe
128f0 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 n this package i
12900 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f s to be added to
12910 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e an interpreter.
12920 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 . *. * Results:
12930 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 Ssl configured
12940 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a and loaded. *. *
12950 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
12960 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 *. create the ss
12970 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 l command, initi
12980 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 alize ssl contex
12990 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d t. *. *---------
129a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 ----------. */.D
129e0 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 LLEXPORT int Tls
129f0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 _Init(Tcl_Interp
12a00 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
12a10 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 const char tlsTc
12a20 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 lInitScript[] =
12a30 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e {.#include "tls.
12a40 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 tcl.h"..0x00.
12a50 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 };.. dprintf
12a60 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
12a70 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e /*. * We on
12a80 6c 79 20 73 75 70 70 6f 72 74 20 54 63 6c 20 38 ly support Tcl 8
12a90 2e 34 20 6f 72 20 6e 65 77 65 72 0a 20 20 20 20 .4 or newer.
12aa0 20 2a 2f 0a 20 20 20 20 69 66 20 28 0a 23 69 66 */. if (.#if
12ab0 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 def USE_TCL_STUB
12ac0 53 0a 09 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 S..Tcl_InitStubs
12ad0 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 (interp, "8.4",
12ae0 30 29 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 50 6b 0).#else..Tcl_Pk
12af0 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c gRequire(interp,
12b00 20 22 54 63 6c 22 2c 20 22 38 2e 34 2d 22 2c 20 "Tcl", "8.4-",
12b10 30 29 0a 23 65 6e 64 69 66 0a 09 20 3d 3d 20 4e 0).#endif.. == N
12b20 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
12b30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
12b40 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 . if (TlsLibI
12b50 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b nit(0) != TCL_OK
12b60 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
12b70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 esult(interp, "c
12b80 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c ould not initial
12b90 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 ize SSL library"
12ba0 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
12bb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
12bc0 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 }.. Tcl_Creat
12bd0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
12be0 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 rp, "tls::cipher
12bf0 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d s", CiphersObjCm
12c00 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
12c10 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
12c20 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
12c30 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
12c40 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
12c50 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f "tls::connectio
12c60 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e n", ConnectionIn
12c70 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e foObjCmd, (Clien
12c80 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
12c90 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
12ca0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
12cb0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
12cc0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 interp, "tls::ha
12cd0 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 ndshake", Handsh
12ce0 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 akeObjCmd, (Clie
12cf0 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
12d00 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
12d10 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
12d20 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
12d30 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 (interp, "tls::i
12d40 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 mport", ImportOb
12d50 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
12d60 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
12d70 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
12d80 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
12d90 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
12da0 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f rp, "tls::unimpo
12db0 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a rt", UnimportObj
12dc0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
12dd0 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
12de0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
12df0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
12e00 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
12e10 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 p, "tls::status"
12e20 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 , StatusObjCmd,
12e30 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
12e40 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
12e50 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
12e60 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
12e70 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
12e80 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 ls::version", Ve
12e90 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c rsionObjCmd, (Cl
12ea0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
12eb0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
12ec0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
12ed0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
12ee0 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
12ef0 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 :misc", MiscObjC
12f00 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
12f10 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
12f20 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
12f30 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
12f40 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
12f50 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c , "tls::protocol
12f60 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a s", ProtocolsObj
12f70 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
12f80 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
12f90 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
12fa0 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 ;.. if (inter
12fb0 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 p) {..Tcl_Eval(i
12fc0 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 nterp, tlsTclIni
12fd0 74 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a tScript);. }.
12fe0 0a 20 20 20 20 72 65 74 75 72 6e 28 54 63 6c 5f . return(Tcl_
12ff0 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 PkgProvide(inter
13000 70 2c 20 22 74 6c 73 22 2c 20 50 41 43 4b 41 47 p, "tls", PACKAG
13010 45 5f 56 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a 0a E_VERSION));.}..
13020 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
13030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a -----------*. *.
13060 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 *.Tls_SafeInit
13070 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d --. *. *.-------
13080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 ---------*. *.St
130b0 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 andard procedure
130c0 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f required by 'lo
130d0 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 ad'.. *.Initiali
130e0 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 zes this extensi
130f0 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e on for a safe in
13100 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d terpreter.. *.--
13110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
13140 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 *. *.Side effec
13150 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 ts:. *..As of 'T
13160 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 ls_Init'. *. *.R
13170 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 esult:. *..A sta
13180 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 ndard Tcl error
13190 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d code.. *. *-----
131a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131d0 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 -*. */.DLLEXPORT
131e0 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 int Tls_SafeIni
131f0 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e t(Tcl_Interp *in
13200 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 terp) {. dpri
13210 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 ntf("Called");.
13220 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e return(Tls_In
13230 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a it(interp));.}..
13240 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
13250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a -----------*. *.
13280 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d *.TlsLibInit --
13290 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *.---------
132a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
132b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
132c0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 -------*. *.Init
132d0 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 ializes SSL libr
132e0 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 ary once per app
132f0 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d lication. *.----
13300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
13330 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 . *.Side effects
13340 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 :. *..initialize
13350 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a s SSL library. *
13360 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 . *.Result:. *..
13370 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d none. *. *------
13380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
133a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
133b0 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 *. */.static int
133c0 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 TlsLibInit(int
133d0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a uninitialize) {.
133e0 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 static int i
133f0 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a nitialized = 0;.
13400 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d int status =
13410 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 TCL_OK;.#if def
13420 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
13430 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
13440 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 (TCL_THREADS).
13450 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 size_t num_loc
13460 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 ks;.#endif..
13470 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 if (uninitialize
13480 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 ) {. if (
13490 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a !initialized) {.
134a0 20 20 20 20 20 20 20 20 20 20 20 20 64 70 72 69 dpri
134b0 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e ntf("Asked to un
134c0 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 initialize, but
134d0 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 we are not initi
134e0 61 6c 69 7a 65 64 22 29 3b 0a 0a 20 20 20 20 20 alized");..
134f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 28 54 43 return(TC
13500 4c 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d L_OK);. }
13510 0a 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e 74 .. dprint
13520 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e f("Asked to unin
13530 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 itialize");..#if
13540 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
13550 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
13560 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
13570 29 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4d 75 ). Tcl_Mu
13580 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 texLock(&init_mx
13590 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28 );.. if (
135a0 6c 6f 63 6b 73 29 20 7b 0a 20 20 20 20 20 20 20 locks) {.
135b0 20 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 free(locks)
135c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f ;. lo
135d0 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 cks = NULL;.
135e0 20 20 20 20 20 20 20 20 6c 6f 63 6b 73 43 6f 75 locksCou
135f0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 nt = 0;.
13600 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 }.#endif.
13610 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 initialized = 0
13620 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
13630 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
13640 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
13650 48 52 45 41 44 53 29 0a 20 20 20 20 20 20 20 20 HREADS).
13660 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 Tcl_MutexUnlock(
13670 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 &init_mx);.#endi
13680 66 0a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 f.. retur
13690 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d n(TCL_OK);. }
136a0 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 .. if (initia
136b0 6c 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20 lized) {.
136c0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
136d0 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 , but using cach
136e0 65 64 20 76 61 6c 75 65 22 29 3b 0a 20 20 20 20 ed value");.
136f0 20 20 20 20 72 65 74 75 72 6e 28 73 74 61 74 75 return(statu
13700 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 s);. }.. d
13710 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
13720 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
13730 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
13740 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
13750 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f HREADS). Tcl_
13760 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f MutexLock(&init_
13770 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 mx);.#endif.
13780 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b initialized = 1;
13790 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
137a0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
137b0 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
137c0 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c READS). num_l
137d0 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f ocks = 1;. lo
137e0 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 cksCount = (int)
137f0 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 num_locks;.
13800 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 locks = malloc(s
13810 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 izeof(*locks) *
13820 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 num_locks);.
13830 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c memset(locks, 0,
13840 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 sizeof(*locks)
13850 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 * num_locks);.#e
13860 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 ndif.. /* Ini
13870 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 tialize BOTH lib
13880 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 crypto and libss
13890 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 l. */. OPENSS
138a0 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 L_init_ssl(OPENS
138b0 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c SL_INIT_LOAD_SSL
138c0 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 _STRINGS | OPENS
138d0 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 SL_INIT_LOAD_CRY
138e0 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f PTO_STRINGS..| O
138f0 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f PENSSL_INIT_ADD_
13900 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 ALL_CIPHERS | OP
13910 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 ENSSL_INIT_ADD_A
13920 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c LL_DIGESTS, NULL
13930 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f );.. BIO_new_
13940 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 tcl(NULL, 0);..#
13950 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 if 0. /*.
13960 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d * XXX:TODO: Rem
13970 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e ove this code an
13980 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 d replace it wit
13990 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a h a check. *
139a0 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 for enough entr
139b0 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 opy and do not t
139c0 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 ry to create our
139d0 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 own. * terr
139e0 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 ible entropy.
139f0 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 */. /*.
13a00 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 * Seed the rand
13a10 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 om number genera
13a20 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c tor in the SSL l
13a30 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 ibrary,. * u
13a40 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c sing the do/whil
13a50 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 e construct beca
13a60 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e use of the bug n
13a70 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 ote in the.
13a80 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 * OpenSSL FAQ at
13a90 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e http://www.open
13aa0 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f ssl.org/support/
13ab0 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 faq.html#USER1.
13ac0 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 *. * The
13ad0 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f crux of the pro
13ae0 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c blem is that Sol
13af0 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 aris 7 does not
13b00 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 have a. * /d
13b10 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 ev/random or /de
13b20 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 v/urandom device
13b30 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 so it cannot ga
13b40 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 ther enough.
13b50 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 * entropy from
13b60 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 the RAND_seed()
13b70 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c when TLS initial
13b80 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 izes and refuses
13b90 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 . * to go fu
13ba0 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 rther. Earlier v
13bb0 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 ersions of OpenS
13bc0 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 SL carried on re
13bd0 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a gardless.. *
13be0 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 /. srand((uns
13bf0 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 igned int) time(
13c00 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 (time_t *) NULL)
13c10 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 );. do {..for
13c20 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b (i = 0; i < 16;
13c30 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 i++) {.. rnd
13c40 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 _seed[i] = 1 + (
13c50 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 char) (255.0 * r
13c60 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b and()/(RAND_MAX+
13c70 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 1.0));..}..RAND_
13c80 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 seed(rnd_seed, s
13c90 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 izeof(rnd_seed))
13ca0 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 ;. } while (R
13cb0 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 AND_status() !=
13cc0 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 1);.#endif..#if
13cd0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
13ce0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
13cf0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
13d00 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 ..Tcl_MutexUnloc
13d10 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e k(&init_mx);.#en
13d20 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 73 74 61 dif...return(sta
13d30 74 75 73 29 3b 0a 7d 0a tus);.}.