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 65 72 72 53 74 72 2c 20 2a char *errStr, *
1670: 73 74 72 69 6e 67 3b 0a 20 20 20 20 69 6e 74 20 string;. int
1680: 6c 65 6e 67 74 68 3b 0a 20 20 20 20 53 53 4c 20 length;. SSL
1690: 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 *ssl..= (SSL*)
16a0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 X509_STORE_CTX_g
16b0: 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20 et_ex_data(ctx,
16c0: 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f SSL_get_ex_data_
16d0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 X509_STORE_CTX_i
16e0: 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20 dx());. X509
16f0: 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53 *cert..= X509_S
1700: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 TORE_CTX_get_cur
1710: 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a rent_cert(ctx);.
1720: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
1730: 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53 Ptr.= (State*)SS
1740: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 L_get_app_data(s
1750: 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 sl);. Tcl_Int
1760: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
1770: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
1780: 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d int depth..=
1790: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f X509_STORE_CTX_
17a0: 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 get_error_depth(
17b0: 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 ctx);. int er
17c0: 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f r..= X509_STORE_
17d0: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 CTX_get_error(ct
17e0: 78 29 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 x);. int code
17f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
1800: 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29 Verify: %d", ok)
1810: 3b 0a 0a 20 20 20 20 69 66 20 28 21 6f 6b 29 20 ;.. if (!ok)
1820: 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63 68 61 {..errStr = (cha
1830: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 r*)X509_verify_c
1840: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 ert_error_string
1850: 28 65 72 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 (err);. } els
1860: 65 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 4e 55 e {..errStr = NU
1870: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 LL;. }.. i
1880: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
1890: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
18a0: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 j*)NULL) {..if (
18b0: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 statePtr->vflags
18c0: 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 & SSL_VERIFY_FA
18d0: 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 IL_IF_NO_PEER_CE
18e0: 52 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 RT) {.. retur
18f0: 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a n ok;..} else {.
1900: 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 . return 1;..
1910: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 }. }. cmdP
1920: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
1930: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
1940: 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 callback);..
1950: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1960: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1970: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
1980: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 StringObj("verif
1990: 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 y", -1));. Tc
19a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
19b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
19c0: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 mdPtr,..Tcl_NewS
19d0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
19e0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
19f0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
1a00: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
1a10: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1a20: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1a30: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 Tcl_NewIntObj(de
1a40: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c pth));. Tcl_L
1a50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1a60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1a70: 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f tr, Tls_NewX509O
1a80: 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 bj(interp, cert)
1a90: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
1aa0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1ab0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1ac0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b Tcl_NewIntObj(ok
1ad0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
1ae0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1af0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
1b00: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1b10: 6a 28 65 72 72 53 74 72 20 3f 20 65 72 72 53 74 j(errStr ? errSt
1b20: 72 20 3a 20 22 22 2c 20 2d 31 29 29 3b 0a 0a 20 r : "", -1));..
1b30: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
1b40: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
1b50: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 erp);. Tcl_Pr
1b60: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
1b70: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a ta) statePtr);..
1b80: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c statePtr->fl
1b90: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 ags |= TLS_TCL_C
1ba0: 41 4c 4c 42 41 43 4b 3b 0a 0a 20 20 20 20 54 63 ALLBACK;.. Tc
1bb0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
1bc0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 mdPtr);. code
1bd0: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 = Tcl_EvalObjEx
1be0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
1bf0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
1c00: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 );. if (code
1c10: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a != TCL_OK) {../*
1c20: 20 49 74 20 67 6f 74 20 61 6e 20 65 72 72 6f 72 It got an error
1c30: 20 2d 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 - reject the ce
1c40: 72 74 69 66 69 63 61 74 65 2e 09 09 2a 2f 0a 23 rtificate...*/.#
1c50: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
1c60: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
1c70: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
1c80: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
1c90: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
1ca0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
1cb0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
1cc0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
1cd0: 29 3b 0a 23 65 6e 64 69 66 0a 09 6f 6b 20 3d 20 );.#endif..ok =
1ce0: 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 0;. } else {.
1cf0: 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 .result = Tcl_Ge
1d00: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
1d10: 70 29 3b 0a 09 73 74 72 69 6e 67 20 3d 20 54 63 p);..string = Tc
1d20: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
1d30: 62 6a 28 72 65 73 75 6c 74 2c 20 26 6c 65 6e 67 bj(result, &leng
1d40: 74 68 29 3b 0a 09 2f 2a 20 41 6e 20 65 6d 70 74 th);../* An empt
1d50: 79 20 72 65 73 75 6c 74 20 6c 65 61 76 65 73 20 y result leaves
1d60: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 verification unc
1d70: 68 61 6e 67 65 64 2e 09 2a 2f 0a 09 69 66 20 28 hanged..*/..if (
1d80: 73 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 20 26 string != NULL &
1d90: 26 20 6c 65 6e 67 74 68 20 3e 20 30 29 20 7b 0a & length > 0) {.
1da0: 09 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f . code = Tcl_
1db0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e GetIntFromObj(in
1dc0: 74 65 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f terp, result, &o
1dd0: 6b 29 3b 0a 09 20 20 20 20 69 66 20 28 63 6f 64 k);.. if (cod
1de0: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
1df0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
1e00: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
1e10: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
1e20: 4e 20 3c 20 36 29 0a 09 09 54 63 6c 5f 42 61 63 N < 6)...Tcl_Bac
1e30: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 kgroundError(int
1e40: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 09 54 63 erp);.#else...Tc
1e50: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 l_BackgroundExce
1e60: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f ption(interp, co
1e70: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 6f 6b de);.#endif...ok
1e80: 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a = 0;.. }..}.
1e90: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
1ea0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
1eb0: 72 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 r);.. statePt
1ec0: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c r->flags &= ~(TL
1ed0: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b S_TCL_CALLBACK);
1ee0: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 .. Tcl_Releas
1ef0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
1f00: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 tatePtr);. Tc
1f10: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
1f20: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
1f30: 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 3b 09 return(ok);.
1f40: 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 6c /* By default, l
1f50: 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69 6f eave verificatio
1f60: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f 0a n unchanged..*/.
1f70: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
1fc0: 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a * Tls_Error --.
1fd0: 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c *. *.Calls call
1fe0: 62 61 63 6b 20 77 69 74 68 20 24 66 64 20 61 6e back with $fd an
1ff0: 64 20 24 6d 73 67 20 2d 20 73 6f 20 74 68 65 20 d $msg - so the
2000: 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65 63 callback can dec
2010: 69 64 65 0a 20 2a 09 77 68 61 74 20 74 6f 20 64 ide. *.what to d
2020: 6f 20 77 69 74 68 20 65 72 72 6f 72 73 2e 0a 20 o with errors..
2030: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
2040: 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 s:. *.The err fi
2050: 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 eld of the curre
2060: 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 ntly operative S
2070: 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 tate is set. *.
2080: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 to a string des
2090: 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 cribing the SSL
20a0: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c negotiation fail
20b0: 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d 2d ure reason. *---
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2100: 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 . */.void.Tls_Er
2110: 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 ror(State *state
2120: 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20 Ptr, char *msg)
2130: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 {. Tcl_Interp
2140: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
2150: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
2160: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
2170: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a ;. int code;.
2180: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
2190: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
21a0: 28 6d 73 67 20 26 26 20 2a 6d 73 67 29 20 7b 0a (msg && *msg) {.
21b0: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
21c0: 65 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 22 2c e(interp, "SSL",
21d0: 20 6d 73 67 2c 20 28 63 68 61 72 20 2a 29 4e 55 msg, (char *)NU
21e0: 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 LL);. } else
21f0: 7b 0a 09 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 {..msg = Tcl_Get
2200: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
2210: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
2220: 6e 74 65 72 70 29 2c 20 4e 55 4c 4c 29 3b 0a 20 nterp), NULL);.
2230: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 }. statePt
2240: 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 r->err = msg;..
2250: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
2260: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 >callback == (Tc
2270: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
2280: 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d char buf[BUFSIZ]
2290: 3b 0a 09 73 70 72 69 6e 74 66 28 62 75 66 2c 20 ;..sprintf(buf,
22a0: 22 53 53 4c 20 63 68 61 6e 6e 65 6c 20 5c 22 25 "SSL channel \"%
22b0: 73 5c 22 3a 20 65 72 72 6f 72 3a 20 25 73 22 2c s\": error: %s",
22c0: 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 .. Tcl_GetCha
22d0: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
22e0: 72 2d 3e 73 65 6c 66 29 2c 20 6d 73 67 29 3b 0a r->self), msg);.
22f0: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
2300: 6e 74 65 72 70 2c 20 62 75 66 2c 20 54 43 4c 5f nterp, buf, TCL_
2310: 56 4f 4c 41 54 49 4c 45 29 3b 0a 23 69 66 20 28 VOLATILE);.#if (
2320: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
2330: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f N == 8) && (TCL_
2340: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 MINOR_VERSION <
2350: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6)..Tcl_Backgrou
2360: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ndError(interp);
2370: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b .#else..Tcl_Back
2380: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 groundException(
2390: 69 6e 74 65 72 70 2c 20 54 43 4c 5f 45 52 52 4f interp, TCL_ERRO
23a0: 52 29 3b 0a 23 65 6e 64 69 66 0a 09 72 65 74 75 R);.#endif..retu
23b0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d rn;. }. cm
23c0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
23d0: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
23e0: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 ->callback);..
23f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2400: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2410: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2420: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 ewStringObj("err
2430: 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 or", -1));. T
2440: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2450: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2460: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
2470: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
2480: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
2490: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
24a0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
24b0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
24c0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
24d0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
24e0: 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b ngObj(msg, -1));
24f0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 .. Tcl_Preser
2500: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
2510: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c interp);. Tcl
2520: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
2530: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
2540: 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 ;.. Tcl_IncrR
2550: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
2560: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f . code = Tcl_
2570: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 EvalObjEx(interp
2580: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 , cmdPtr, TCL_EV
2590: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 AL_GLOBAL);.
25a0: 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f if (code != TCL_
25b0: 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d OK) {.#if (TCL_M
25c0: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 AJOR_VERSION ==
25d0: 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 8) && (TCL_MINOR
25e0: 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 _VERSION < 6)..T
25f0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 cl_BackgroundErr
2600: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 or(interp);.#els
2610: 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e e..Tcl_Backgroun
2620: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 dException(inter
2630: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 p, code);.#endif
2640: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
2650: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
2660: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c tr);. Tcl_Rel
2670: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 ease((ClientData
2680: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 ) statePtr);.
2690: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c Tcl_Release((Cl
26a0: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 ientData) interp
26b0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
26c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2700: 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c *. * KeyLogCall
2710: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 back --. *. *.Wr
2720: 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 ite received key
2730: 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c data to log fil
2740: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
2750: 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 fects:. *.none.
2760: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27a0: 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 ----. */.void Ke
27b0: 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e yLogCallback(con
27c0: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e st SSL *ssl, con
27d0: 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b st char *line) {
27e0: 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d . char *str =
27f0: 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f getenv(SSLKEYLO
2800: 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 GFILE);. FILE
2810: 20 2a 66 64 3b 0a 20 20 20 20 69 66 20 28 73 74 *fd;. if (st
2820: 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e r) {..fd = fopen
2830: 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 72 (str, "a");..fpr
2840: 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c intf(fd, "%s\n",
2850: 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66 line);..fclose(f
2860: 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a d);. }.}.../*
2870: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 ------. *. * Pas
28c0: 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d sword Callback -
28d0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 -. *. *.Called w
28e0: 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 69 hen a password i
28f0: 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e 70 61 s needed to unpa
2900: 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d 20 6b ck RSA and PEM k
2910: 65 79 73 2e 0a 20 2a 09 45 76 61 6c 73 20 61 6e eys.. *.Evals an
2920: 79 20 62 6f 75 6e 64 20 70 61 73 73 77 6f 72 64 y bound password
2930: 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75 script and retu
2940: 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 61 rns the result a
2950: 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77 6f 72 s. *.the passwor
2960: 64 20 73 74 72 69 6e 67 2e 0a 20 2a 2d 2d 2d 2d d string.. *----
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
29b0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 */.static int.P
29c0: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 asswordCallback(
29d0: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 char *buf, int s
29e0: 69 7a 65 2c 20 69 6e 74 20 76 65 72 69 66 79 2c ize, int verify,
29f0: 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a void *udata) {.
2a00: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
2a10: 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr.= (State *)
2a20: 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 udata;. Tcl_I
2a30: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
2a40: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
2a50: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
2a60: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
2a70: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ode;.. dprint
2a80: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
2a90: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
2aa0: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c password == NULL
2ab0: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 ) {..if (Tcl_Eva
2ac0: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 lEx(interp, "tls
2ad0: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c ::password", -1,
2ae0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
2af0: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) == TCL_OK) {..
2b00: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 char *ret =
2b10: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
2b20: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 StringResult(int
2b30: 65 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 erp);.. strnc
2b40: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 py(buf, ret, (si
2b50: 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 ze_t) size);..
2b60: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 return (int)st
2b70: 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c rlen(ret);..} el
2b80: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e se {.. return
2b90: 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 -1;..}. }..
2ba0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
2bb0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
2bc0: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
2bd0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 ;.. Tcl_Prese
2be0: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 rve((ClientData)
2bf0: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 interp);. Tc
2c00: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 l_Preserve((Clie
2c10: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
2c20: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 );.. Tcl_Incr
2c30: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
2c40: 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c ;. code = Tcl
2c50: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 _EvalObjEx(inter
2c60: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 p, cmdPtr, TCL_E
2c70: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 VAL_GLOBAL);.
2c80: 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c if (code != TCL
2c90: 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f _OK) {.#if (TCL_
2ca0: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d MAJOR_VERSION ==
2cb0: 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 8) && (TCL_MINO
2cc0: 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 R_VERSION < 6)..
2cd0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 Tcl_BackgroundEr
2ce0: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c ror(interp);.#el
2cf0: 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 se..Tcl_Backgrou
2d00: 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 ndException(inte
2d10: 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 rp, code);.#endi
2d20: 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f f. }. Tcl_
2d30: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
2d40: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 Ptr);.. Tcl_R
2d50: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
2d60: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a ta) statePtr);..
2d70: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 if (code ==
2d80: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 20 TCL_OK) {..char
2d90: 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 *ret = (char *)
2da0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 Tcl_GetStringRes
2db0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 66 ult(interp);..if
2dc0: 20 28 73 74 72 6c 65 6e 28 72 65 74 29 20 3c 20 (strlen(ret) <
2dd0: 73 69 7a 65 20 2d 20 31 29 20 7b 0a 09 20 20 20 size - 1) {..
2de0: 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 strncpy(buf, re
2df0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 t, (size_t) size
2e00: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 52 65 6c 65 );.. Tcl_Rele
2e10: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
2e20: 20 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 72 interp);.. r
2e30: 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 eturn (int)strle
2e40: 6e 28 72 65 74 29 3b 0a 09 7d 0a 20 20 20 20 7d n(ret);..}. }
2e50: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 . Tcl_Release
2e60: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
2e70: 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 terp);. retur
2e80: 6e 20 2d 31 3b 0a 09 76 65 72 69 66 79 20 3d 20 n -1;..verify =
2e90: 76 65 72 69 66 79 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 verify;.}.../*.
2ea0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ee0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 ----. *. * Sessi
2ef0: 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 on Callback for
2f00: 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a Clients --. *. *
2f10: 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e .Called when a n
2f20: 65 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 ew session is ad
2f30: 64 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 ded to the cache
2f40: 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 . In TLS 1.3. *.
2f50: 74 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 this may be rece
2f60: 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 ived multiple ti
2f70: 6d 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61 mes after the ha
2f80: 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 ndshake. For. *.
2f90: 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 earlier versions
2fa0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 , this will be r
2fb0: 65 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 eceived during t
2fc0: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a he handshake.. *
2fd0: 09 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65 .This is the pre
2fe0: 66 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 ferred way to ob
2ff0: 74 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 tain a resumable
3000: 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 session.. *. *
3010: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 Results:. *.None
3020: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
3030: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 cts:. *.Calls ca
3040: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e llback (if defin
3050: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e ed). *. * Return
3060: 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 codes:. *.0 = e
3070: 72 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 rror where sessi
3080: 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 on will be immed
3090: 69 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 iately removed f
30a0: 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c rom the internal
30b0: 20 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 cache.. *.1 = s
30c0: 75 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70 uccess where app
30d0: 20 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e retains session
30e0: 20 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 in session cach
30f0: 65 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c e, and must call
3100: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 SSL_SESSION_fre
3110: 65 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 e() when done..
3120: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
3170: 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 ic int.SessionCa
3180: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
3190: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 *ssl, SSL_SESSI
31a0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 ON *session) {.
31b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
31c0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr = (State*)SSL
31d0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 _get_app_data((S
31e0: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 SL *)ssl);. T
31f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
3200: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
3210: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
3220: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 j *cmdPtr;. c
3230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
3240: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 ar *ticket;.
3250: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
3260: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b har *session_id;
3270: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 . int code;.
3280: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a size_t len2;.
3290: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
32a0: 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 ulen;.. dpri
32b0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
32c0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
32d0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
32e0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
32f0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
3300: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
3310: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d else if (ssl ==
3320: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
3330: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
3340: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
3350: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
3360: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
3370: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
3380: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
3390: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
33a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
33b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
33c0: 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a session", -1));.
33d0: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 . /* Session
33e0: 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f id */. sessio
33f0: 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 n_id = SSL_SESSI
3400: 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f ON_get_id(sessio
3410: 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 n, &ulen);. T
3420: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3430: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3440: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 cmdPtr, Tcl_NewB
3450: 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 yteArrayObj(sess
3460: 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c ion_id, (int) ul
3470: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 en));.. /* Se
3480: 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a ssion ticket */.
3490: 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f SSL_SESSION_
34a0: 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 get0_ticket(sess
34b0: 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
34c0: 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 en2);. Tcl_Li
34d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
34e0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
34f0: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 r, Tcl_NewByteAr
3500: 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 rayObj(ticket, (
3510: 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 int) len2));..
3520: 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 /* Lifetime -
3530: 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 number of second
3540: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 s */. Tcl_Lis
3550: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3560: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3570: 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 ,..Tcl_NewLongOb
3580: 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 j((long) SSL_SES
3590: 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f SION_get_ticket_
35a0: 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 lifetime_hint(se
35b0: 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 54 ssion)));.. T
35c0: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
35d0: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
35e0: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 ;. Tcl_Preser
35f0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
3600: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
3610: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
3620: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
3630: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
3640: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
3650: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
3660: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
3670: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
3680: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
3690: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
36a0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
36b0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
36c0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
36d0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
36e0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
36f0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
3700: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
3710: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
3720: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
3730: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
3740: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
3750: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 ePtr);. Tcl_R
3760: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
3770: 74 61 29 20 69 6e 74 65 72 70 29 3b 20 20 20 20 ta) interp);
3780: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a return 0;.}.../*
3790: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 ------. *. * ALP
37e0: 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 N Callback for S
37f0: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 ervers --. *. *.
3800: 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 Perform server-s
3810: 69 64 65 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 ide protocol (ht
3820: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 tp/1.1, h2, h3,
3830: 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 etc.) selection
3840: 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d for the. *.incom
3850: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 ing connection.
3860: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c Called after Hel
3870: 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 lo and server ca
3880: 6c 6c 62 61 63 6b 73 0a 20 2a 0a 20 2a 20 52 65 llbacks. *. * Re
3890: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
38a0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
38b0: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
38c0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
38d0: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 ). *. * Return c
38e0: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 odes:. *.SSL_TLS
38f0: 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e EXT_ERR_OK: ALPN
3900: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 protocol select
3910: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
3920: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
3930: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
3940: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 ALERT_FATAL: The
3950: 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 re was no overla
3960: 70 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c p between the cl
3970: 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 ient's. *. su
3980: 70 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 pplied list and
3990: 74 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 the server confi
39a0: 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f guration. The co
39b0: 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 nnection will be
39c0: 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c aborted.. *.SSL
39d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
39e0: 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c K: ALPN protocol
39f0: 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 not selected, e
3a00: 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 .g., because no
3a10: 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 ALPN. *. prot
3a20: 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 ocols are config
3a30: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f ured for this co
3a40: 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f nnection. The co
3a50: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
3a60: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d es.. *. *-------
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 2d 2d 2d 2d 2d ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3ab0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e .static int.ALPN
3ac0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
3ad0: 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 SL *ssl, const u
3ae0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f nsigned char **o
3af0: 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ut, unsigned cha
3b00: 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 r *outlen,..cons
3b10: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
3b20: 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e *in, unsigned in
3b30: 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 t inlen, void *a
3b40: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 rg) {. State
3b50: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
3b60: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c te*)arg;. Tcl
3b70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
3b80: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
3b90: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
3ba0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 *cmdPtr;. int
3bb0: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 code, res;..
3bc0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
3bd0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
3be0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
3bf0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
3c00: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
3c10: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
3c20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
3c30: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 sl == NULL) {..r
3c40: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
3c50: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
3c60: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 }.. /* Select
3c70: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 protocol */.
3c80: 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f if (SSL_select_
3c90: 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20 next_proto(out,
3ca0: 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 outlen, statePtr
3cb0: 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 ->protos, stateP
3cc0: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a tr->protos_len,.
3cd0: 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f .in, inlen) == O
3ce0: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 PENSSL_NPN_NEGOT
3cf0: 49 41 54 45 44 29 20 7b 0a 09 72 65 73 20 3d 20 IATED) {..res =
3d00: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
3d10: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a K;. } else {.
3d20: 09 2f 2a 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 ./* No overlap,
3d30: 73 6f 20 66 69 72 73 74 20 63 6c 69 65 6e 74 20 so first client
3d40: 70 72 6f 74 6f 63 6f 6c 20 75 73 65 64 20 2a 2f protocol used */
3d50: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
3d60: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
3d70: 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 }.. cmdPtr
3d80: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
3d90: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
3da0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f lback);. Tcl_
3db0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3dc0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3dd0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
3de0: 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 ngObj("alpn", -1
3df0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
3e00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3e10: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3e20: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3e30: 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a 0a 20 j(*out, -1));..
3e40: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
3e50: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
3e60: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 erp);. Tcl_Pr
3e70: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
3e80: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a ta) statePtr);..
3e90: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
3ea0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
3eb0: 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 code = Tcl_Eva
3ec0: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 lObjEx(interp, c
3ed0: 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f mdPtr, TCL_EVAL_
3ee0: 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 GLOBAL);. if
3ef0: 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 (code != TCL_OK)
3f00: 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f {.#if (TCL_MAJO
3f10: 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 R_VERSION == 8)
3f20: 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 && (TCL_MINOR_VE
3f30: 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f RSION < 6)..Tcl_
3f40: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 BackgroundError(
3f50: 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 interp);.#else..
3f60: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 Tcl_BackgroundEx
3f70: 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 ception(interp,
3f80: 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 code);.#endif.
3f90: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 }. Tcl_Decr
3fa0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
3fb0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 ;.. Tcl_Relea
3fc0: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
3fd0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 statePtr);. T
3fe0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
3ff0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
4000: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b . return res;
4010: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 0a 20 2a -------------. *
4060: 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b . * SNI Callback
4070: 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a for Servers --.
4080: 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 *. *.Perform se
4090: 72 76 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f rver-side SNI ho
40a0: 73 74 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e stname selection
40b0: 20 61 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 after receiving
40c0: 20 53 4e 49 20 68 65 61 64 65 72 2e 0a 20 2a 09 SNI header.. *.
40d0: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c Called after hel
40e0: 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 lo callback but
40f0: 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c before ALPN call
4100: 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 back.. *. * Resu
4110: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
4120: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
4130: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
4140: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
4150: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
4160: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
4170: 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f T_ERR_OK: SNI ho
4180: 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74 stname is accept
4190: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
41a0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
41b0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
41c0: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 ALERT_FATAL: SNI
41d0: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 hostname is not
41e0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 accepted. The c
41f0: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 onnection. *.
4200: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66 is aborted. Def
4210: 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69 ault for alert i
4220: 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 s SSL_AD_UNRECOG
4230: 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 NIZED_NAME.. *.S
4240: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
4250: 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 ERT_WARNING: SNI
4260: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 hostname is not
4270: 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69 accepted, warni
4280: 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 ng alert. *.
4290: 73 65 6e 74 20 28 6e 6f 74 20 69 6e 20 54 4c 53 sent (not in TLS
42a0: 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65 v1.3). The conne
42b0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
42c0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
42d0: 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f RR_NOACK: SNI ho
42e0: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
42f0: 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 61 cepted and not a
4300: 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09 cknowledged,. *.
4310: 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 20 e.g. if SNI
4320: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e has not been con
4330: 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f 6e figured. The con
4340: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
4350: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d s.. *. *--------
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 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
43a0: 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 61 static int.SNICa
43b0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
43c0: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 *ssl, int *aler
43d0: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a t, void *arg) {.
43e0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
43f0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
4400: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 g;. Tcl_Inter
4410: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
4420: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
4430: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
4440: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b r;. int code;
4450: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 . char *serve
4460: 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 rname = NULL;..
4470: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
4480: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
4490: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
44a0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e k == (Tcl_Obj*)N
44b0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
44c0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
44d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
44e0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl == NULL) {.
44f0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4500: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
4510: 20 20 7d 0a 0a 20 20 20 20 73 65 72 76 65 72 6e }.. servern
4520: 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 ame = SSL_get_se
4530: 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c rvername(ssl, TL
4540: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f SEXT_NAMETYPE_ho
4550: 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 st_name);. if
4560: 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c (!servername ||
4570: 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d servername[0] =
4580: 3d 20 27 5c 30 27 29 20 7b 0a 20 20 20 20 20 20 = '\0') {.
4590: 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 return SSL_TLS
45a0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
45b0: 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 }.. cmdPtr
45c0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
45d0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
45e0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c llback);. Tcl
45f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4600: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4610: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
4620: 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 ingObj("sni", -1
4630: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
4640: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
4650: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
4660: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
4670: 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d j(servername , -
4680: 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 1));.. Tcl_Pr
4690: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
46a0: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 ta) interp);.
46b0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 Tcl_Preserve((C
46c0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
46d0: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 Ptr);.. Tcl_I
46e0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
46f0: 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 tr);. code =
4700: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e Tcl_EvalObjEx(in
4710: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 terp, cmdPtr, TC
4720: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a L_EVAL_GLOBAL);.
4730: 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 if (code !=
4740: 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 TCL_OK) {.#if (T
4750: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
4760: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d == 8) && (TCL_M
4770: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 INOR_VERSION < 6
4780: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e )..Tcl_Backgroun
4790: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a dError(interp);.
47a0: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 #else..Tcl_Backg
47b0: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 roundException(i
47c0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 nterp, code);.#e
47d0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 ndif. }. T
47e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
47f0: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 cmdPtr);.. Tc
4800: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
4810: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
4820: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 ;. Tcl_Releas
4830: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
4840: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 nterp);. retu
4850: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
4860: 52 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d R_OK;.}.../*. *-
4870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 48 65 6c 6c 6f 20 48 --. *. * Hello H
48c0: 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 61 63 andshake Callbac
48d0: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d k for Servers --
48e0: 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 73 . *. *.Used by s
48f0: 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 6e 65 erver to examine
4900: 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 the server name
4910: 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 indication (SNI
4920: 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 ) extension. *.p
4930: 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 63 rovided by the c
4940: 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 lient in order t
4950: 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 70 72 o select an appr
4960: 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 69 63 opriate certific
4970: 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e ate to. *.presen
4980: 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65 t, and make othe
4990: 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 r configuration
49a0: 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c 65 adjustments rele
49b0: 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 65 72 vant to that ser
49c0: 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20 ver. *.name and
49d0: 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f its configuratio
49e0: 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 n. This includes
49f0: 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 74 68 swapping out th
4a00: 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 e associated. *.
4a10: 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c SSL_CTX pointer,
4a20: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 modifying the s
4a30: 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f 66 20 erver's list of
4a40: 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 76 65 permitted TLS ve
4a50: 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 rsions,. *.chang
4a60: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 ing the server's
4a70: 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 6e 20 cipher list in
4a80: 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 response to the
4a90: 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 72 20 client's cipher
4aa0: 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 0a 20 2a list, etc.. *. *
4ab0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
4ac0: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
4ad0: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 ects:. *.Calls c
4ae0: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 allback (if defi
4af0: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ned). *. * Retur
4b00: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f n codes:. *.SSL_
4b10: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 CLIENT_HELLO_RET
4b20: 52 59 20 3d 20 73 75 73 70 65 6e 64 20 74 68 65 RY = suspend the
4b30: 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20 handshake, and
4b40: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 75 the handshake fu
4b50: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75 nction will retu
4b60: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20 rn immediately.
4b70: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c *.SSL_CLIENT_HEL
4b80: 4c 4f 5f 45 52 52 4f 52 20 3d 20 66 61 69 6c 75 LO_ERROR = failu
4b90: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f re, terminate co
4ba0: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c nnection. Set al
4bb0: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 ert to error cod
4bc0: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 e.. *.SSL_CLIENT
4bd0: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 20 3d _HELLO_SUCCESS =
4be0: 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d success. *. *--
4bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
4c40: 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 63 .HelloCallback(c
4c50: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 onst SSL *ssl, i
4c60: 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 nt *alert, void
4c70: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 *arg) {. Stat
4c80: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
4c90: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 tate*)arg;. T
4ca0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
4cb0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
4cc0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
4cd0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
4ce0: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e nt code;. con
4cf0: 73 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e st char *servern
4d00: 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 ame;. const u
4d10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b nsigned char *p;
4d20: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c . size_t len,
4d30: 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 remaining;..
4d40: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
4d50: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
4d60: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
4d70: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
4d80: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
4d90: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 _CLIENT_HELLO_SU
4da0: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 CCESS;. } els
4db0: 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c e if (ssl == NUL
4dc0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
4dd0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
4de0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
4df0: 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a /* Get names */.
4e00: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 if (!SSL_cli
4e10: 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 ent_hello_get0_e
4e20: 78 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 xt(ssl, TLSEXT_T
4e30: 59 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c YPE_server_name,
4e40: 20 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 &p, &remaining)
4e50: 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d || remaining <=
4e60: 20 32 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 2) {. re
4e70: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
4e80: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
4e90: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 }.. /* Extra
4ea0: 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 ct the length of
4eb0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 the supplied li
4ec0: 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a st of names. */.
4ed0: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b len = (*(p++
4ee0: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e ) << 8);. len
4ef0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 += *(p++);.
4f00: 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 if (len + 2 != r
4f10: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 20 20 20 20 emaining) {.
4f20: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 return SSL_C
4f30: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
4f40: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d R;. }. rem
4f50: 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 aining = len;..
4f60: 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 /* The list i
4f70: 6e 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 n practice only
4f80: 68 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 has a single ele
4f90: 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 ment, so we only
4fa0: 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 consider the fi
4fb0: 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 rst one. */.
4fc0: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d if (remaining ==
4fd0: 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 0 || *p++ != TL
4fe0: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f SEXT_NAMETYPE_ho
4ff0: 73 74 5f 6e 61 6d 65 29 20 7b 0a 20 20 20 20 20 st_name) {.
5000: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c return SSL_CL
5010: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
5020: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 ;. }. rema
5030: 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a ining--;.. /*
5040: 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 6e 61 Now we can fina
5050: 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 lly pull out the
5060: 20 62 79 74 65 20 61 72 72 61 79 20 77 69 74 68 byte array with
5070: 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f 73 74 the actual host
5080: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 name. */. if
5090: 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 (remaining <= 2)
50a0: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 {. retur
50b0: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
50c0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
50d0: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b len = (*(p++
50e0: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e ) << 8);. len
50f0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 += *(p++);.
5100: 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 if (len + 2 > re
5110: 6d 61 69 6e 69 6e 67 29 20 7b 0a 20 20 20 20 20 maining) {.
5120: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c return SSL_CL
5130: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
5140: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 ;. }. rema
5150: 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 ining = len;.
5160: 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 servername = (c
5170: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a onst char *)p;..
5180: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
5190: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
51a0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
51b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
51c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
51d0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
51e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
51f0: 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a ("hello", -1));.
5200: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
5210: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5220: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
5230: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 _NewStringObj(se
5240: 72 76 65 72 6e 61 6d 65 2c 20 28 69 6e 74 29 20 rvername, (int)
5250: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f len));.. Tcl_
5260: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
5270: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
5280: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
5290: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
52a0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c tePtr);.. Tcl
52b0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
52c0: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 dPtr);. code
52d0: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 = Tcl_EvalObjEx(
52e0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
52f0: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
5300: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 ;. if (code !
5310: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 = TCL_OK) {.#if
5320: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
5330: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
5340: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
5350: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
5360: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 undError(interp)
5370: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 ;.#else..Tcl_Bac
5380: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e kgroundException
5390: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a (interp, code);.
53a0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 #endif. }.
53b0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
53c0: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 t(cmdPtr);..
53d0: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
53e0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
53f0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 r);. Tcl_Rele
5400: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
5410: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 interp);. re
5420: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
5430: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 7d HELLO_SUCCESS;.}
5440: 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
5450: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d ********/./* Com
5460: 6d 61 6e 64 73 20 20 20 20 20 20 20 20 20 2a 2f mands */
5470: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
5480: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d ******/../*. *--
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54d0: 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f -. *. * CiphersO
54e0: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 bjCmd -- list av
54f0: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a ailable ciphers.
5500: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
5510: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
5520: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
5530: 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f tls::ciphers" co
5540: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 mmand. *.to list
5550: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 available ciphe
5560: 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 rs, based upon p
5570: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
5580: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
5590: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
55a0: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a cl result list..
55b0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
55c0: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 ts:. *.construct
55d0: 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 s and destroys S
55e0: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 SL context (CTX)
55f0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
5600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5610: 2d 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 0a 20 2a 2f 0a 73 74 ---------. */.st
5640: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
5650: 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b *protocols[] = {
5660: 0a 09 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 .."ssl2", "ssl3"
5670: 2c 20 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e , "tls1", "tls1.
5680: 31 22 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 1", "tls1.2", "t
5690: 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a ls1.3", NULL.};.
56a0: 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a enum protocol {.
56b0: 20 20 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c TLS_SSL2, TL
56c0: 53 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 S_SSL3, TLS_TLS1
56d0: 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c , TLS_TLS1_1, TL
56e0: 53 5f 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c S_TLS1_2, TLS_TL
56f0: 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d S1_3, TLS_NONE.}
5700: 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 69 ;..static int.Ci
5710: 70 68 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 phersObjCmd(Clie
5720: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
5730: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
5740: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
5750: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
5760: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
5770: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 l_Obj *objPtr =
5780: 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 NULL;. SSL_CT
5790: 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 X *ctx = NULL;.
57a0: 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 SSL *ssl = NU
57b0: 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 LL;. STACK_OF
57c0: 28 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b (SSL_CIPHER) *sk
57d0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 ;. char *cp,
57e0: 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 buf[BUFSIZ];.
57f0: 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 int index, verb
5800: 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 ose = 0, use_sup
5810: 70 6f 72 74 65 64 20 3d 20 30 3b 0a 0a 20 20 20 ported = 0;..
5820: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
5830: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 ");.. if ((ob
5840: 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 jc < 2) || (objc
5850: 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 > 4)) {..Tcl_Wr
5860: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
5870: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f p, 1, objv, "pro
5880: 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 tocol ?verbose?
5890: 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 ?supported?");..
58a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
58b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
58c0: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d Tcl_GetIndexFrom
58d0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
58e0: 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 [1], protocols,
58f0: 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 "protocol", 0, &
5900: 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b index) != TCL_OK
5910: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
5920: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
5930: 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 if ((objc > 2)
5940: 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 && Tcl_GetBoolea
5950: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c nFromObj(interp,
5960: 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f objv[2], &verbo
5970: 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b se) != TCL_OK) {
5980: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
5990: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
59a0: 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 ((objc > 3) &&
59b0: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 Tcl_GetBooleanFr
59c0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
59d0: 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 jv[3], &use_supp
59e0: 6f 72 74 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b orted) != TCL_OK
59f0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
5a00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
5a10: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
5a20: 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 r();.. switch
5a30: 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c ((enum protocol
5a40: 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 65 20 )index) {..case
5a50: 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50 TLS_SSL2:.#if OP
5a60: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
5a70: 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 MBER >= 0x101000
5a80: 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 00L || defined(N
5a90: 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e O_SSL2) || defin
5aa0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
5ab0: 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 L2).. Tcl_App
5ac0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
5ad0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
5ae0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
5af0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
5b00: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
5b10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
5b20: 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 lse.. ctx = S
5b30: 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 SL_CTX_new(SSLv2
5b40: 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 _method()); brea
5b50: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 k;.#endif..case
5b60: 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 TLS_SSL3:.#if de
5b70: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c fined(NO_SSL3) |
5b80: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
5b90: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 L_NO_SSL3) || de
5ba0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
5bb0: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 _SSL3_METHOD)..
5bc0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
5bd0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
5be0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
5bf0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
5c00: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
5c10: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
5c20: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
5c30: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
5c40: 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f _new(SSLv3_metho
5c50: 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e d()); break;.#en
5c60: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c dif..case TLS_TL
5c70: 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 S1:.#if defined(
5c80: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 NO_TLS1) || defi
5c90: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
5ca0: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
5cb0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
5cc0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c METHOD).. Tcl
5cd0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
5ce0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
5cf0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
5d00: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
5d10: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 d", NULL);..
5d20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
5d30: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 ;.#else.. ctx
5d40: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 = SSL_CTX_new(T
5d50: 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 LSv1_method());
5d60: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
5d70: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a ase TLS_TLS1_1:.
5d80: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
5d90: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_1) || define
5da0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
5db0: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_1) || defined(
5dc0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
5dd0: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 1_METHOD).. T
5de0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
5df0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
5e00: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
5e10: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
5e20: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
5e30: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
5e40: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 OR;.#else.. c
5e50: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
5e60: 28 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 (TLSv1_1_method(
5e70: 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 )); break;.#endi
5e80: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
5e90: 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _2:.#if defined(
5ea0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 NO_TLS1_2) || de
5eb0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
5ec0: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
5ed0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
5ee0: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 LS1_2_METHOD)..
5ef0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
5f00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
5f10: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
5f20: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
5f30: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
5f40: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
5f50: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
5f60: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
5f70: 5f 6e 65 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74 _new(TLSv1_2_met
5f80: 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 hod()); break;.#
5f90: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
5fa0: 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 TLS1_3:.#if defi
5fb0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c ned(NO_TLS1_3) |
5fc0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
5fd0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 L_NO_TLS1_3)..
5fe0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
5ff0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f lt(interp, proto
6000: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 cols[index], ":
6010: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
6020: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
6030: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
6040: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
6050: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ctx = SSL_CTX_
6060: 6e 65 77 28 54 4c 53 5f 6d 65 74 68 6f 64 28 29 new(TLS_method()
6070: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 );. S
6080: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 SL_CTX_set_min_p
6090: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
60a0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
60b0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
60c0: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 set_max_proto_ve
60d0: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f rsion(ctx, TLS1_
60e0: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 3_VERSION);..
60f0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
6100: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 62 72 default:.. br
6110: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 eak;. }. i
6120: 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 f (ctx == NULL)
6130: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
6140: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 ult(interp, REAS
6150: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ON(), NULL);..re
6160: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6170: 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d }.. ssl =
6180: 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 SSL_new(ctx);.
6190: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 if (ssl == NU
61a0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
61b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
61c0: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b REASON(), NULL);
61d0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
61e0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c tx);..return TCL
61f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
6200: 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 /* Use list a
6210: 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c nd order as woul
6220: 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43 d be sent in a C
6230: 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c lientHello or al
6240: 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 l available ciph
6250: 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 ers */. if (u
6260: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a se_supported) {.
6270: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 .sk = SSL_get1_s
6280: 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73 upported_ciphers
6290: 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 (ssl);. } els
62a0: 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 e {..sk = SSL_ge
62b0: 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a t_ciphers(ssl);.
62c0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
62d0: 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 k != NULL) {..if
62e0: 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 (!verbose) {..
62f0: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
6300: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
6310: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 LL);.. for (i
6320: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b nt i = 0; i < sk
6330: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 _SSL_CIPHER_num(
6340: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f sk); i++) {...co
6350: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a nst SSL_CIPHER *
6360: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 c = sk_SSL_CIPHE
6370: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a R_value(sk, i);.
6380: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 ..if (c == NULL)
6390: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a continue;..../*
63a0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 cipher name or
63b0: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d (NONE) */...cp =
63c0: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
63d0: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 name(c);...if (c
63e0: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b p == NULL) break
63f0: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
6400: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
6410: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
6420: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 _NewStringObj(cp
6430: 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a , -1));.. }..
6440: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f .} else {.. o
6450: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 bjPtr = Tcl_NewS
6460: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a tringObj("",0);.
6470: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 . for (int i
6480: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f = 0; i < sk_SSL_
6490: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 CIPHER_num(sk);
64a0: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 i++) {...const S
64b0: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 SL_CIPHER *c = s
64c0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c k_SSL_CIPHER_val
64d0: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 ue(sk, i);...if
64e0: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 (c == NULL) cont
64f0: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 inue;..../* text
6500: 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 ual description
6510: 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f of the cipher */
6520: 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 ...if (SSL_CIPHE
6530: 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c R_description(c,
6540: 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 buf, sizeof(buf
6550: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 )) != NULL) {...
6560: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f Tcl_AppendTo
6570: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c Obj(objPtr, buf,
6580: 20 28 69 6e 74 29 20 73 74 72 6c 65 6e 28 62 75 (int) strlen(bu
6590: 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a f));...} else {.
65a0: 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
65b0: 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 ToObj(objPtr, "U
65c0: 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 NKNOWN\n", 8);..
65d0: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 .}.. }..}..if
65e0: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 (use_supported)
65f0: 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 {.. sk_SSL_C
6600: 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a IPHER_free(sk);.
6610: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c .}. }. SSL
6620: 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 _free(ssl);.
6630: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
6640: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f );.. Tcl_SetO
6650: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
6660: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
6670: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
6680: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
6690: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a tData;.}.../*. *
66a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66e0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 ---. *. * Protoc
66f0: 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 olsObjCmd -- lis
6700: 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 t available prot
6710: 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 ocols. *. *.This
6720: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
6730: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 voked to process
6740: 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f the "tls::proto
6750: 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a cols" command. *
6760: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 .to list availab
6770: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a le protocols.. *
6780: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
6790: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
67a0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 esult list.. *.
67b0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
67c0: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.none. *. *---
67d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
6820: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 ProtocolsObjCmd(
6830: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
6840: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
6850: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
6860: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
6870: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
6880: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
6890: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 r;.. dprintf(
68a0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
68b0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b if (objc != 1) {
68c0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
68d0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
68e0: 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e jv, "");..return
68f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
6900: 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 }.. objPtr =
6910: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
6920: 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 , NULL);..#if OP
6930: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
6940: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
6950: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
6960: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
6970: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
6980: 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 SL2). Tcl_Lis
6990: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
69a0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
69b0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
69c0: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
69d0: 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 _SSL2], -1));.#e
69e0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
69f0: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 d(NO_SSL3) && !d
6a00: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
6a10: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 54 63 6c 5f O_SSL3). Tcl_
6a20: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
6a30: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
6a40: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
6a50: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
6a60: 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b TLS_SSL3], -1));
6a70: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
6a80: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 ined(NO_TLS1) &&
6a90: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
6aa0: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 54 L_NO_TLS1). T
6ab0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6ac0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6ad0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
6ae0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
6af0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 ls[TLS_TLS1], -1
6b00: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
6b10: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
6b20: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
6b30: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
6b40: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
6b50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
6b60: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
6b70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
6b80: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
6b90: 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e S1_1], -1));.#en
6ba0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
6bb0: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 (NO_TLS1_2) && !
6bc0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
6bd0: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 54 NO_TLS1_2). T
6be0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6bf0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6c00: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
6c10: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
6c20: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 ls[TLS_TLS1_2],
6c30: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 -1));.#endif.#if
6c40: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
6c50: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
6c60: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
6c70: 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 _3). Tcl_List
6c80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
6c90: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
6ca0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
6cb0: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
6cc0: 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 TLS1_3], -1));.#
6cd0: 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 endif.. Tcl_S
6ce0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
6cf0: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
6d00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
6d10: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
6d20: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
6d30: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 48 61 6e ------. *. * Han
6d80: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a dshakeObjCmd --.
6d90: 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 *. *.This comma
6da0: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 nd is used to ve
6db0: 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68 65 rify whether the
6dc0: 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f handshake is co
6dd0: 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 mplete. *.or not
6de0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
6df0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
6e00: 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 cl result. 1 mea
6e10: 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d ns handshake com
6e20: 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 plete, 0 means p
6e30: 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 ending.. *. * Si
6e40: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d de effects:. *.M
6e50: 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 ay force SSL neg
6e60: 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 otiation to take
6e70: 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d place.. *. *---
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
6ed0: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 HandshakeObjCmd(
6ee0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
6ef0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
6f00: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
6f10: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
6f20: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
6f30: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
6f40: 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 an; /* Th
6f50: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 e channel to set
6f60: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 a mode on. */.
6f70: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
6f80: 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c tr; /* cl
6f90: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 ient state for s
6fa0: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 sl socket */.
6fb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 const char *err
6fc0: 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 Str = NULL;.
6fd0: 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 int ret = 1;.
6fe0: 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 int err = 0;..
6ff0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
7000: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
7010: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
7020: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
7030: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
7040: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
7050: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
7060: 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d }.. chan =
7070: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
7080: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
7090: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
70a0: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c v[1], NULL), NUL
70b0: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
70c0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
70d0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
70e0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
70f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
7100: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
7110: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
7120: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
7130: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
7140: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
7150: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
7160: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
7170: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
7180: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
7190: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
71a0: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
71b0: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
71c0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c elName(chan), "\
71d0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
71e0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 nnel", NULL);..r
71f0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
7200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 ;. }. stat
7210: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
7220: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e Tcl_GetChannelIn
7230: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 stanceData(chan)
7240: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
7250: 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 Calling Tls_Wait
7260: 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 ForConnect");.
7270: 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 ret = Tls_Wait
7280: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 ForConnect(state
7290: 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 Ptr, &err, 1);.
72a0: 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f dprintf("Tls_
72b0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 WaitForConnect r
72c0: 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 eturned: %i", re
72d0: 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 t);.. if (ret
72e0: 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 50 < 0 && ((stateP
72f0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
7300: 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 TCL_ASYNC) && (e
7310: 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 rr == EAGAIN)))
7320: 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e {..dprintf("Asyn
7330: 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 c set and err =
7340: 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d EAGAIN");..ret =
7350: 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 0;. } else i
7360: 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 65 f (ret < 0) {..e
7370: 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 rrStr = statePtr
7380: 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 ->err;..Tcl_Rese
7390: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b tResult(interp);
73a0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 ..Tcl_SetErrno(e
73b0: 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 rr);...if (!errS
73c0: 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d tr || (*errStr =
73d0: 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 = 0)) {.. err
73e0: 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 Str = Tcl_PosixE
73f0: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d rror(interp);..}
7400: 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
7410: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e ult(interp, "han
7420: 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 dshake failed: "
7430: 2c 20 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 , errStr, (char
7440: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e *) NULL);..dprin
7450: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 tf("Returning TC
7460: 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e L_ERROR with han
7470: 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 dshake failed: %
7480: 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 s", errStr);..re
7490: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
74a0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 . } else {..i
74b0: 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 f (err != 0) {..
74c0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 dprintf("Got
74d0: 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 an error with a
74e0: 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 completed hands
74f0: 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c hake: err = %i",
7500: 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d err);..}..ret =
7510: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 1;. }.. d
7520: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
7530: 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 g TCL_OK with da
7540: 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 ta \"%i\"", ret)
7550: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a ;. Tcl_SetObj
7560: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
7570: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 cl_NewIntObj(ret
7580: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 ));. return(T
7590: 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 CL_OK);..clientD
75a0: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
75b0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75d0: 2d 2d 2d 2d 2d 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 0a 20 2a -------------. *
7600: 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 . * ImportObjCmd
7610: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
7620: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
7630: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 ked to process t
7640: 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 he "ssl" command
7650: 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 . *. *.The ssl c
7660: 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 ommand pushes SS
7670: 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 L over a (newly
7680: 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 connected) tcp s
7690: 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 ocket. *. * Resu
76a0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
76b0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
76c0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
76d0: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 s:. *.May modify
76e0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 the behavior of
76f0: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a an IO channel..
7700: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 73 74 61 --------. */.sta
7750: 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 tic int.ImportOb
7760: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
7770: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
7780: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
7790: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
77a0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
77b0: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e {. Tcl_Chann
77c0: 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 el chan;../* The
77d0: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 channel to set
77e0: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 a mode on. */.
77f0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
7800: 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 r;../* client st
7810: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b ate for ssl sock
7820: 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 et */. SSL_CT
7830: 58 20 2a 63 74 78 09 20 20 20 20 20 20 20 20 3d X *ctx. =
7840: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f NULL;. Tcl_O
7850: 62 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20 20 bj *script.
7860: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 = NULL;. T
7870: 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 cl_Obj *password
7880: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
7890: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
78a0: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 upperChannelTra
78b0: 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 nslation, upperC
78c0: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 hannelBlocking,
78d0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
78e0: 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e ding, upperChann
78f0: 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 elEOFChar;. i
7900: 6e 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 nt idx, len;.
7910: 20 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20 int flags..
7920: 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e = TLS_TCL_IN
7930: 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 IT;. int serv
7940: 65 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b er.. = 0;
7950: 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f ./* is connectio
7960: 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 n incoming or ou
7970: 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 tgoing? */. c
7980: 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 har *keyfile.
7990: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
79a0: 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 char *certfile.
79b0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
79c0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
79d0: 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b r *key .= NULL;
79e0: 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e . int key_len
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7a00: 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e = 0;. unsign
7a10: 65 64 20 63 68 61 72 20 2a 63 65 72 74 20 20 20 ed char *cert
7a20: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
7a30: 20 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 20 20 int cert_len
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 =
7a50: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 0;. char *cip
7a60: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e hers. = N
7a70: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 ULL;. char *c
7a80: 69 70 68 65 72 73 75 69 74 65 73 09 20 20 20 20 iphersuites.
7a90: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
7aa0: 63 68 61 72 20 2a 43 41 66 69 6c 65 09 20 20 20 char *CAfile.
7ab0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
7ac0: 20 63 68 61 72 20 2a 43 41 64 69 72 09 09 20 20 char *CAdir..
7ad0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
7ae0: 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 char *DHparams
7af0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
7b00: 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c . char *model
7b10: 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c .. = NULL
7b20: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 ;. char *serv
7b30: 65 72 6e 61 6d 65 09 20 20 20 20 20 20 20 20 3d ername. =
7b40: 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 NULL;./* hostna
7b50: 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 me for Server Na
7b60: 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f me Indication */
7b70: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
7b80: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
7b90: 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 n_id = NULL;.
7ba0: 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 Tcl_Obj *alpn..
7bb0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
7bc0: 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d ssl2 = 0, ssl3 =
7bd0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 0;. int tls1
7be0: 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 = 1, tls1_1 = 1
7bf0: 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c , tls1_2 = 1, tl
7c00: 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e s1_3 = 1;. in
7c10: 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 t proto = 0, lev
7c20: 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 el = -1;. int
7c30: 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 verify = 0, req
7c40: 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 uire = 0, reques
7c50: 74 20 3d 20 31 3b 0a 0a 20 20 20 20 64 70 72 69 t = 1;.. dpri
7c60: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
7c70: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
7c80: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
7c90: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
7ca0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
7cb0: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 SSL2) && !define
7cc0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 d(NO_SSL2) && de
7cd0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
7ce0: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 & defined(NO_TLS
7cf0: 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 1) && defined(NO
7d00: 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66 69 _TLS1_1) && defi
7d10: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 ned(NO_TLS1_2) &
7d20: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 & defined(NO_TLS
7d30: 31 5f 33 29 0a 20 20 20 20 73 73 6c 32 20 3d 20 1_3). ssl2 =
7d40: 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 1;.#endif.#if !d
7d50: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7d60: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
7d70: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 ned(NO_SSL3) &&
7d80: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
7d90: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 && defined(NO_T
7da0: 4c 53 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 LS1) && defined(
7db0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 NO_TLS1_1) && de
7dc0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
7dd0: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 && defined(NO_T
7de0: 4c 53 31 5f 33 29 0a 20 20 20 20 73 73 6c 33 20 LS1_3). ssl3
7df0: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 1;.#endif.#if
7e00: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
7e10: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7e20: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 SSL_NO_TLS1).
7e30: 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 tls1 = 0;.#endi
7e40: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
7e50: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
7e60: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
7e70: 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f LS1_1). tls1_
7e80: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 1 = 0;.#endif.#i
7e90: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
7ea0: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
7eb0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
7ec0: 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 2). tls1_2 =
7ed0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
7ee0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
7ef0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7f00: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
7f10: 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 tls1_3 = 0;.#
7f20: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f endif.. if (o
7f30: 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f bjc < 2) {..Tcl_
7f40: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
7f50: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
7f60: 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f hannel ?options?
7f70: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
7f80: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
7f90: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
7fa0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
7fb0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
7fc0: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 mObj(objv[1], NU
7fd0: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 LL), NULL);.
7fe0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
7ff0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
8000: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
8010: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
8020: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
8030: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
8040: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
8050: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
8060: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
8070: 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 han);.. for (
8080: 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f idx = 2; idx < o
8090: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 bjc; idx++) {..c
80a0: 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 har *opt = Tcl_G
80b0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
80c0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 objv[idx], NULL)
80d0: 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 ;...if (opt[0] !
80e0: 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 = '-').. brea
80f0: 6b 3b 0a 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 k;...OPTSTR("-ca
8100: 64 69 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f dir", CAdir);..O
8110: 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c PTSTR("-cafile",
8120: 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 CAfile);..OPTST
8130: 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 R("-certfile", c
8140: 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 ertfile);..OPTST
8150: 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 R("-cipher", cip
8160: 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 hers);..OPTSTR("
8170: 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 -ciphers", ciphe
8180: 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 rs);..OPTSTR("-c
8190: 69 70 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 iphersuites", ci
81a0: 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 phersuites);..OP
81b0: 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c TOBJ("-command",
81c0: 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 script);..OPTST
81d0: 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 R("-dhparams", D
81e0: 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 53 54 Hparams);..OPTST
81f0: 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 R("-keyfile", ke
8200: 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 yfile);..OPTSTR(
8210: 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 "-model", model)
8220: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 ;..OPTOBJ("-pass
8230: 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 word", password)
8240: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 ;..OPTBOOL("-req
8250: 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b uire", require);
8260: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 ..OPTBOOL("-requ
8270: 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a est", request);.
8280: 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 .OPTINT("-securi
8290: 74 79 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 tylevel", level)
82a0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 ;..OPTBOOL("-ser
82b0: 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 ver", server);..
82c0: 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e OPTSTR("-servern
82d0: 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 ame", servername
82e0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 );..OPTSTR("-ses
82f0: 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f sion_id", sessio
8300: 6e 5f 69 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 n_id);..OPTOBJ("
8310: 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 -alpn", alpn);..
8320: 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c OPTBOOL("-ssl2",
8330: 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c ssl2);..OPTBOOL
8340: 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b ("-ssl3", ssl3);
8350: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 ..OPTBOOL("-tls1
8360: 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f ", tls1);..OPTBO
8370: 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c OL("-tls1.1", tl
8380: 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 s1_1);..OPTBOOL(
8390: 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f "-tls1.2", tls1_
83a0: 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 2);..OPTBOOL("-t
83b0: 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b ls1.3", tls1_3);
83c0: 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 ..OPTBYTE("-cert
83d0: 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 ", cert, cert_le
83e0: 6e 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b n);..OPTBYTE("-k
83f0: 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 ey", key, key_le
8400: 6e 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 n);...OPTBAD("op
8410: 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d tion", "-alpn, -
8420: 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 cadir, -cafile,
8430: 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 -cert, -certfile
8440: 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 , -cipher, -ciph
8450: 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 ersuites, -comma
8460: 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d nd, -dhparams, -
8470: 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d key, -keyfile, -
8480: 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 model, -password
8490: 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 72 65 71 , -require, -req
84a0: 75 65 73 74 2c 20 2d 73 65 63 75 72 69 74 79 6c uest, -securityl
84b0: 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d evel, -server, -
84c0: 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 servername, -ses
84d0: 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 sion_id, -ssl2,
84e0: 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 -ssl3, -tls1, -t
84f0: 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 ls1.1, -tls1.2,
8500: 6f 72 20 2d 74 6c 73 31 2e 33 22 29 3b 0a 0a 09 or -tls1.3");...
8510: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
8520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
8530: 72 65 71 75 65 73 74 29 09 20 20 20 20 76 65 72 request). ver
8540: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
8550: 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 Y_CLIENT_ONCE |
8560: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b SSL_VERIFY_PEER;
8570: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 . if (request
8580: 20 26 26 20 72 65 71 75 69 72 65 29 20 76 65 72 && require) ver
8590: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
85a0: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 Y_FAIL_IF_NO_PEE
85b0: 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 R_CERT;. if (
85c0: 76 65 72 69 66 79 20 3d 3d 20 30 29 09 76 65 72 verify == 0).ver
85d0: 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 ify = SSL_VERIFY
85e0: 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 _NONE;.. prot
85f0: 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 o |= (ssl2 ? TLS
8600: 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 _PROTO_SSL2 : 0)
8610: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
8620: 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f ssl3 ? TLS_PROTO
8630: 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 _SSL3 : 0);.
8640: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f proto |= (tls1 ?
8650: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 TLS_PROTO_TLS1
8660: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
8670: 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 |= (tls1_1 ? TLS
8680: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 _PROTO_TLS1_1 :
8690: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
86a0: 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 (tls1_2 ? TLS_P
86b0: 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 ROTO_TLS1_2 : 0)
86c0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
86d0: 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f tls1_3 ? TLS_PRO
86e0: 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a TO_TLS1_3 : 0);.
86f0: 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f . /* reset to
8700: 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 NULL if blank s
8710: 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a tring provided *
8720: 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26 /. if (cert &
8730: 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20 & !*cert)..
8740: 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20 cert.
8750: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
8760: 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20 key && !*key)..
8770: 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20 key.
8780: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
8790: 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21 f (certfile && !
87a0: 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20 *certfile)
87b0: 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 certfile.= NU
87c0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66 LL;. if (keyf
87d0: 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 ile && !*keyfile
87e0: 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20 )..keyfile.
87f0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
8800: 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a f (ciphers && !*
8810: 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20 ciphers).
8820: 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 ciphers.
8830: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
8840: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26 26 (ciphersuites &&
8850: 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 29 !*ciphersuites)
8860: 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20 20 ciphersuites
8870: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
8880: 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66 (CAfile && !*CAf
8890: 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66 ile). CAf
88a0: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ile. = NU
88b0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69 LL;. if (CAdi
88c0: 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 20 20 r && !*CAdir).
88d0: 20 20 20 20 20 20 43 41 64 69 72 09 20 20 20 20 CAdir.
88e0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
88f0: 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 if (DHparams &&
8900: 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20 !*DHparams).
8910: 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20 DHparams
8920: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 = NULL;..
8930: 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 /* new SSL stat
8940: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 e */. statePt
8950: 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 r..= (State *) c
8960: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 kalloc((unsigned
8970: 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 ) sizeof(State))
8980: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 ;. memset(sta
8990: 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 tePtr, 0, sizeof
89a0: 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 (State));.. s
89b0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d tatePtr->flags.=
89c0: 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 flags;. stat
89d0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 ePtr->interp.= i
89e0: 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 nterp;. state
89f0: 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 Ptr->vflags.= ve
8a00: 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 rify;. stateP
8a10: 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 tr->err.= "";..
8a20: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 /* allocate s
8a30: 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 cript */. if
8a40: 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 (script) {..(voi
8a50: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 d) Tcl_GetString
8a60: 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 FromObj(script,
8a70: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 &len);..if (len)
8a80: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 {.. statePtr
8a90: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 ->callback = scr
8aa0: 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e ipt;.. Tcl_In
8ab0: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
8ac0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
8ad0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
8ae0: 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f allocate passwo
8af0: 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 rd */. if (pa
8b00: 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 ssword) {..(void
8b10: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
8b20: 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c romObj(password,
8b30: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e &len);..if (len
8b40: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 ) {.. statePt
8b50: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 r->password = pa
8b60: 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c ssword;.. Tcl
8b70: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _IncrRefCount(st
8b80: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
8b90: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
8ba0: 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 if (model != NU
8bb0: 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b LL) {..int mode;
8bc0: 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f ../* Get the "mo
8bd0: 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a del" context */.
8be0: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 .chan = Tcl_GetC
8bf0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d hannel(interp, m
8c00: 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 odel, &mode);..i
8c10: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
8c20: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
8c30: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
8c40: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
8c50: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
8c60: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
8c70: 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 *.. * Make sure
8c80: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
8c90: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
8ca0: 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 l.. */..chan = T
8cb0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
8cc0: 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c (chan);..if (Tcl
8cd0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
8ce0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
8cf0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 nnelType()) {..
8d00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
8d10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
8d20: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
8d30: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
8d40: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e (chan),..."\": n
8d50: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
8d60: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 ", NULL);.. T
8d70: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
8d80: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
8d90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
8da0: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 R;..}..ctx = ((S
8db0: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
8dc0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
8dd0: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 a(chan))->ctx;.
8de0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
8df0: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 ((ctx = CTX_Init
8e00: 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 (statePtr, serve
8e10: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c r, proto, keyfil
8e20: 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 e, certfile, key
8e30: 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c , cert, key_len,
8e40: 0a 09 20 20 20 20 63 65 72 74 5f 6c 65 6e 2c 20 .. cert_len,
8e50: 43 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 CAdir, CAfile, c
8e60: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 iphers, ciphersu
8e70: 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 ites, level, DHp
8e80: 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 arams)) == NULL)
8e90: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
8ea0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
8eb0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
8ec0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
8ed0: 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 }.. stateP
8ee0: 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a tr->ctx = ctx;..
8ef0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 /*. * We
8f00: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 need to make su
8f10: 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e re that the chan
8f20: 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e nel works in bin
8f30: 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 ary (for the.
8f40: 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e * encryption n
8f50: 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 ot to get goofed
8f60: 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 up).. * We
8f70: 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a only want to adj
8f80: 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69 6e ust the bufferin
8f90: 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e g in pre-v2 chan
8fa0: 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20 nels, where.
8fb0: 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 * each channel
8fc0: 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69 in the stack mai
8fd0: 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 ntained its own
8fe0: 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f buffers.. */
8ff0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
9000: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
9010: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
9020: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
9030: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
9040: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 lBlocking);.
9050: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
9060: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
9070: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 Char);. Tcl_D
9080: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
9090: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
90a0: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
90b0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
90c0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 rp, chan, "-eofc
90d0: 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e har", &upperChan
90e0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 nelEOFChar);.
90f0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
9100: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
9110: 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c an, "-encoding",
9120: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e &upperChannelEn
9130: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c coding);. Tcl
9140: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
9150: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
9160: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 "-translation",
9170: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
9180: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 nslation);. T
9190: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
91a0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
91b0: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 , "-blocking", &
91c0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
91d0: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 king);. Tcl_S
91e0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
91f0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
9200: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 translation", "b
9210: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c inary");. Tcl
9220: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
9230: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
9240: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 "-blocking", "tr
9250: 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 ue");. dprint
9260: 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c f("Consuming Tcl
9270: 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 channel %s", Tc
9280: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
9290: 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 (chan));. sta
92a0: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 tePtr->self = Tc
92b0: 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 l_StackChannel(i
92c0: 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e nterp, Tls_Chann
92d0: 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e elType(), (Clien
92e0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c tData) statePtr,
92f0: 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c (TCL_READABLE |
9300: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 TCL_WRITABLE),
9310: 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e chan);. dprin
9320: 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e tf("Created chan
9330: 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 nel named %s", T
9340: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
9350: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
9360: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 ));. if (stat
9370: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 ePtr->self == (T
9380: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
9390: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 ) {../*.. * No u
93a0: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 se of Tcl_Eventu
93b0: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 allyFree because
93c0: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c no possible Tcl
93d0: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a _Preserve... */.
93e0: 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 .Tls_Free((char
93f0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 *) statePtr);..r
9400: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
9410: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
9420: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
9430: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
9440: 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 r->self, "-trans
9450: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 lation", Tcl_DSt
9460: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
9470: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
9480: 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 on));. Tcl_Se
9490: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
94a0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
94b0: 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e >self, "-encodin
94c0: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 g", Tcl_DStringV
94d0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
94e0: 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 elEncoding));.
94f0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
9500: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 Option(interp, s
9510: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 tatePtr->self, "
9520: 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 -eofchar", Tcl_D
9530: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
9540: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
9550: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ));. Tcl_SetC
9560: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
9570: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
9580: 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 elf, "-blocking"
9590: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
95a0: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
95b0: 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 Blocking));..
95c0: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 /*. * SSL I
95d0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 nitialization.
95e0: 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 */. stateP
95f0: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 tr->ssl = SSL_ne
9600: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 w(statePtr->ctx)
9610: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65 ;. if (!state
9620: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 Ptr->ssl) {../*
9630: 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f SSL library erro
9640: 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 r */..Tcl_Append
9650: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
9660: 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 couldn't constru
9670: 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 ct ssl session:
9680: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 ", REASON(), (ch
9690: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c ar *) NULL);..Tl
96a0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
96b0: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 statePtr);..retu
96c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
96d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 }.. /* Set
96e0: 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 host server name
96f0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 */. if (serv
9700: 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 ername) {../* Se
9710: 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 ts the server na
9720: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 me indication (S
9730: 4e 49 29 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 NI) ClientHello
9740: 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 69 66 extension */..if
9750: 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 (!SSL_set_tlsex
9760: 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 t_host_name(stat
9770: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 ePtr->ssl, serve
9780: 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 rname) && requir
9790: 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 e) {.. Tcl_Ap
97a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
97b0: 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c 53 20 p, "setting TLS
97c0: 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 host name extens
97d0: 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 63 68 ion failed", (ch
97e0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 ar *) NULL);.
97f0: 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 65 Tls_Fre
9800: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
9810: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 Ptr);.
9820: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
9830: 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 09 OR;. }...
9840: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 73 65 72 /* Configure ser
9850: 76 65 72 20 68 6f 73 74 20 6e 61 6d 65 20 63 68 ver host name ch
9860: 65 63 6b 73 20 69 6e 20 74 68 65 20 53 53 4c 20 ecks in the SSL
9870: 63 6c 69 65 6e 74 2e 20 53 65 74 20 44 4e 53 20 client. Set DNS
9880: 68 6f 73 74 6e 61 6d 65 20 74 6f 0a 09 20 20 20 hostname to..
9890: 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 name for peer ce
98a0: 72 74 69 66 69 63 61 74 65 20 63 68 65 63 6b 73 rtificate checks
98b0: 2e 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 . SSL_set1_host
98c0: 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e has limitations.
98d0: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 */..if (!SSL_ad
98e0: 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 d1_host(statePtr
98f0: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d ->ssl, servernam
9900: 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 e)) {.. Tcl_A
9910: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
9920: 72 70 2c 20 22 73 65 74 74 69 6e 67 20 44 4e 53 rp, "setting DNS
9930: 20 68 6f 73 74 20 6e 61 6d 65 20 66 61 69 6c 65 host name faile
9940: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
9950: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 L);.
9960: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
9970: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 ) statePtr);.
9980: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 return
9990: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
99a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 }.. /* Resu
99b0: 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f me session id */
99c0: 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e . if (session
99d0: 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 _id && strlen(se
99e0: 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c ssion_id) <= SSL
99f0: 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e _MAX_SID_CTX_LEN
9a00: 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 GTH) {../* SSL_s
9a10: 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a et_session() */.
9a20: 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f .if (!SSL_SESSIO
9a30: 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 N_set1_id_contex
9a40: 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f t(SSL_get_sessio
9a50: 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 n(statePtr->ssl)
9a60: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 , session_id, (u
9a70: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 nsigned int) str
9a80: 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 len(session_id))
9a90: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
9aa0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
9ab0: 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f , "Resume sessio
9ac0: 6e 20 69 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f n id ", session_
9ad0: 69 64 2c 20 22 20 66 61 69 6c 65 64 22 2c 20 28 id, " failed", (
9ae0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 char *) NULL);.
9af0: 20 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 Tls_F
9b00: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
9b10: 74 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 tePtr);.
9b20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
9b30: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a RROR;..}. }..
9b40: 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a if (alpn) {.
9b50: 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 63 ./* Convert a Tc
9b60: 6c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 l list into a pr
9b70: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 otocol-list in w
9b80: 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 ire-format */..u
9b90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 nsigned char *pr
9ba0: 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 otos, *p;..unsig
9bb0: 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c ned int protos_l
9bc0: 65 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 en = 0;..int i,
9bd0: 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f len, cnt;..Tcl_O
9be0: 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 bj **list;...if
9bf0: 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 (Tcl_ListObjGetE
9c00: 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 lements(interp,
9c10: 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 alpn, &cnt, &lis
9c20: 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a t) != TCL_OK) {.
9c30: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
9c40: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
9c50: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
9c60: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
9c70: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d Determine the m
9c80: 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 emory required f
9c90: 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d or the protocol-
9ca0: 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 list */..for (i
9cb0: 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b = 0; i < cnt; i+
9cc0: 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 +) {.. Tcl_Ge
9cd0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c tStringFromObj(l
9ce0: 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 ist[i], &len);..
9cf0: 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 if (len > 25
9d00: 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 5) {...Tcl_Appen
9d10: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
9d20: 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e "ALPN protocol n
9d30: 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 ame too long", (
9d40: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
9d50: 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 .Tls_Free((char
9d60: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 *) statePtr);...
9d70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
9d80: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 ;.. }.. pr
9d90: 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 otos_len += 1 +
9da0: 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 len;..}.../* Bui
9db0: 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 ld the complete
9dc0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f protocol-list */
9dd0: 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c ..protos = ckall
9de0: 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a oc(protos_len);.
9df0: 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 ./* protocol-lis
9e00: 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d ts consist of 8-
9e10: 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 bit length-prefi
9e20: 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 xed, byte string
9e30: 73 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 s */..for (i = 0
9e40: 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 , p = protos; i
9e50: 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 < cnt; i++) {..
9e60: 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 char *str = T
9e70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
9e80: 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 Obj(list[i], &le
9e90: 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 n);.. *p++ =
9ea0: 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 len;.. memcpy
9eb0: 28 70 2c 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 (p, str, len);..
9ec0: 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d p += len;..}
9ed0: 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c .../* SSL_set_al
9ee0: 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 pn_protos makes
9ef0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 a copy of the pr
9f00: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 otocol-list */..
9f10: 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 /* Note: This fu
9f20: 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 73 65 73 nctions reverses
9f30: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 the return valu
9f40: 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a e convention */.
9f50: 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 .if (SSL_set_alp
9f60: 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 n_protos(statePt
9f70: 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 r->ssl, protos,
9f80: 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 protos_len)) {..
9f90: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
9fa0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61 sult(interp, "fa
9fb0: 69 6c 65 64 20 74 6f 20 73 65 74 20 41 4c 50 4e iled to set ALPN
9fc0: 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 protocols", (ch
9fd0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
9fe0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
9ff0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
a000: 20 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f ckfree(proto
a010: 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 s);.. return
a020: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
a030: 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f /* Store protoco
a040: 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 ls list */..stat
a050: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 ePtr->protos = p
a060: 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 rotos;..statePtr
a070: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 ->protos_len = p
a080: 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d rotos_len;. }
a090: 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 else {..statePt
a0a0: 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c r->protos = NULL
a0b0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f ;..statePtr->pro
a0c0: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 tos_len = 0;.
a0d0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 }.. /*.
a0e0: 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a * SSL Callbacks.
a0f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f */. SSL_
a100: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 set_app_data(sta
a110: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 tePtr->ssl, (voi
a120: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f d *)statePtr);./
a130: 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 * point back to
a140: 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 us */. SSL_se
a150: 74 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74 t_verify(statePt
a160: 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 r->ssl, verify,
a170: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b VerifyCallback);
a180: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
a190: 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 _info_callback(s
a1a0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 49 6e tatePtr->ctx, In
a1b0: 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 foCallback);..
a1c0: 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f /* Create Tcl_
a1d0: 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 Channel BIO Hand
a1e0: 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 ler */. state
a1f0: 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f Ptr->p_bio.= BIO
a200: 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74 _new_tcl(statePt
a210: 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b r, BIO_NOCLOSE);
a220: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 . statePtr->b
a230: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f io.= BIO_new(BIO
a240: 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 _f_ssl());..
a250: 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f if (server) {../
a260: 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63 * Server callbac
a270: 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 ks */..SSL_CTX_s
a280: 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 et_alpn_select_c
a290: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c b(statePtr->ctx,
a2a0: 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 ALPNCallback, (
a2b0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
a2c0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 ;..SSL_CTX_set_t
a2d0: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 lsext_servername
a2e0: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 _arg(statePtr->c
a2f0: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 tx, (void *)stat
a300: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f ePtr);..SSL_CTX_
a310: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 set_tlsext_serve
a320: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 rname_callback(s
a330: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e tatePtr->ctx, SN
a340: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c ICallback);..SSL
a350: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
a360: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 hello_cb(statePt
a370: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c r->ctx, HelloCal
a380: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
a390: 74 61 74 65 50 74 72 29 3b 0a 0a 09 73 74 61 74 tatePtr);...stat
a3a0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 ePtr->flags |= T
a3b0: 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 LS_TCL_SERVER;..
a3c0: 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 SSL_set_accept_s
a3d0: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 tate(statePtr->s
a3e0: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 sl);. } else
a3f0: 7b 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 {../* Session ca
a400: 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 ching */..SSL_CT
a410: 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 X_set_session_ca
a420: 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 che_mode(statePt
a430: 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 r->ctx, SSL_SESS
a440: 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 _CACHE_CLIENT |
a450: 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e SSL_SESS_CACHE_N
a460: 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 O_INTERNAL_STORE
a470: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 );..SSL_CTX_sess
a480: 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 _set_new_cb(stat
a490: 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 ePtr->ctx, Sessi
a4a0: 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 53 onCallback);...S
a4b0: 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 SL_set_connect_s
a4c0: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 tate(statePtr->s
a4d0: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 sl);. }. S
a4e0: 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 SL_set_bio(state
a4f0: 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 Ptr->ssl, stateP
a500: 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 tr->p_bio, state
a510: 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 Ptr->p_bio);.
a520: 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 BIO_set_ssl(sta
a530: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 tePtr->bio, stat
a540: 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e ePtr->ssl, BIO_N
a550: 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a OCLOSE);.. /*
a560: 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 . * End of S
a570: 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a SL Init. */.
a580: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
a590: 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f urning %s", Tcl_
a5a0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
a5b0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b tatePtr->self));
a5c0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
a5d0: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 lt(interp, (char
a5e0: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e *) Tcl_GetChann
a5f0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
a600: 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 >self), TCL_VOLA
a610: 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 TILE);.. retu
a620: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
a630: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
a640: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
a650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a690: 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 -. *. * Unimport
a6a0: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
a6b0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
a6c0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d s invoked to rem
a6d0: 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 ove the topmost
a6e0: 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a channel filter..
a6f0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
a700: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
a710: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
a720: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
a730: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 May modify the b
a740: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f ehavior of an IO
a750: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
a760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a7a0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
a7b0: 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 t.UnimportObjCmd
a7c0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
a7d0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
a7e0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
a7f0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
a800: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
a810: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
a820: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
a830: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
a840: 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 de on. */.. d
a850: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
a860: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
a870: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
a880: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
a890: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
a8a0: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 nel");..return T
a8b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
a8c0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
a8d0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
a8e0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
a8f0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 (objv[1]), NULL)
a900: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
a910: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
a920: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
a930: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
a940: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
a950: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
a960: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
a970: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
a980: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
a990: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 nnel(chan);..
a9a0: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
a9b0: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
a9c0: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
a9d0: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e ()) {..Tcl_Appen
a9e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
a9f0: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
aa00: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
aa10: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c Name(chan),..."\
aa20: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
aa30: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 nnel", NULL);..r
aa40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
aa50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
aa60: 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e Tcl_UnstackChann
aa70: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 el(interp, chan)
aa80: 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b == TCL_ERROR) {
aa90: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
aaa0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 OR;. }.. r
aab0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
aac0: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
aad0: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ntData;.}.../*.
aae0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
aaf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab20: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 ----. *. * CTX_I
ab30: 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 nit -- construct
ab40: 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 a SSL_CTX insta
ab50: 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 nce. *. * Result
ab60: 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 s:. *.A valid SS
ab70: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f L_CTX instance o
ab80: 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 r NULL.. *. * Si
ab90: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 de effects:. *.c
aba0: 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f onstructs SSL co
abb0: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 ntext (CTX). *.
abc0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
abd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ac00: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
ac10: 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e SSL_CTX *.CTX_In
ac20: 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 it(State *stateP
ac30: 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 tr, int isServer
ac40: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 , int proto, cha
ac50: 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 r *keyfile, char
ac60: 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 *certfile,.
ac70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
ac80: 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ey, unsigned cha
ac90: 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 r *cert, int key
aca0: 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c _len, int cert_l
acb0: 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c en, char *CAdir,
acc0: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c . char *CAfil
acd0: 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 e, char *ciphers
ace0: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 , char *ciphersu
acf0: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c ites, int level,
ad00: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 char *DHparams)
ad10: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 {. Tcl_Inter
ad20: 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 p *interp = stat
ad30: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
ad40: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d SSL_CTX *ctx =
ad50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 NULL;. Tcl_D
ad60: 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 String ds;. T
ad70: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a cl_DString ds1;.
ad80: 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b int off = 0;
ad90: 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 . int load_pr
ada0: 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 ivate_key;. c
adb0: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 onst SSL_METHOD
adc0: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 *method;.. dp
add0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
ade0: 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f .. if (!proto
adf0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
ae00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e esult(interp, "n
ae10: 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c o valid protocol
ae20: 20 73 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c selected", NULL
ae30: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
ae40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 . }.. /* c
ae50: 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 reate SSL contex
ae60: 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c t */.#if OPENSSL
ae70: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
ae80: 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c >= 0x10100000L |
ae90: 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c | defined(NO_SSL
aea0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
aeb0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 ENSSL_NO_SSL2).
aec0: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
aed0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
aee0: 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 SSL2)) {..Tcl_Ap
aef0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
af00: 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f p, "SSL2 protoco
af10: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
af20: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
af30: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
af40: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
af50: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 NO_SSL3) || defi
af60: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
af70: 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 SL3). if (ENA
af80: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
af90: 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 PROTO_SSL3)) {..
afa0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
afb0: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 (interp, "SSL3 p
afc0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
afd0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
afe0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
aff0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
b000: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c fined(NO_TLS1) |
b010: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
b020: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 L_NO_TLS1). i
b030: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
b040: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
b050: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
b060: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b070: 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c TLS 1.0 protocol
b080: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
b090: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
b0a0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
b0b0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
b0c0: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 O_TLS1_1) || def
b0d0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
b0e0: 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 TLS1_1). if (
b0f0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
b100: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 LS_PROTO_TLS1_1)
b110: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
b120: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 esult(interp, "T
b130: 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 LS 1.1 protocol
b140: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
b150: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
b160: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
b170: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
b180: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
b190: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
b1a0: 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 LS1_2). if (E
b1b0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
b1c0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 S_PROTO_TLS1_2))
b1d0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
b1e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
b1f0: 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.2 protocol n
b200: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
b210: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
b220: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
b230: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
b240: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e TLS1_3) || defin
b250: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
b260: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e S1_3). if (EN
b270: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
b280: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 _PROTO_TLS1_3))
b290: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
b2a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
b2b0: 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.3 protocol no
b2c0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
b2d0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
b2e0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
b2f0: 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f . switch (pro
b300: 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 to) {.#if OPENSS
b310: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
b320: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 < 0x10100000L &
b330: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 & !defined(NO_SS
b340: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L2) && !defined(
b350: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
b360: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
b370: 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f OTO_SSL2:..metho
b380: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 d = isServer ? S
b390: 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 SLv2_server_meth
b3a0: 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 od() : SSLv2_cli
b3b0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
b3c0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
b3d0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
b3e0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
b3f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 PENSSL_NO_SSL3)
b400: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
b410: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 SSL_NO_SSL3_METH
b420: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 OD). case TLS
b430: 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 _PROTO_SSL3:..me
b440: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
b450: 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d ? SSLv3_server_m
b460: 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f ethod() : SSLv3_
b470: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
b480: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
b490: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
b4a0: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 TLS1) && !define
b4b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
b4c0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
b4d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d PENSSL_NO_TLS1_M
b4e0: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 ETHOD). case
b4f0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a TLS_PROTO_TLS1:.
b500: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
b510: 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 er ? TLSv1_serve
b520: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 r_method() : TLS
b530: 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 v1_client_method
b540: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
b550: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
b560: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
b570: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
b580: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
b590: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
b5a0: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a _TLS1_1_METHOD).
b5b0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
b5c0: 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 TO_TLS1_1:..meth
b5d0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
b5e0: 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d TLSv1_1_server_m
b5f0: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f ethod() : TLSv1_
b600: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 1_client_method(
b610: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
b620: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
b630: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
b640: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
b650: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
b660: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
b670: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_2_METHOD).
b680: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
b690: 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f O_TLS1_2:..metho
b6a0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
b6b0: 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 LSv1_2_server_me
b6c0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 thod() : TLSv1_2
b6d0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
b6e0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
b6f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
b700: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 _TLS1_3) && !def
b710: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
b720: 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 TLS1_3). case
b730: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
b740: 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 3:../* Use the g
b750: 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e eneric method an
b760: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e d constraint ran
b770: 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 ge after context
b780: 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 is created */..
b790: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
b7a0: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d r ? TLS_server_m
b7b0: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c ethod() : TLS_cl
b7c0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
b7d0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 break;.#endif.
b7e0: 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e default:../* N
b7f0: 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 egotiate highest
b800: 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 available SSL/T
b810: 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d LS version */..m
b820: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
b830: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 ? TLS_server_me
b840: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 thod() : TLS_cli
b850: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 ent_method();.#i
b860: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
b870: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
b880: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 00000L && !defin
b890: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 ed(NO_SSL2) && !
b8a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
b8b0: 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d NO_SSL2)..off |=
b8c0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
b8d0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 TLS_PROTO_SSL2)
b8e0: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f ? 0 : SSL_OP_
b8f0: 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 NO_SSLv2);.#endi
b900: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
b910: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
b920: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
b930: 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e SL3)..off |= (EN
b940: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
b950: 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f _PROTO_SSL3) ?
b960: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 0 : SSL_OP_NO_S
b970: 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 SLv3);.#endif.#i
b980: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
b990: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
b9a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
b9b0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
b9c0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
b9d0: 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a TO_TLS1) ? 0 :
b9e0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
b9f0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
ba00: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
ba10: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
ba20: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
ba30: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
ba40: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
ba50: 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a TO_TLS1_1) ? 0 :
ba60: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
ba70: 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 _1);.#endif.#if
ba80: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
ba90: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
baa0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
bab0: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 2)..off |= (ENAB
bac0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
bad0: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 ROTO_TLS1_2) ? 0
bae0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
baf0: 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 v1_2);.#endif.#i
bb00: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
bb10: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
bb20: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
bb30: 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 1_3)..off |= (EN
bb40: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
bb50: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f _PROTO_TLS1_3) ?
bb60: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
bb70: 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a LSv1_3);.#endif.
bb80: 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 .break;. }..
bb90: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 ERR_clear_err
bba0: 6f 72 28 29 3b 0a 20 20 20 20 63 74 78 20 3d 20 or();. ctx =
bbb0: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 SSL_CTX_new(meth
bbc0: 6f 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 63 od);.. if (!c
bbd0: 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 tx) {..return(NU
bbe0: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 LL);. }..
bbf0: 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 if (getenv(SSLKE
bc00: 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 YLOGFILE)) {..SS
bc10: 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 L_CTX_set_keylog
bc20: 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b _callback(ctx, K
bc30: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a eyLogCallback);.
bc40: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 }..#if !defi
bc50: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
bc60: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
bc70: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
bc80: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 if (proto == T
bc90: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
bca0: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
bcb0: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f min_proto_versio
bcc0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
bcd0: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 RSION);..SSL_CTX
bce0: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 _set_max_proto_v
bcf0: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
bd00: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 _3_VERSION);.
bd10: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f }.#endif.. /
bd20: 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 * Force cipher s
bd30: 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 election order b
bd40: 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 y server */.
bd50: 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b if (!isServer) {
bd60: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 ..SSL_CTX_set_op
bd70: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
bd80: 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f P_CIPHER_SERVER_
bd90: 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 PREFERENCE);.
bda0: 20 7d 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f }.. SSL_CTX_
bdb0: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 set_app_data(ctx
bdc0: 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 , (void*)interp)
bdd0: 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 ;./* remember th
bde0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f e interpreter */
bdf0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
be00: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 _options(ctx, SS
be10: 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c L_OP_ALL);./* al
be20: 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 l SSL bug workar
be30: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c ounds */. SSL
be40: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
be50: 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 (ctx, off);../*
be60: 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c disable protocol
be70: 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 versions */.#if
be80: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
be90: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
bea0: 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 1000L. SSL_CT
beb0: 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 X_set_mode(ctx,
bec0: 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 SSL_MODE_AUTO_RE
bed0: 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 TRY);./* handle
bee0: 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 new handshakes i
bef0: 6e 20 62 61 63 6b 67 72 6f 75 6e 64 20 2a 2f 0a n background */.
bf00: 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 #endif. SSL_C
bf10: 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 TX_sess_set_cach
bf20: 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 e_size(ctx, 128)
bf30: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 ;.. /* Set us
bf40: 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 er defined ciphe
bf50: 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 rs, cipher suite
bf60: 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 s, and security
bf70: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 level */. if
bf80: 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c ((ciphers != NUL
bf90: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 L) && !SSL_CTX_s
bfa0: 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 et_cipher_list(c
bfb0: 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a tx, ciphers)) {.
bfc0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
bfd0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
bfe0: 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 et ciphers faile
bff0: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 d: No valid ciph
c000: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ers", (char *) N
c010: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
c020: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
c030: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
c040: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 }. if ((c
c050: 69 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e iphersuites != N
c060: 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 ULL) && !SSL_CTX
c070: 5f 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 _set_ciphersuite
c080: 73 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 s(ctx, ciphersui
c090: 74 65 73 29 29 20 7b 0a 09 20 20 20 20 54 63 6c tes)) {.. Tcl
c0a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
c0b0: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 terp, "Set ciphe
c0c0: 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a r suites failed:
c0d0: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 No valid cipher
c0e0: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c s", (char *) NUL
c0f0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
c100: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
c110: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 return NULL;.
c120: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 }.. /* Set
c130: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a security level *
c140: 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 /. if (level
c150: 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 > -1 && level <
c160: 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 6) {../* SSL_set
c170: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 _security_level
c180: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f */..SSL_CTX_set_
c190: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 security_level(c
c1a0: 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 tx, level);.
c1b0: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f }.. /* set so
c1c0: 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a me callbacks */.
c1d0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
c1e0: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 default_passwd_c
c1f0: 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 b(ctx, PasswordC
c200: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 allback);. SS
c210: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c L_CTX_set_defaul
c220: 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 t_passwd_cb_user
c230: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 data(ctx, (void
c240: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 *)statePtr);..
c250: 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 /* read a Diff
c260: 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d ie-Hellman param
c270: 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 eters file, or u
c280: 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 se the built-in
c290: 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 one */.#ifdef OP
c2a0: 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 ENSSL_NO_DH.
c2b0: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 if (DHparams !=
c2c0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
c2d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
c2e0: 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 , "DH parameter
c2f0: 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 support not avai
c300: 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 lable", (char *)
c310: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
c320: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
c330: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
c340: 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a #else. {..DH*
c350: 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 dh;..if (DHpara
c360: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 ms != NULL) {..
c370: 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 BIO *bio;..
c380: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
c390: 74 28 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f t(&ds);.. bio
c3a0: 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 = BIO_new_file(
c3b0: 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 F2N(DHparams, &d
c3c0: 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 s), "r");.. i
c3d0: 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c f (!bio) {...Tcl
c3e0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
c3f0: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 );...Tcl_AppendR
c400: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 esult(interp, "C
c410: 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 ould not find DH
c420: 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 parameters file
c430: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
c440: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 );...SSL_CTX_fre
c450: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e e(ctx);...return
c460: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 NULL;.. }...
c470: 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 dh = PEM_rea
c480: 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 d_bio_DHparams(b
c490: 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 io, NULL, NULL,
c4a0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f NULL);.. BIO_
c4b0: 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 free(bio);..
c4c0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
c4d0: 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 &ds);.. if (!
c4e0: 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 dh) {...Tcl_Appe
c4f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
c500: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 "Could not read
c510: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 DH parameters f
c520: 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 rom file", (char
c530: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
c540: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
c550: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
c560: 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a }..} else {.
c570: 09 20 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68 . dh = get_dh
c580: 50 61 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 Params();..}..SS
c590: 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 L_CTX_set_tmp_dh
c5a0: 28 63 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 (ctx, dh);..DH_f
c5b0: 72 65 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 ree(dh);. }.#
c5c0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 endif.. /* se
c5d0: 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 t our certificat
c5e0: 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 e */. load_pr
c5f0: 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 ivate_key = 0;.
c600: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 if (certfile
c610: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 != NULL) {..load
c620: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 _private_key = 1
c630: 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 ;...Tcl_DStringI
c640: 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 nit(&ds);...if (
c650: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 SSL_CTX_use_cert
c660: 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 ificate_file(ctx
c670: 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 , F2N(certfile,
c680: 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 &ds), SSL_FILETY
c690: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a PE_PEM) <= 0) {.
c6a0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
c6b0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
c6c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
c6d0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
c6e0: 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 to set certific
c6f0: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 ate file ", cert
c700: 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 file, ": ",....
c710: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 REASON(), (c
c720: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
c730: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 SSL_CTX_free(
c740: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ctx);.. retur
c750: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d n NULL;..}. }
c760: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 else if (cert !
c770: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f = NULL) {..load_
c780: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b private_key = 1;
c790: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 ..if (SSL_CTX_us
c7a0: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 e_certificate_AS
c7b0: 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e N1(ctx, cert_len
c7c0: 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a , cert) <= 0) {.
c7d0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
c7e0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
c7f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
c800: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
c810: 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 to set certific
c820: 61 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 ate: ",....
c830: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
c840: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
c850: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
c860: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
c870: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 LL;..}. } els
c880: 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 e {..certfile =
c890: 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f (char*)X509_get_
c8a0: 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c default_cert_fil
c8b0: 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 e();...if (SSL_C
c8c0: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 TX_use_certifica
c8d0: 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 te_file(ctx, cer
c8e0: 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 tfile, SSL_FILET
c8f0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b YPE_PEM) <= 0) {
c900: 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f .#if 0.. Tcl_
c910: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
c920: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ;.. Tcl_Appen
c930: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
c940: 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 "unable to use d
c950: 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 efault certifica
c960: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 te file ", certf
c970: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 ile, ": ",....
c980: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 REASON(), (ch
c990: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
c9a0: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
c9b0: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
c9c0: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d NULL;.#endif..}
c9d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 . }.. /* s
c9e0: 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b et our private k
c9f0: 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f ey */. if (lo
ca00: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 ad_private_key)
ca10: 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d {..if (keyfile =
ca20: 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d = NULL && key ==
ca30: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 NULL) {.. ke
ca40: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 yfile = certfile
ca50: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 ;..}...if (keyfi
ca60: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 le != NULL) {..
ca70: 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 /* get the pr
ca80: 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 ivate key associ
ca90: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 ated with this c
caa0: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 ertificate */..
cab0: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d if (keyfile =
cac0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 = NULL) {...keyf
cad0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a ile = certfile;.
cae0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
caf0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 (SSL_CTX_use_Pri
cb00: 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 vateKey_file(ctx
cb10: 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 , F2N(keyfile, &
cb20: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ds), SSL_FILETYP
cb30: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 E_PEM) <= 0) {..
cb40: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
cb50: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 (&ds);.../* flus
cb60: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 h the passphrase
cb70: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 which might be
cb80: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 left in the resu
cb90: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 lt */...Tcl_SetR
cba0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 esult(interp, NU
cbb0: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b LL, TCL_STATIC);
cbc0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
cbd0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
cbe0: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 ble to set publi
cbf0: 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 c key file ", ke
cc00: 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 yfile, " ",....
cc10: 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 REASON()
cc20: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
cc30: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
cc40: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
cc50: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 NULL;.. }..
cc60: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
cc70: 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 e(&ds);...} else
cc80: 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c if (key != NULL
cc90: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c ) {.. if (SSL
cca0: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 _CTX_use_Private
ccb0: 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 Key_ASN1(EVP_PKE
ccc0: 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c Y_RSA, ctx, key,
ccd0: 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b key_len) <= 0) {
cce0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ...Tcl_DStringFr
ccf0: 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c ee(&ds);.../* fl
cd00: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 ush the passphra
cd10: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 se which might b
cd20: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 e left in the re
cd30: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 sult */...Tcl_Se
cd40: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
cd50: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 NULL, TCL_STATIC
cd60: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 );...Tcl_AppendR
cd70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
cd80: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 nable to set pub
cd90: 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 lic key: ", REAS
cda0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
cdb0: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
cdc0: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
cdd0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
cde0: 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b ..}../* Now we k
cdf0: 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 now that a key a
ce00: 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 nd cert have bee
ce10: 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 n set against..
ce20: 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 * the SSL contex
ce30: 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 t */..if (!SSL_C
ce40: 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 TX_check_private
ce50: 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 _key(ctx)) {..
ce60: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
ce70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 lt(interp, "priv
ce80: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 ate key does not
ce90: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 match the certi
cea0: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 ficate public ke
ceb0: 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 y",.... (cha
cec0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
ced0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
cee0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
cef0: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a NULL;..}. }..
cf00: 20 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66 /* Set verif
cf10: 69 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 ication CAs */.
cf20: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
cf30: 69 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c it(&ds);. Tcl
cf40: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
cf50: 31 29 3b 0a 20 20 20 20 69 66 20 28 21 53 53 4c 1);. if (!SSL
cf60: 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 _CTX_load_verify
cf70: 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 _locations(ctx,
cf80: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 F2N(CAfile, &ds)
cf90: 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 , F2N(CAdir, &ds
cfa0: 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 1)) ||..!SSL_CTX
cfb0: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 _set_default_ver
cfc0: 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 ify_paths(ctx))
cfd0: 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 {.#if 0..Tcl_DSt
cfe0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
cff0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
d000: 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 &ds1);../* Don't
d010: 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 currently care
d020: 69 66 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f if this fails */
d030: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
d040: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 lt(interp, "SSL
d050: 64 65 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 default verify p
d060: 61 74 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 aths: ", REASON(
d070: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
d080: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
d090: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e (ctx);..return N
d0a0: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 ULL;.#endif.
d0b0: 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a }.. /* https:
d0c0: 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 //sourceforge.ne
d0d0: 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f t/p/tls/bugs/57/
d0e0: 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 */. /* XXX:T
d0f0: 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 ODO: Let the use
d100: 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 r supply values
d110: 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 here instead of
d120: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 something that e
d130: 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c xists on the fil
d140: 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 esystem */. i
d150: 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c f (CAfile != NUL
d160: 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 L) {..STACK_OF(X
d170: 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 509_NAME) *certN
d180: 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f ames = SSL_load_
d190: 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 client_CA_file(F
d1a0: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 2N(CAfile, &ds))
d1b0: 3b 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 ;..if (certNames
d1c0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
d1d0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 SSL_CTX_set_cli
d1e0: 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c ent_CA_list(ctx,
d1f0: 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a certNames);..}.
d200: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 }.. Tcl_D
d210: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
d220: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d230: 46 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 Free(&ds1);.
d240: 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a return ctx;.}...
d250: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
d260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d290: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 --------. *. * S
d2a0: 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 tatusObjCmd -- r
d2b0: 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 eturn certificat
d2c0: 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 e for connected
d2d0: 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 peer.. *. * Resu
d2e0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
d2f0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
d300: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
d310: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
d320: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
d330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d360: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
d370: 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 int.StatusObjCmd
d380: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
d390: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
d3a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
d3b0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
d3c0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
d3d0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
d3e0: 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 tr;. X509 *pe
d3f0: 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 er;. Tcl_Obj
d400: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c *objPtr;. Tcl
d410: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 _Channel chan;.
d420: 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c char *channel
d430: 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a Name, *ciphers;.
d440: 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 int mode;.
d450: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
d460: 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 char *proto;.
d470: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c unsigned int l
d480: 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 3b en;. int nid;
d490: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
d4a0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 77 alled");.. sw
d4b0: 69 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 itch (objc) {..c
d4c0: 61 73 65 20 32 3a 0a 09 20 20 20 20 63 68 61 6e ase 2:.. chan
d4d0: 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 nelName = Tcl_Ge
d4e0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
d4f0: 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 bjv[1], NULL);..
d500: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 break;...cas
d510: 65 20 33 3a 0a 09 20 20 20 20 69 66 20 28 21 73 e 3:.. if (!s
d520: 74 72 63 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 trcmp (Tcl_GetSt
d530: 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 ring (objv[1]),
d540: 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 "-local")) {...c
d550: 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c hannelName = Tcl
d560: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
d570: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 j(objv[2], NULL)
d580: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 ;...break;..
d590: 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 }.. /* else f
d5a0: 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20 all-through ...
d5b0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f */.#if defined(_
d5c0: 5f 47 4e 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f _GNUC__).. __
d5d0: 61 74 74 72 69 62 75 74 65 5f 5f 28 28 66 61 6c attribute__((fal
d5e0: 6c 74 68 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64 lthrough));.#end
d5f0: 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 if..default:..
d600: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 Tcl_WrongNumAr
d610: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
d620: 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 jv, "?-local? ch
d630: 61 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 annel");.. re
d640: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
d650: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 }.. chan
d660: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
d670: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c (interp, channel
d680: 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 Name, &mode);.
d690: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 if (chan == (T
d6a0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
d6b0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
d6c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
d6d0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f /* Make sure to
d6e0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
d6f0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
d700: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
d710: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
d720: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 chan);. if (T
d730: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
d740: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
d750: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
d760: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
d770: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
d780: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
d790: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
d7a0: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 han),..."\": not
d7b0: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
d7c0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
d7d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
d7e0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 . statePtr =
d7f0: 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 (State *) Tcl_Ge
d800: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 tChannelInstance
d810: 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 Data(chan);.
d820: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b if (objc == 2) {
d830: 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 ..peer = SSL_get
d840: 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 _peer_certificat
d850: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
d860: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
d870: 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 peer = SSL_get_c
d880: 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 ertificate(state
d890: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
d8a0: 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b . if (peer) {
d8b0: 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e ..objPtr = Tls_N
d8c0: 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 ewX509Obj(interp
d8d0: 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 , peer);..if (ob
d8e0: 6a 63 20 3d 3d 20 32 29 20 7b 20 58 35 30 39 5f jc == 2) { X509_
d8f0: 66 72 65 65 28 70 65 65 72 29 3b 20 7d 0a 20 20 free(peer); }.
d900: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 } else {..objP
d910: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
d920: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 Obj(0, NULL);.
d930: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 }.. /* Peer
d940: 20 63 65 72 74 20 63 68 61 69 6e 20 28 63 6c 69 cert chain (cli
d950: 65 6e 74 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 ent only) */.
d960: 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 29 2a STACK_OF(X509)*
d970: 20 73 73 6c 5f 63 65 72 74 73 20 3d 20 53 53 4c ssl_certs = SSL
d980: 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 5f 63 _get_peer_cert_c
d990: 68 61 69 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 hain(statePtr->s
d9a0: 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 21 70 65 sl);. if (!pe
d9b0: 65 72 20 26 26 20 28 73 73 6c 5f 63 65 72 74 73 er && (ssl_certs
d9c0: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 == NULL || sk_X
d9d0: 35 30 39 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 74 509_num(ssl_cert
d9e0: 73 29 20 3d 3d 20 30 29 29 20 7b 0a 09 72 65 74 s) == 0)) {..ret
d9f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
da00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 }.. /* Pee
da10: 72 20 6e 61 6d 65 20 66 72 6f 6d 20 63 65 72 74 r name from cert
da20: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 */. Tcl_List
da30: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
da40: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
da50: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
da60: 6a 28 22 70 65 65 72 6e 61 6d 65 22 2c 20 2d 31 j("peername", -1
da70: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
da80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
da90: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
daa0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
dab0: 6a 28 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e j(SSL_get0_peern
dac0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ame(statePtr->ss
dad0: 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 l), -1));.. T
dae0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
daf0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
db00: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
db10: 74 72 69 6e 67 4f 62 6a 28 22 73 62 69 74 73 22 tringObj("sbits"
db20: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
db30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
db40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
db50: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
db60: 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 bj(SSL_get_ciphe
db70: 72 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d r_bits(statePtr-
db80: 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a >ssl, NULL)));..
db90: 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 ciphers = (c
dba0: 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 har*)SSL_get_cip
dbb0: 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 her(statePtr->ss
dbc0: 6c 29 3b 0a 20 20 20 20 69 66 20 28 28 63 69 70 l);. if ((cip
dbd0: 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 hers != NULL) &&
dbe0: 20 28 73 74 72 63 6d 70 28 63 69 70 68 65 72 73 (strcmp(ciphers
dbf0: 2c 20 22 28 4e 4f 4e 45 29 22 29 20 21 3d 20 30 , "(NONE)") != 0
dc00: 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 )) {..Tcl_ListOb
dc10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
dc20: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
dc30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
dc40: 22 63 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a "cipher", -1));.
dc50: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
dc60: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
dc70: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
dc80: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 wStringObj(SSL_g
dc90: 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 et_cipher(stateP
dca0: 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a tr->ssl), -1));.
dcb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 }.. /* Ve
dcc0: 72 69 66 79 20 74 68 65 20 58 35 30 39 20 63 65 rify the X509 ce
dcd0: 72 74 69 66 69 63 61 74 65 20 70 72 65 73 65 6e rtificate presen
dce0: 74 65 64 20 62 79 20 74 68 65 20 70 65 65 72 20 ted by the peer
dcf0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f */. Tcl_ListO
dd00: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
dd10: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
dd20: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
dd30: 28 22 76 65 72 69 66 69 63 61 74 69 6f 6e 22 2c ("verification",
dd40: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
dd50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
dd60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
dd70: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 tr,..Tcl_NewStri
dd80: 6e 67 4f 62 6a 28 58 35 30 39 5f 76 65 72 69 66 ngObj(X509_verif
dd90: 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 y_cert_error_str
dda0: 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 ing(SSL_get_veri
ddb0: 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 fy_result(stateP
ddc0: 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 29 3b tr->ssl)), -1));
ddd0: 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 .. /* Report
dde0: 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f the selected pro
ddf0: 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c tocol as a resul
de00: 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 t of the negotia
de10: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f tion */. SSL_
de20: 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 get0_alpn_select
de30: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ed(statePtr->ssl
de40: 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b , &proto, &len);
de50: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
de60: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
de70: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
de80: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
de90: 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 alpn", -1));.
dea0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
deb0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
dec0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
ded0: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 wStringObj((char
dee0: 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 *)proto, (int)
def0: 6c 65 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c len));. Tcl_L
df00: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
df10: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
df20: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
df30: 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c gObj("protocol",
df40: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
df50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
df60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
df70: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
df80: 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 gObj(SSL_get_ver
df90: 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 sion(statePtr->s
dfa0: 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 sl), -1));..
dfb0: 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e /* Valid for non
dfc0: 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 -RSA signature a
dfd0: 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 nd TLS 1.3 */.
dfe0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
dff0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
e000: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
e010: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 67 ewStringObj("sig
e020: 6e 61 74 75 72 65 5f 68 61 73 68 22 2c 20 2d 31 nature_hash", -1
e030: 29 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 ));. if (objc
e040: 20 3d 3d 20 32 20 3f 20 53 53 4c 5f 67 65 74 5f == 2 ? SSL_get_
e050: 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e peer_signature_n
e060: 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c id(statePtr->ssl
e070: 2c 20 26 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65 , &nid) : SSL_ge
e080: 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 t_signature_nid(
e090: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
e0a0: 6e 69 64 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 nid)) {..Tcl_Lis
e0b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
e0c0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
e0d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
e0e0: 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 bj(OBJ_nid2ln(ni
e0f0: 64 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 d), -1));. }
e100: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 else {..Tcl_List
e110: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
e120: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
e130: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
e140: 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 j("", -1));.
e150: 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 }. Tcl_ListOb
e160: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
e170: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
e180: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
e190: 22 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 22 "signature_type"
e1a0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 , -1));. if (
e1b0: 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 53 53 4c 5f objc == 2 ? SSL_
e1c0: 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 get_peer_signatu
e1d0: 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 re_type_nid(stat
e1e0: 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 ePtr->ssl, &nid)
e1f0: 20 3a 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 : SSL_get_signa
e200: 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 ture_type_nid(st
e210: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
e220: 64 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f d)) {..Tcl_ListO
e230: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e240: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e250: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e260: 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 (OBJ_nid2ln(nid)
e270: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c , -1));. } el
e280: 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 se {..Tcl_ListOb
e290: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
e2a0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
e2b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
e2c0: 22 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a "", -1));. }.
e2d0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
e2e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
e2f0: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
e300: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e n TCL_OK;..clien
e310: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
e320: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ta;.}.../*. *---
e330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e370: 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f . *. * Connectio
e380: 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 nInfoObjCmd -- r
e390: 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e eturn connection
e3a0: 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 info from OpenS
e3b0: 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 SL.. *. * Result
e3c0: 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 s:. *.A list of
e3d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a connection info.
e3e0: 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *----------
e3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
e430: 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 tatic int Connec
e440: 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 tionInfoObjCmd(C
e450: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
e460: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
e470: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
e480: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
e490: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
e4a0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
e4b0: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
e4c0: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
e4d0: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 on. */. Stat
e4e0: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a e *statePtr;../*
e4f0: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f client state fo
e500: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a r ssl socket */.
e510: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
e520: 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 Ptr;. const S
e530: 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e SL *ssl;. con
e540: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 st SSL_CIPHER *c
e550: 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 ipher;. const
e560: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 SSL_SESSION *se
e570: 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 ssion;. const
e580: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
e590: 70 72 6f 74 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 proto;. long
e5a0: 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f mode;.. if (o
e5b0: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
e5c0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
e5d0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
e5e0: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
e5f0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
e600: 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d }.. chan =
e610: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
e620: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
e630: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
e640: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c v[1], NULL), NUL
e650: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
e660: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
e670: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
e680: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
e690: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
e6a0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
e6b0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
e6c0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
e6d0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
e6e0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
e6f0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
e700: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
e710: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
e720: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
e730: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
e740: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
e750: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
e760: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c elName(chan), "\
e770: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
e780: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 nnel", NULL);..r
e790: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
e7a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a ;. }.. obj
e7b0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
e7c0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a tObj(0, NULL);..
e7d0: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f /* Connectio
e7e0: 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 n info */. st
e7f0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
e800: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c *)Tcl_GetChannel
e810: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
e820: 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 n);. ssl = st
e830: 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 atePtr->ssl;.
e840: 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c if (ssl != NULL
e850: 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 ) {../* connecti
e860: 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 54 63 6c on state */..Tcl
e870: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
e880: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
e890: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
e8a0: 69 6e 67 4f 62 6a 28 22 73 74 61 74 65 22 2c 20 ingObj("state",
e8b0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
e8c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e8d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e8e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e8f0: 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e (SSL_state_strin
e900: 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 g_long(ssl), -1)
e910: 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 );.../* Get SNI
e920: 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65 72 requested server
e930: 20 6e 61 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 name */..Tcl_Li
e940: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
e950: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
e960: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
e970: 4f 62 6a 28 22 73 65 72 76 65 72 6e 61 6d 65 22 Obj("servername"
e980: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
e990: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
e9a0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
e9b0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
e9c0: 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 bj(SSL_get_serve
e9d0: 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 rname(ssl, TLSEX
e9e0: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f T_NAMETYPE_host_
e9f0: 6e 61 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f name), -1));.../
ea00: 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a * Get protocol *
ea10: 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
ea20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
ea30: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
ea40: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 NewStringObj("pr
ea50: 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 09 otocol", -1));..
ea60: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
ea70: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
ea80: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
ea90: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 StringObj(SSL_ge
eaa0: 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 t_version(ssl),
eab0: 2d 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 -1));.../* Reneg
eac0: 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 otiation allowed
ead0: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
eae0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
eaf0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
eb00: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
eb10: 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20 renegotiation",
eb20: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
eb30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
eb40: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
eb50: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
eb60: 28 0a 09 20 20 20 20 53 53 4c 5f 67 65 74 5f 73 (.. SSL_get_s
eb70: 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 ecure_renegotiat
eb80: 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 ion_support(ssl)
eb90: 20 3f 20 22 73 75 70 70 6f 72 74 65 64 22 20 3a ? "supported" :
eba0: 20 22 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 "not supported"
ebb0: 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 , -1));.../* Get
ebc0: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 security level
ebd0: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
ebe0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
ebf0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
ec00: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
ec10: 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 2d ecuritylevel", -
ec20: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
ec30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
ec40: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
ec50: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c cl_NewIntObj(SSL
ec60: 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _get_security_le
ec70: 76 65 6c 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a vel(ssl)));.../*
ec80: 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f Session info */
ec90: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
eca0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
ecb0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
ecc0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 ewStringObj("ses
ecd0: 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d 31 sion_reused", -1
ece0: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
ecf0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
ed00: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
ed10: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 l_NewBooleanObj(
ed20: 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 SSL_session_reus
ed30: 65 64 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 ed(ssl)));.../*
ed40: 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a Is server info *
ed50: 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
ed60: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
ed70: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
ed80: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 73 NewStringObj("is
ed90: 5f 73 65 72 76 65 72 22 2c 20 2d 31 29 29 3b 0a _server", -1));.
eda0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
edb0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
edc0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
edd0: 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f wBooleanObj(SSL_
ede0: 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 29 is_server(ssl)))
edf0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
ee00: 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 Cipher info */.
ee10: 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f cipher = SSL_
ee20: 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 get_current_ciph
ee30: 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 er(ssl);. if
ee40: 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 (cipher != NULL)
ee50: 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 {..char buf[BUF
ee60: 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 SIZ] = {0};..int
ee70: 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b bits, alg_bits;
ee80: 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ...Tcl_ListObjAp
ee90: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
eea0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
eeb0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 NewStringObj("ci
eec0: 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 pher", -1));..Tc
eed0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
eee0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
eef0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
ef00: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 ringObj(SSL_CIPH
ef10: 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 ER_get_name(ciph
ef20: 65 72 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f er), -1));..Tcl_
ef30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
ef40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
ef50: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
ef60: 6e 67 4f 62 6a 28 22 73 74 61 6e 64 61 72 64 5f ngObj("standard_
ef70: 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 name", -1));..Tc
ef80: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
ef90: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
efa0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
efb0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 ringObj(SSL_CIPH
efc0: 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 ER_standard_name
efd0: 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a (cipher), -1));.
efe0: 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 ..bits = SSL_CIP
eff0: 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 HER_get_bits(cip
f000: 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b her, &alg_bits);
f010: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
f020: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f030: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f040: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 62 69 74 ewStringObj("bit
f050: 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c s", -1));..Tcl_L
f060: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f070: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f080: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
f090: 6a 28 62 69 74 73 29 29 3b 0a 09 54 63 6c 5f 4c j(bits));..Tcl_L
f0a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f0b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f0c0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
f0d0: 67 4f 62 6a 28 22 73 65 63 72 65 74 5f 62 69 74 gObj("secret_bit
f0e0: 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c s", -1));..Tcl_L
f0f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f100: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f110: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
f120: 6a 28 61 6c 67 5f 62 69 74 73 29 29 3b 0a 09 2f j(alg_bits));../
f130: 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 * alg_bits is ac
f140: 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 tual key secret
f150: 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 bits. If use bit
f160: 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c s and secret (al
f170: 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 gorithm) bits di
f180: 66 66 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 ffer,.
f190: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 the rest of the
f1a0: 20 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c bits are fixed,
f1b0: 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 i.e. for limite
f1c0: 64 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 d export ciphers
f1d0: 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a (bits < 56) */.
f1e0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
f1f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f200: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f210: 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 5f wStringObj("min_
f220: 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a version", -1));.
f230: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
f240: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f250: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f260: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 wStringObj(SSL_C
f270: 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f IPHER_get_versio
f280: 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b n(cipher), -1));
f290: 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 .../* Get OpenSS
f2a0: 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e L-specific ID, n
f2b0: 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 54 ot IANA ID */..T
f2c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
f2d0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
f2e0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
f2f0: 74 72 69 6e 67 4f 62 6a 28 22 69 64 22 2c 20 2d tringObj("id", -
f300: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
f310: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
f320: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
f330: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e cl_NewIntObj((in
f340: 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 t) SSL_CIPHER_ge
f350: 74 5f 69 64 28 63 69 70 68 65 72 29 29 29 3b 0a t_id(cipher)));.
f360: 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 ..if (SSL_CIPHER
f370: 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 _description(cip
f380: 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 her, buf, sizeof
f390: 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 (buf)) != NULL)
f3a0: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
f3b0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f3c0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f3d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
f3e0: 28 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 ("description",
f3f0: 2d 31 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c -1));.. Tcl_L
f400: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f410: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f420: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
f430: 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a gObj(buf, -1));.
f440: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
f450: 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f Session info */
f460: 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 . session = S
f470: 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 SL_get_session(s
f480: 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65 73 sl);. if (ses
f490: 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a sion != NULL) {.
f4a0: 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 .const unsigned
f4b0: 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 char *ticket;..s
f4c0: 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 ize_t len2;..uns
f4d0: 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a igned int ulen;.
f4e0: 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 .const unsigned
f4f0: 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 char *session_id
f500: 3b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 53 ;..char buffer[S
f510: 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 SL_MAX_MASTER_KE
f520: 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 Y_LENGTH];.../*
f530: 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 Report the selec
f540: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 ted protocol as
f550: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 a result of the
f560: 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e ALPN negotiation
f570: 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e */..SSL_SESSION
f580: 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 _get0_alpn_selec
f590: 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 ted(session, &pr
f5a0: 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 oto, &len2);..Tc
f5b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
f5c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
f5d0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
f5e0: 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 ringObj("alpn",
f5f0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
f600: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f610: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f620: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
f630: 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 ((char *)proto,
f640: 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 (int) len2));...
f650: 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 /* Resumable ses
f660: 73 69 6f 6e 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 sion */..Tcl_Lis
f670: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
f680: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
f690: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
f6a0: 62 6a 28 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 bj("resumable",
f6b0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
f6c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f6d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f6e0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 Tcl_NewIntObj(SS
f6f0: 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 L_SESSION_is_res
f700: 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 umable(session))
f710: 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
f720: 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f start time (seco
f730: 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 nds since epoch)
f740: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
f750: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
f760: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
f770: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
f780: 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 2d 31 29 start_time", -1)
f790: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
f7a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f7b0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f7c0: 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f _NewLongObj(SSL_
f7d0: 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 SESSION_get_time
f7e0: 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f (session)));.../
f7f0: 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 * Timeout value
f800: 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 - SSL_CTX_get_ti
f810: 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 meout (in second
f820: 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f s) */..Tcl_ListO
f830: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f840: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f850: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
f860: 28 22 74 69 6d 65 6f 75 74 22 2c 20 2d 31 29 29 ("timeout", -1))
f870: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
f880: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
f890: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
f8a0: 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 NewLongObj(SSL_S
f8b0: 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f ESSION_get_timeo
f8c0: 75 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a ut(session)));..
f8d0: 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b ./* Session tick
f8e0: 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 et lifetime hint
f8f0: 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f (in seconds) */
f900: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
f910: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f920: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f930: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6c 69 66 ewStringObj("lif
f940: 65 74 69 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 etime", -1));..T
f950: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
f960: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
f970: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c objPtr, Tcl_NewL
f980: 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 ongObj(SSL_SESSI
f990: 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 ON_get_ticket_li
f9a0: 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 fetime_hint(sess
f9b0: 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 ion)));.../* Ses
f9c0: 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 73 65 73 73 sion id */..sess
f9d0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 ion_id = SSL_SES
f9e0: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 SION_get_id(sess
f9f0: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 54 63 ion, &ulen);..Tc
fa00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
fa10: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
fa20: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
fa30: 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e ringObj("session
fa40: 5f 69 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c _id", -1));..Tcl
fa50: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fa60: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fa70: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 jPtr, Tcl_NewByt
fa80: 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f eArrayObj(sessio
fa90: 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e n_id, (int) ulen
faa0: 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e ));.../* Session
fab0: 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 ticket - client
fac0: 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 only */..SSL_SE
fad0: 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 SSION_get0_ticke
fae0: 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b t(session, &tick
faf0: 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c et, &len2);..Tcl
fb00: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fb10: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fb20: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
fb30: 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f ingObj("session_
fb40: 74 69 63 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 09 ticket", -1));..
fb50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
fb60: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
fb70: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
fb80: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 ByteArrayObj(tic
fb90: 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 ket, (int) len2)
fba0: 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 );.../* Ticket a
fbb0: 70 70 20 64 61 74 61 20 2a 2f 0a 09 53 53 4c 5f pp data */..SSL_
fbc0: 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 SESSION_get0_tic
fbd0: 6b 65 74 5f 61 70 70 64 61 74 61 28 73 65 73 73 ket_appdata(sess
fbe0: 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
fbf0: 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f en2);..Tcl_ListO
fc00: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
fc10: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
fc20: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
fc30: 28 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 ("ticket_app_dat
fc40: 61 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c a", -1));..Tcl_L
fc50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
fc60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
fc70: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 tr, Tcl_NewByteA
fc80: 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 rrayObj(ticket,
fc90: 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 (int) len2));...
fca0: 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 /* Get master ke
fcb0: 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c y */..len2 = SSL
fcc0: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 _SESSION_get_mas
fcd0: 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c ter_key(session,
fce0: 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 buffer, SSL_MAX
fcf0: 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 _MASTER_KEY_LENG
fd00: 54 48 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 TH);..Tcl_ListOb
fd10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
fd20: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
fd30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
fd40: 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 2d 31 "master_key", -1
fd50: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
fd60: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
fd70: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
fd80: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 l_NewByteArrayOb
fd90: 6a 28 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 j(buffer, (int)
fda0: 6c 65 6e 32 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 len2));. }..
fdb0: 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f /* Compressio
fdc0: 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 n info */. if
fdd0: 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b (ssl != NULL) {
fde0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c .#ifdef HAVE_SSL
fdf0: 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f _COMPRESSION..co
fe00: 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 nst COMP_METHOD
fe10: 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 *comp, *expn;..c
fe20: 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 omp = SSL_get_cu
fe30: 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f rrent_compressio
fe40: 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 n(ssl);..expn =
fe50: 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f SSL_get_current_
fe60: 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a expansion(ssl);.
fe70: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
fe80: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
fe90: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
fea0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d ewStringObj("com
feb0: 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b pression", -1));
fec0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
fed0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
fee0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
fef0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 6f 6d 70 ewStringObj(comp
ff00: 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f ? SSL_COMP_get_
ff10: 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 4e 4f name(comp) : "NO
ff20: 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f NE", -1));..Tcl_
ff30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
ff40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
ff50: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
ff60: 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e ngObj("expansion
ff70: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
ff80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
ff90: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
ffa0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
ffb0: 4f 62 6a 28 65 78 70 6e 20 3f 20 53 53 4c 5f 43 Obj(expn ? SSL_C
ffc0: 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 OMP_get_name(exp
ffd0: 6e 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 n) : "NONE", -1)
ffe0: 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 4c 69 );.#else..Tcl_Li
fff0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
10000 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
10010 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
10020 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e Obj("compression
10030 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
10040 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
10050 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
10060 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
10070 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 Obj("NONE", -1))
10080 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
10090 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
100a0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
100b0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 NewStringObj("ex
100c0 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a pansion", -1));.
100d0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
100e0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
100f0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
10100 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 wStringObj("NONE
10110 22 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ", -1));.#endif.
10120 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
10130 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 rver info */.
10140 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f mode = SSL_CTX_
10150 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 get_session_cach
10160 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d e_mode(statePtr-
10170 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 6d >ctx);. if (m
10180 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 ode & SSL_SESS_C
10190 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 70 72 6f ACHE_OFF) {..pro
101a0 74 6f 20 3d 20 22 6f 66 66 22 3b 0a 20 20 20 20 to = "off";.
101b0 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 } else if (mode
101c0 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
101d0 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 70 72 6f 74 _CLIENT) {..prot
101e0 6f 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 20 20 o = "client";.
101f0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 } else if (mod
10200 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 e & SSL_SESS_CAC
10210 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 70 72 HE_SERVER) {..pr
10220 6f 74 6f 20 3d 20 22 73 65 72 76 65 72 22 3b 0a oto = "server";.
10230 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6d } else if (m
10240 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 ode & SSL_SESS_C
10250 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 70 72 ACHE_BOTH) {..pr
10260 6f 74 6f 20 3d 20 22 62 6f 74 68 22 3b 0a 20 20 oto = "both";.
10270 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 72 6f 74 } else {..prot
10280 6f 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 o = "unknown";.
10290 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 }. Tcl_Lis
102a0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
102b0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
102c0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
102d0 62 6a 28 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 bj("session_cach
102e0 65 5f 6d 6f 64 65 22 2c 20 2d 31 29 29 3b 0a 20 e_mode", -1));.
102f0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
10300 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10310 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
10320 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
10330 74 6f 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 to, -1));.. T
10340 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
10350 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
10360 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
10370 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 OK;..clientData
10380 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a = clientData;.}.
10390 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
103a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
103e0 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d VersionObjCmd -
103f0 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e - return version
10400 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 string from Ope
10410 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 nSSL.. *. * Resu
10420 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
10430 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
10440 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
10450 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
10460 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
10470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
104a0 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
104b0 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d int.VersionObjCm
104c0 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
104d0 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
104e0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
104f0 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
10500 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
10510 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
10520 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 Ptr;.. dprint
10530 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
10540 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
10550 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e ewStringObj(OPEN
10560 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 SSL_VERSION_TEXT
10570 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53 , -1);. Tcl_S
10580 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
10590 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 rp, objPtr);..
105a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
105b0 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
105c0 6c 69 65 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63 lientData;..objc
105d0 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d = objc;..objv =
105e0 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a objv;.}.../*. *
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10630 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 ---. *. * MiscOb
10640 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d jCmd -- misc com
10650 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 mands. *. * Resu
10660 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
10670 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
10680 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
10690 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
106a0 2a 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
106f0 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 int.MiscObjCmd(C
10700 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
10710 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
10720 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
10730 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
10740 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
10750 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 static const ch
10760 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 ar *commands []
10770 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 = { "req", "strr
10780 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 eq", NULL };.
10790 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 enum command {
107a0 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c C_REQ, C_STRREQ,
107b0 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 C_DUMMY };.
107c0 69 6e 74 20 63 6d 64 2c 20 69 73 53 74 72 3b 0a int cmd, isStr;.
107d0 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b char buffer[
107e0 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72 16384];.. dpr
107f0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
10800 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 . if (objc <
10810 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
10820 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
10830 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d , objv, "subcomm
10840 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 and ?args?");..r
10850 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
10860 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 . }. if (T
10870 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f cl_GetIndexFromO
10880 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
10890 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 1], commands, "c
108a0 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 63 6d 64 29 ommand", 0,&cmd)
108b0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
108c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
108d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73 53 74 . }.. isSt
108e0 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 r = (cmd == C_ST
108f0 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 RREQ);. switc
10900 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 h ((enum command
10910 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 ) cmd) {..case C
10920 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 _REQ:..case C_ST
10930 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 RREQ: {.. EVP
10940 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c _PKEY *pkey=NULL
10950 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 ;.. X509 *cer
10960 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 t=NULL;.. X50
10970 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 9_NAME *name=NUL
10980 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 L;.. Tcl_Obj
10990 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 69 6e **listv;.. in
109a0 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 t listc,i;...
109b0 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a BIO *out=NULL;.
109c0 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d .. char *k_C=
109d0 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c "",*k_ST="",*k_L
109e0 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f ="",*k_O="",*k_O
109f0 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b U="",*k_CN="",*k
10a00 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 _Email="";..
10a10 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 char *keyout,*pe
10a20 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 mout,*str;..
10a30 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 int keysize,seri
10a40 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a al=0,days=365;..
10a50 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
10a60 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
10a70 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 0000000L.. BI
10a80 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c GNUM *bne = NULL
10a90 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 ;.. RSA *rsa
10aa0 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 = NULL;.#else..
10ab0 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 EVP_PKEY_CTX
10ac0 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e *ctx = NULL;.#en
10ad0 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f dif... if ((o
10ae0 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e bjc<5) || (objc>
10af0 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 6)) {...Tcl_Wron
10b00 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
10b10 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 2, objv, "keysi
10b20 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 ze keyfile certf
10b30 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 ile ?info?");...
10b40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
10b50 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 ;.. }... i
10b60 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
10b70 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
10b80 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 v[2], &keysize)
10b90 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 != TCL_OK) {...r
10ba0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
10bb0 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 .. }.. key
10bc0 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e out=Tcl_GetStrin
10bd0 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 g(objv[3]);..
10be0 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 pemout=Tcl_GetS
10bf0 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a tring(objv[4]);.
10c00 09 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 . if (isStr)
10c10 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 {...Tcl_SetVar(i
10c20 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c nterp,keyout,"",
10c30 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 0);...Tcl_SetVar
10c40 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 (interp,pemout,"
10c50 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 ",0);.. }...
10c60 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 if (objc>=6)
10c70 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 {...if (Tcl_List
10c80 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 ObjGetElements(i
10c90 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a nterp, objv[5],.
10ca0 09 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 ...&listc, &list
10cb0 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a v) != TCL_OK) {.
10cc0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
10cd0 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 _ERROR;...}....i
10ce0 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 f ((listc%2) !=
10cf0 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 0) {... Tcl_S
10d00 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
10d10 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 "Information lis
10d20 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e t must have even
10d30 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d number of argum
10d40 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ents",NULL);...
10d50 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
10d60 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 ROR;...}...for (
10d70 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b i=0; i<listc; i+
10d80 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d =2) {... str=
10d90 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
10da0 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 stv[i]);... i
10db0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 f (strcmp(str,"d
10dc0 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 ays")==0) {....i
10dd0 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
10de0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 mObj(interp,list
10df0 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 v[i+1],&days)!=T
10e00 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 CL_OK).... re
10e10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
10e20 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
10e30 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 (strcmp(str,"ser
10e40 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 ial")==0) {....i
10e50 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
10e60 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 mObj(interp,list
10e70 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 v[i+1],&serial)!
10e80 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 =TCL_OK)....
10e90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
10ea0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
10eb0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 f (strcmp(str,"C
10ec0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d ")==0) {....k_C=
10ed0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
10ee0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
10ef0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
10f00 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 mp(str,"ST")==0)
10f10 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 {....k_ST=Tcl_G
10f20 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
10f30 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
10f40 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
10f50 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 r,"L")==0) {....
10f60 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e k_L=Tcl_GetStrin
10f70 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
10f80 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
10f90 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d strcmp(str,"O")=
10fa0 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c =0) {....k_O=Tcl
10fb0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
10fc0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
10fd0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
10fe0 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a str,"OU")==0) {.
10ff0 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 ...k_OU=Tcl_GetS
11000 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
11010 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
11020 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
11030 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f CN")==0) {....k_
11040 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 CN=Tcl_GetString
11050 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
11060 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
11070 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c trcmp(str,"Email
11080 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d ")==0) {....k_Em
11090 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e ail=Tcl_GetStrin
110a0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
110b0 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
110c0 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
110d0 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 nterp,"Unknown p
110e0 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b arameter",NULL);
110f0 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ....return TCL_E
11100 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 RROR;... }...
11110 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 }.. }..#if OP
11120 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
11130 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
11140 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 0L.. bne = BN
11150 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 _new();.. rsa
11160 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 = RSA_new();..
11170 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b pkey = EVP_PK
11180 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 EY_new();.. i
11190 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c f (bne == NULL |
111a0 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c | rsa == NULL ||
111b0 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c pkey == NULL ||
111c0 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e !BN_set_word(bn
111d0 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 e,RSA_F4) ||...!
111e0 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 RSA_generate_key
111f0 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 _ex(rsa, keysize
11200 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 , bne, NULL) ||
11210 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e !EVP_PKEY_assign
11220 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 _RSA(pkey, rsa))
11230 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 {...EVP_PKEY_fr
11240 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 ee(pkey);.../* R
11250 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 SA_free(rsa); fr
11260 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f eed by EVP_PKEY_
11270 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 free */...BN_fre
11280 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 e(bne);.#else..
11290 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 pkey = EVP_RS
112a0 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 A_gen((unsigned
112b0 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 int) keysize);..
112c0 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b ctx = EVP_PK
112d0 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c EY_CTX_new(pkey,
112e0 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 NULL);.. if (
112f0 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 pkey == NULL ||
11300 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 ctx == NULL || !
11310 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f EVP_PKEY_keygen_
11320 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 init(ctx) ||...!
11330 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 EVP_PKEY_CTX_set
11340 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 _rsa_keygen_bits
11350 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c (ctx, keysize) |
11360 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 | !EVP_PKEY_keyg
11370 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 en(ctx, &pkey))
11380 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 {...EVP_PKEY_fre
11390 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 e(pkey);...EVP_P
113a0 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 KEY_CTX_free(ctx
113b0 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f );.#endif...Tcl_
113c0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
113d0 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 ,"Error generati
113e0 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c ng private key",
113f0 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 NULL);...return
11400 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
11410 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 } else {...if (i
11420 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 sStr) {... ou
11430 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
11440 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 mem());... PE
11450 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 M_write_bio_Priv
11460 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c ateKey(out,pkey,
11470 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c NULL,NULL,0,NULL
11480 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d ,NULL);... i=
11490 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 BIO_read(out,buf
114a0 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 fer,sizeof(buffe
114b0 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 r)-1);... i=(
114c0 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 i<0) ? 0 : i;...
114d0 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c buffer[i]='\
114e0 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 0';... Tcl_Se
114f0 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f tVar(interp,keyo
11500 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 ut,buffer,0);...
11510 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 BIO_flush(ou
11520 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 t);... BIO_fr
11530 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 ee(out);...} els
11540 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 e {... out=BI
11550 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 O_new(BIO_s_file
11560 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 ());... BIO_w
11570 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 rite_filename(ou
11580 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 t,keyout);...
11590 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 PEM_write_bio_P
115a0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b rivateKey(out,pk
115b0 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e ey,NULL,NULL,0,N
115c0 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 ULL,NULL);...
115d0 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 /* PEM_write_bi
115e0 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 o_RSAPrivateKey(
115f0 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 out, rsa, NULL,
11600 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e NULL, 0, NULL, N
11610 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 ULL); */... B
11620 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 IO_free_all(out)
11630 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 ;.. .}....if ((c
11640 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d ert=X509_new())=
11650 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 =NULL) {... T
11660 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
11670 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 erp,"Error gener
11680 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 ating certificat
11690 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 e request",NULL)
116a0 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 ;... EVP_PKEY
116b0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 _free(pkey);.#if
116c0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
116d0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
116e0 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 0000L... BN_f
116f0 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 ree(bne);.#endif
11700 0a 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 ... return(TC
11710 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 L_ERROR);...}...
11720 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f .X509_set_versio
11730 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e n(cert,2);...ASN
11740 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 1_INTEGER_set(X5
11750 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 09_get_serialNum
11760 62 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c ber(cert),serial
11770 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 );...X509_gmtime
11780 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e _adj(X509_getm_n
11790 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 otBefore(cert),0
117a0 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 );...X509_gmtime
117b0 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e _adj(X509_getm_n
117c0 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c otAfter(cert),(l
117d0 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 ong)60*60*24*day
117e0 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 s);...X509_set_p
117f0 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 ubkey(cert,pkey)
11800 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 ;....name=X509_g
11810 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 et_subject_name(
11820 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e cert);....X509_N
11830 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
11840 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d _txt(name,"C", M
11850 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
11860 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
11870 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 r *) k_C, -1, -1
11880 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
11890 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
118a0 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 xt(name,"ST", MB
118b0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
118c0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
118d0 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 *) k_ST, -1, -1
118e0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
118f0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
11900 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 xt(name,"L", MBS
11910 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
11920 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
11930 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 *) k_L, -1, -1,
11940 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
11950 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
11960 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 (name,"O", MBSTR
11970 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
11980 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
11990 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_O, -1, -1, 0)
119a0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
119b0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
119c0 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 ame,"OU", MBSTRI
119d0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
119e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
119f0 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_OU, -1, -1, 0)
11a00 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
11a10 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
11a20 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 ame,"CN", MBSTRI
11a30 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
11a40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
11a50 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_CN, -1, -1, 0)
11a60 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
11a70 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
11a80 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 ame,"Email", MBS
11a90 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
11aa0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
11ab0 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 *) k_Email, -1,
11ac0 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f -1, 0);....X509_
11ad0 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 set_subject_name
11ae0 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 (cert,name);....
11af0 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 if (!X509_sign(c
11b00 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 ert,pkey,EVP_sha
11b10 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 256())) {...
11b20 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b X509_free(cert);
11b30 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f ... EVP_PKEY_
11b40 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
11b50 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
11b60 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
11b70 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 000L... BN_fr
11b80 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
11b90 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 .. Tcl_SetRes
11ba0 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f ult(interp,"Erro
11bb0 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 r signing certif
11bc0 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 icate",NULL);...
11bd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
11be0 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 RROR;...}....if
11bf0 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 (isStr) {...
11c00 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f out=BIO_new(BIO_
11c10 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 s_mem());...
11c20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 PEM_write_bio_X5
11c30 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 09(out,cert);...
11c40 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f i=BIO_read(o
11c50 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 ut,buffer,sizeof
11c60 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 (buffer)-1);...
11c70 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a i=(i<0) ? 0 :
11c80 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 i;... buffer
11c90 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 [i]='\0';...
11ca0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 Tcl_SetVar(inter
11cb0 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c p,pemout,buffer,
11cc0 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 0);... BIO_fl
11cd0 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 ush(out);...
11ce0 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 BIO_free(out);..
11cf0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 .} else {...
11d00 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f out=BIO_new(BIO_
11d10 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 s_file());...
11d20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e BIO_write_filen
11d30 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b ame(out,pemout);
11d40 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 ... PEM_write
11d50 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 _bio_X509(out,ce
11d60 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 rt);... BIO_f
11d70 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 ree_all(out);...
11d80 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 }....X509_free(c
11d90 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 ert);...EVP_PKEY
11da0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 _free(pkey);.#if
11db0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
11dc0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
11dd0 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 0000L...BN_free(
11de0 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 bne);.#endif..
11df0 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 }..}..break;.
11e00 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 default:..bre
11e10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 ak;. }. re
11e20 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
11e30 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
11e40 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a tData;.}.../****
11e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11e60 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 /./* Init
11e70 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a */./******
11e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
11e90 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
11ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
11ee0 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 Tls_Free --. *.
11ef0 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
11f00 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 cleans up when
11f10 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 a SSL socket bas
11f20 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 ed channel. *.is
11f30 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 closed and its
11f40 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 reference count
11f50 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a falls below 1. *
11f60 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
11f70 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 none. *. * Side
11f80 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 effects:. *.Free
11f90 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a s all the state.
11fa0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
11fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11fe0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
11ff0 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 d.Tls_Free(char
12000 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 *blockPtr) {.
12010 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
12020 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 = (State *)bloc
12030 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e kPtr;.. dprin
12040 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
12050 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 Tls_Clean(sta
12060 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 tePtr);. ckfr
12070 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a ee(blockPtr);.}.
12080 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
12090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
120a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
120b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
120c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
120d0 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a Tls_Clean --. *
120e0 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
120f0 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 re cleans up whe
12100 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 n a SSL socket b
12110 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 ased channel. *.
12120 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 is closed and it
12130 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e s reference coun
12140 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e t falls below 1.
12150 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a This should. *
12160 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 .be called synch
12170 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 ronously by the
12180 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 CloseProc, not i
12190 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 n the. *.Eventua
121a0 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b llyFree callback
121b0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
121c0 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.none. *. * S
121d0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
121e0 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 Frees all the st
121f0 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ate. *. *-------
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 2d 2d ----------------
12230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
12240 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 .void Tls_Clean(
12250 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 State *statePtr)
12260 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 {. dprintf("
12270 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f Called");.. /
12280 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 *. * we're a
12290 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 ssuming here tha
122a0 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 t we're single-t
122b0 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a hreaded. */.
122c0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
122d0 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f ->timer != (Tcl_
122e0 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c TimerToken) NULL
122f0 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 ) {..Tcl_DeleteT
12300 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 imerHandler(stat
12310 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 ePtr->timer);..s
12320 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
12330 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
12340 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
12350 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 protos) {..ckfre
12360 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 e(statePtr->prot
12370 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e os);..statePtr->
12380 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 protos = NULL;.
12390 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
123a0 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f tePtr->bio) {../
123b0 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c * This will call
123c0 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 SSL_shutdown. B
123d0 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 ug 1414045 */..d
123e0 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 printf("BIO_free
123f0 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 _all(%p)", state
12400 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f Ptr->bio);..BIO_
12410 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 free_all(statePt
12420 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 r->bio);..stateP
12430 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a tr->bio = NULL;.
12440 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
12450 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 atePtr->ssl) {..
12460 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 dprintf("SSL_fre
12470 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 e(%p)", statePtr
12480 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 ->ssl);..SSL_fre
12490 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
124a0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ;..statePtr->ssl
124b0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
124c0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
124d0 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 >ctx) {..SSL_CTX
124e0 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e _free(statePtr->
124f0 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ctx);..statePtr-
12500 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 >ctx = NULL;.
12510 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
12520 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b Ptr->callback) {
12530 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 ..Tcl_DecrRefCou
12540 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c nt(statePtr->cal
12550 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 lback);..statePt
12560 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 r->callback = NU
12570 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
12580 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 (statePtr->pass
12590 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 word) {..Tcl_Dec
125a0 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
125b0 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 tr->password);..
125c0 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
125d0 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d rd = NULL;. }
125e0 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
125f0 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a eturning");.}...
12600 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
12610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12640 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
12650 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a ls_Init --. *. *
12660 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 .This is a packa
12670 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f ge initializatio
12680 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 n procedure, whi
12690 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 ch is called. *.
126a0 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 by Tcl when this
126b0 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 package is to b
126c0 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e e added to an in
126d0 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a terpreter.. *. *
126e0 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 Results: Ssl c
126f0 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f onfigured and lo
12700 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 aded. *. * Side
12710 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 effects:. *. cre
12720 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d ate the ssl comm
12730 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 and, initialize
12740 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 ssl context. *.
12750 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
12760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12790 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f ----. */.DLLEXPO
127a0 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 RT int Tls_Init(
127b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
127c0 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 rp) {. const
127d0 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 char tlsTclInitS
127e0 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 cript[] = {.#inc
127f0 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 lude "tls.tcl.h"
12800 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 ..0x00. };..
12810 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
12820 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ed");.. /*.
12830 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 * We only sup
12840 70 6f 72 74 20 54 63 6c 20 38 2e 34 20 6f 72 20 port Tcl 8.4 or
12850 6e 65 77 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20 newer. */.
12860 20 20 69 66 20 28 0a 23 69 66 64 65 66 20 55 53 if (.#ifdef US
12870 45 5f 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c E_TCL_STUBS..Tcl
12880 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 _InitStubs(inter
12890 70 2c 20 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c p, "8.4", 0).#el
128a0 73 65 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 se..Tcl_PkgRequi
128b0 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 re(interp, "Tcl"
128c0 2c 20 22 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e , "8.4-", 0).#en
128d0 64 69 66 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b dif.. == NULL) {
128e0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
128f0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
12900 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 f (TlsLibInit(0)
12910 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 != TCL_OK) {..T
12920 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
12930 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e interp, "could n
12940 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 ot initialize SS
12950 4c 20 6c 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c L library", NULL
12960 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
12970 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
12980 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
12990 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
129a0 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 ls::ciphers", Ci
129b0 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c phersObjCmd, (Cl
129c0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
129d0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
129e0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
129f0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
12a00 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
12a10 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f :connection", Co
12a20 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 nnectionInfoObjC
12a30 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
12a40 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
12a50 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
12a60 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
12a70 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
12a80 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b , "tls::handshak
12a90 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a e", HandshakeObj
12aa0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
12ab0 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
12ac0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
12ad0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
12ae0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
12af0 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 p, "tls::import"
12b00 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 , ImportObjCmd,
12b10 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
12b20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
12b30 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
12b40 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
12b50 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
12b60 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 ls::unimport", U
12b70 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 nimportObjCmd, (
12b80 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
12b90 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
12ba0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
12bb0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
12bc0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
12bd0 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 s::status", Stat
12be0 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e usObjCmd, (Clien
12bf0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
12c00 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
12c10 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
12c20 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
12c30 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 interp, "tls::ve
12c40 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f rsion", VersionO
12c50 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
12c60 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
12c70 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
12c80 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
12c90 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
12ca0 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 erp, "tls::misc"
12cb0 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 , MiscObjCmd, (C
12cc0 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
12cd0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
12ce0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
12cf0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
12d00 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
12d10 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 ::protocols", Pr
12d20 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 otocolsObjCmd, (
12d30 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
12d40 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
12d50 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 c *) NULL);..
12d60 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 if (interp) {..
12d70 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c Tcl_Eval(interp,
12d80 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 tlsTclInitScrip
12d90 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 t);. }.. r
12da0 65 74 75 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f eturn(Tcl_PkgPro
12db0 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 74 6c vide(interp, "tl
12dc0 73 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 s", PACKAGE_VERS
12dd0 49 4f 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d ION));.}../*. *-
12de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e10 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 -----*. *. *.Tls
12e20 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a _SafeInit --. *.
12e30 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.-------------
12e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e60 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 ---*. *.Standard
12e70 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 procedure requi
12e80 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 red by 'load'..
12e90 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 *.Initializes th
12ea0 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 is extension for
12eb0 20 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 a safe interpre
12ec0 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d ter.. *.--------
12ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ef0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
12f00 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
12f10 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 ..As of 'Tls_Ini
12f20 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a t'. *. *.Result:
12f30 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 . *..A standard
12f40 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a Tcl error code..
12f50 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
12f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f -----------*. */
12f90 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 .DLLEXPORT int T
12fa0 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f ls_SafeInit(Tcl_
12fb0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 Interp *interp)
12fc0 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 {. dprintf("C
12fd0 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 alled");. ret
12fe0 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 urn(Tls_Init(int
12ff0 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d erp));.}../*. *-
13000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13030 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 -----*. *. *.Tls
13040 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a LibInit --. *. *
13050 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
13060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13080 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 -*. *.Initialize
13090 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e s SSL library on
130a0 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 ce per applicati
130b0 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d on. *.----------
130c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130e0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 ------*. *. *.Si
130f0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 de effects:. *..
13100 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 initializes SSL
13110 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 library. *. *.Re
13120 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 sult:. *..none.
13130 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
13140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a ----------*. */.
13170 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 static int TlsLi
13180 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 bInit(int uninit
13190 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 ialize) {. st
131a0 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c atic int initial
131b0 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e ized = 0;. in
131c0 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f t status = TCL_O
131d0 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f K;.#if defined(O
131e0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
131f0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
13200 48 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 HREADS). size
13210 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 _t num_locks;.#e
13220 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e ndif.. if (un
13230 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 initialize) {.
13240 20 20 20 20 20 20 69 66 20 28 21 69 6e 69 74 69 if (!initi
13250 61 6c 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 alized) {.
13260 20 20 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 dprintf("A
13270 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 sked to uninitia
13280 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 lize, but we are
13290 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 not initialized
132a0 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 ");..
132b0 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b return(TCL_OK);
132c0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 . }..
132d0 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b dprintf("Ask
132e0 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 ed to uninitiali
132f0 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e ze");..#if defin
13300 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
13310 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
13320 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 CL_THREADS).
13330 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 Tcl_MutexLoc
13340 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 20 20 k(&init_mx);..
13350 20 20 20 20 20 20 69 66 20 28 6c 6f 63 6b 73 29 if (locks)
13360 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 {. f
13370 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 ree(locks);.
13380 20 20 20 20 20 20 20 20 6c 6f 63 6b 73 20 3d 20 locks =
13390 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 NULL;.
133a0 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 locksCount = 0
133b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 ;. }.#end
133c0 69 66 0a 20 20 20 20 20 20 20 20 69 6e 69 74 69 if. initi
133d0 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 alized = 0;..#if
133e0 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
133f0 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
13400 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
13410 29 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4d 75 ). Tcl_Mu
13420 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f texUnlock(&init_
13430 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 mx);.#endif..
13440 20 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f return(TCL_
13450 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OK);. }..
13460 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 if (initialized)
13470 20 7b 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e {. dprin
13480 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 tf("Called, but
13490 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c using cached val
134a0 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 ue");. re
134b0 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 turn(status);.
134c0 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
134d0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 ("Called");..#if
134e0 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
134f0 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
13500 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
13510 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c ). Tcl_MutexL
13520 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 ock(&init_mx);.#
13530 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 endif. initia
13540 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 lized = 1;..#if
13550 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
13560 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
13570 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
13580 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d . num_locks =
13590 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 1;. locksCou
135a0 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c nt = (int) num_l
135b0 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 ocks;. locks
135c0 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 = malloc(sizeof(
135d0 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f *locks) * num_lo
135e0 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 cks);. memset
135f0 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f (locks, 0, sizeo
13600 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f f(*locks) * num_
13610 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a locks);.#endif..
13620 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a /* Initializ
13630 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f e BOTH libcrypto
13640 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a and libssl. */.
13650 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 OPENSSL_init
13660 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 _ssl(OPENSSL_INI
13670 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e T_LOAD_SSL_STRIN
13680 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 GS | OPENSSL_INI
13690 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 T_LOAD_CRYPTO_ST
136a0 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c RINGS..| OPENSSL
136b0 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 _INIT_ADD_ALL_CI
136c0 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f PHERS | OPENSSL_
136d0 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 INIT_ADD_ALL_DIG
136e0 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 ESTS, NULL);..
136f0 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 BIO_new_tcl(NU
13700 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 LL, 0);..#if 0.
13710 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 /*. * XXX
13720 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 :TODO: Remove th
13730 69 73 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c is code and repl
13740 61 63 65 20 69 74 20 77 69 74 68 20 61 20 63 68 ace it with a ch
13750 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 eck. * for e
13760 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e nough entropy an
13770 64 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 d do not try to
13780 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 create our own.
13790 20 20 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 * terrible e
137a0 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 ntropy. */.
137b0 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 /*. * See
137c0 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d d the random num
137d0 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e ber generator in
137e0 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 the SSL library
137f0 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 ,. * using t
13800 68 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 he do/while cons
13810 74 72 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 truct because of
13820 20 74 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e the bug note in
13830 20 74 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e the. * Open
13840 53 53 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a SSL FAQ at http:
13850 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 //www.openssl.or
13860 67 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 g/support/faq.ht
13870 6d 6c 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a ml#USER1. *.
13880 20 20 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 * The crux
13890 6f 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 of the problem i
138a0 73 20 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 s that Solaris 7
138b0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 does not have a
138c0 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e . * /dev/ran
138d0 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e dom or /dev/uran
138e0 64 6f 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 dom device so it
138f0 20 63 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 cannot gather e
13900 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 nough. * ent
13910 72 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 ropy from the RA
13920 4e 44 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 ND_seed() when T
13930 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 LS initializes a
13940 6e 64 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 nd refuses.
13950 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e * to go further.
13960 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e Earlier version
13970 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 s of OpenSSL car
13980 72 69 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 ried on regardle
13990 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 ss.. */.
139a0 73 72 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 srand((unsigned
139b0 69 6e 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f int) time((time_
139c0 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 t *) NULL));.
139d0 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 do {..for (i =
139e0 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 0; i < 16; i++)
139f0 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b {.. rnd_seed[
13a00 69 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 i] = 1 + (char)
13a10 28 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f (255.0 * rand()/
13a20 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b (RAND_MAX+1.0));
13a30 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 ..}..RAND_seed(r
13a40 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 nd_seed, sizeof(
13a50 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 rnd_seed));.
13a60 7d 20 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 } while (RAND_st
13a70 61 74 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 atus() != 1);.#e
13a80 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 ndif..#if define
13a90 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
13aa0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
13ab0 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f L_THREADS)..Tcl_
13ac0 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 MutexUnlock(&ini
13ad0 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 t_mx);.#endif...
13ae0 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a return(status);.
13af0 7d 0a }.