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 28 63 e {..errStr = (c
1870: 68 61 72 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a har *)0;. }..
1880: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
1890: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
18a0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
18b0: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 .if (statePtr->v
18c0: 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 flags & SSL_VERI
18d0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
18e0: 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 ER_CERT) {..
18f0: 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c return ok;..} el
1900: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e se {.. return
1910: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 1;..}. }.
1920: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
1930: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
1940: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
1950: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1960: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1970: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
1980: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
1990: 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 verify", -1));.
19a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
19b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
19c0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c rp, cmdPtr,..Tcl
19d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
19e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
19f0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
1a00: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
1a10: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1a20: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1a30: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
1a40: 62 6a 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20 bj(depth));.
1a50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1a60: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1a70: 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 cmdPtr, Tls_New
1a80: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 X509Obj(interp,
1a90: 63 65 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f cert));. Tcl_
1aa0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1ab0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1ac0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
1ad0: 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c bj(ok));. Tcl
1ae0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1af0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
1b00: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
1b10: 69 6e 67 4f 62 6a 28 65 72 72 53 74 72 20 3f 20 ingObj(errStr ?
1b20: 65 72 72 53 74 72 20 3a 20 22 22 2c 20 2d 31 29 errStr : "", -1)
1b30: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
1b40: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
1b50: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 ) interp);. T
1b60: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
1b70: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
1b80: 72 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 r);.. statePt
1b90: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
1ba0: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 TCL_CALLBACK;..
1bb0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
1bc0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
1bd0: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c code = Tcl_Eval
1be0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d ObjEx(interp, cm
1bf0: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 dPtr, TCL_EVAL_G
1c00: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 LOBAL);. if (
1c10: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 code != TCL_OK)
1c20: 7b 0a 09 2f 2a 20 49 74 20 67 6f 74 20 61 6e 20 {../* It got an
1c30: 65 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 error - reject t
1c40: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 09 he certificate..
1c50: 09 2a 2f 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a .*/.#if (TCL_MAJ
1c60: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
1c70: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
1c80: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
1c90: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
1ca0: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
1cb0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
1cc0: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
1cd0: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 09 code);.#endif..
1ce0: 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c ok = 0;. } el
1cf0: 73 65 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54 se {..result = T
1d00: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
1d10: 69 6e 74 65 72 70 29 3b 0a 09 73 74 72 69 6e 67 interp);..string
1d20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
1d30: 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 2c 20 FromObj(result,
1d40: 26 6c 65 6e 67 74 68 29 3b 0a 09 2f 2a 20 41 6e &length);../* An
1d50: 20 65 6d 70 74 79 20 72 65 73 75 6c 74 20 6c 65 empty result le
1d60: 61 76 65 73 20 76 65 72 69 66 69 63 61 74 69 6f aves verificatio
1d70: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f 0a n unchanged..*/.
1d80: 09 69 66 20 28 73 74 72 69 6e 67 20 21 3d 20 4e .if (string != N
1d90: 55 4c 4c 20 26 26 20 6c 65 6e 67 74 68 20 3e 20 ULL && length >
1da0: 30 29 20 7b 0a 09 20 20 20 20 63 6f 64 65 20 3d 0) {.. code =
1db0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f Tcl_GetIntFromO
1dc0: 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c bj(interp, resul
1dd0: 74 2c 20 26 6f 6b 29 3b 0a 09 20 20 20 20 69 66 t, &ok);.. if
1de0: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b (code != TCL_OK
1df0: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ) {.#if (TCL_MAJ
1e00: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
1e10: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
1e20: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 09 54 63 ERSION < 6)...Tc
1e30: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f l_BackgroundErro
1e40: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 r(interp);.#else
1e50: 0a 09 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e ...Tcl_Backgroun
1e60: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 dException(inter
1e70: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 p, code);.#endif
1e80: 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20 20 20 20 ...ok = 0;..
1e90: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 }..}. }. T
1ea0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
1eb0: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 73 74 cmdPtr);.. st
1ec0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d atePtr->flags &=
1ed0: 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 ~(TLS_TCL_CALLB
1ee0: 41 43 4b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 ACK);.. Tcl_R
1ef0: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
1f00: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 ta) statePtr);.
1f10: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
1f20: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
1f30: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 rp);. return(
1f40: 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 ok);./* By defau
1f50: 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 lt, leave verifi
1f60: 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 cation unchanged
1f70: 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d ----------------
1fc0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f -. *. * Tls_Erro
1fd0: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 r --. *. *.Calls
1fe0: 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 24 callback with $
1ff0: 66 64 20 61 6e 64 20 24 6d 73 67 20 2d 20 73 6f fd and $msg - so
2000: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63 61 the callback ca
2010: 6e 20 64 65 63 69 64 65 0a 20 2a 09 77 68 61 74 n decide. *.what
2020: 20 74 6f 20 64 6f 20 77 69 74 68 20 65 72 72 6f to do with erro
2030: 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 rs.. *. * Side e
2040: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 ffects:. *.The e
2050: 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 rr field of the
2060: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 currently operat
2070: 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 ive State is set
2080: 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e . *. to a strin
2090: 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 g describing the
20a0: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e SSL negotiation
20b0: 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a failure reason.
20c0: 20 2a 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: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 -----. */.void.T
2110: 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 2a ls_Error(State *
2120: 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 2a statePtr, char *
2130: 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 msg) {. Tcl_I
2140: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
2150: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
2160: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
2170: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
2180: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ode;.. dprint
2190: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
21a0: 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d 73 if (msg && *ms
21b0: 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 g) {..Tcl_SetErr
21c0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
21d0: 53 53 4c 22 2c 20 6d 73 67 2c 20 28 63 68 61 72 SSL", msg, (char
21e0: 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 *)NULL);. }
21f0: 65 6c 73 65 20 7b 0a 09 6d 73 67 20 3d 20 54 63 else {..msg = Tc
2200: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
2210: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 bj(Tcl_GetObjRes
2220: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55 4c ult(interp), NUL
2230: 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 L);. }. st
2240: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 atePtr->err = ms
2250: 67 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 g;.. if (stat
2260: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
2270: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
2280: 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 ) {..char buf[BU
2290: 46 53 49 5a 5d 3b 0a 09 73 70 72 69 6e 74 66 28 FSIZ];..sprintf(
22a0: 62 75 66 2c 20 22 53 53 4c 20 63 68 61 6e 6e 65 buf, "SSL channe
22b0: 6c 20 5c 22 25 73 5c 22 3a 20 65 72 72 6f 72 3a l \"%s\": error:
22c0: 20 25 73 22 2c 0a 09 20 20 20 20 54 63 6c 5f 47 %s",.. Tcl_G
22d0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
22e0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 6d atePtr->self), m
22f0: 73 67 29 3b 0a 09 54 63 6c 5f 53 65 74 52 65 73 sg);..Tcl_SetRes
2300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 62 75 66 2c ult(interp, buf,
2310: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a TCL_VOLATILE);.
2320: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 #if (TCL_MAJOR_V
2330: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 ERSION == 8) &&
2340: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 (TCL_MINOR_VERSI
2350: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 ON < 6)..Tcl_Bac
2360: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 kgroundError(int
2370: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c erp);.#else..Tcl
2380: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 _BackgroundExcep
2390: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 54 43 4c tion(interp, TCL
23a0: 5f 45 52 52 4f 52 29 3b 0a 23 65 6e 64 69 66 0a _ERROR);.#endif.
23b0: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 .return;. }.
23c0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
23d0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
23e0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
23f0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ;.. Tcl_ListO
2400: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2410: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2420: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2430: 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a ("error", -1));.
2440: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2450: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2460: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
2470: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
2480: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
2490: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
24a0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
24b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
24c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
24d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
24e0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 wStringObj(msg,
24f0: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 -1));.. Tcl_P
2500: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
2510: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
2520: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
2530: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
2540: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ePtr);.. Tcl_
2550: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
2560: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d Ptr);. code =
2570: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 Tcl_EvalObjEx(i
2580: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2590: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b CL_EVAL_GLOBAL);
25a0: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d . if (code !=
25b0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 TCL_OK) {.#if (
25c0: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
25d0: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f N == 8) && (TCL_
25e0: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 MINOR_VERSION <
25f0: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6)..Tcl_Backgrou
2600: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ndError(interp);
2610: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b .#else..Tcl_Back
2620: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 groundException(
2630: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 interp, code);.#
2640: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 endif. }.
2650: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
2660: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 (cmdPtr);. Tc
2670: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
2680: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
2690: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 ;. Tcl_Releas
26a0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
26b0: 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 nterp);.}.../*.
26c0: 2a 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 2d ----------------
2700: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f ----. *. * KeyLo
2710: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a gCallback --. *.
2720: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 *.Write receive
2730: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f d key data to lo
2740: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 g file.. *. * Si
2750: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
2760: 6f 6e 65 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d one. *----------
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 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
27b0: 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 id KeyLogCallbac
27c0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
27d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 , const char *li
27e0: 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a ne) {. char *
27f0: 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c str = getenv(SSL
2800: 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 KEYLOGFILE);.
2810: 20 46 49 4c 45 20 2a 66 64 3b 0a 20 20 20 20 69 FILE *fd;. i
2820: 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 f (str) {..fd =
2830: 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b fopen(str, "a");
2840: 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 ..fprintf(fd, "%
2850: 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c s\n",line);..fcl
2860: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d ose(fd);. }.}
2870: 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
28c0: 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 * Password Callb
28d0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c ack --. *. *.Cal
28e0: 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 77 led when a passw
28f0: 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 74 6f ord is needed to
2900: 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e 64 20 unpack RSA and
2910: 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 76 61 PEM keys.. *.Eva
2920: 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 61 73 ls any bound pas
2930: 73 77 6f 72 64 20 73 63 72 69 70 74 20 61 6e 64 sword script and
2940: 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65 73 returns the res
2950: 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 70 61 ult as. *.the pa
2960: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e 0a 20 ssword string..
2970: 2a 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 2d ----------------
29b0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
29c0: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c int.PasswordCall
29d0: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 back(char *buf,
29e0: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 int size, int ve
29f0: 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 61 74 rify, void *udat
2a00: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a a) {. State *
2a10: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 statePtr.= (Stat
2a20: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 e *) udata;.
2a30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
2a40: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
2a50: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
2a60: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
2a70: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 int code;.. d
2a80: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
2a90: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
2aa0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d Ptr->password ==
2ab0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 NULL) {..if (Tc
2ac0: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c l_EvalEx(interp,
2ad0: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 "tls::password"
2ae0: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 , -1, TCL_EVAL_G
2af0: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b LOBAL) == TCL_OK
2b00: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 ) {.. char *r
2b10: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 et = (char *) Tc
2b20: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c l_GetStringResul
2b30: 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 t(interp);..
2b40: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 strncpy(buf, ret
2b50: 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 , (size_t) size)
2b60: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 ;.. return (i
2b70: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a nt)strlen(ret);.
2b80: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 .} else {.. r
2b90: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 eturn -1;..}.
2ba0: 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d }.. cmdPtr =
2bb0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
2bc0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 j(statePtr->pass
2bd0: 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f word);.. Tcl_
2be0: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
2bf0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
2c00: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
2c10: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
2c20: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c tePtr);.. Tcl
2c30: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
2c40: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 dPtr);. code
2c50: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 = Tcl_EvalObjEx(
2c60: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2c70: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
2c80: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 ;. if (code !
2c90: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 = TCL_OK) {.#if
2ca0: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
2cb0: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
2cc0: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
2cd0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
2ce0: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 undError(interp)
2cf0: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 ;.#else..Tcl_Bac
2d00: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e kgroundException
2d10: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a (interp, code);.
2d20: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 #endif. }.
2d30: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
2d40: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 t(cmdPtr);..
2d50: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
2d60: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
2d70: 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 63 6f 64 r);.. if (cod
2d80: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 e == TCL_OK) {..
2d90: 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 char *ret = (cha
2da0: 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 r *) Tcl_GetStri
2db0: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 ngResult(interp)
2dc0: 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e 28 72 65 ;..if (strlen(re
2dd0: 74 29 20 3c 20 73 69 7a 65 20 2d 20 31 29 20 7b t) < size - 1) {
2de0: 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 .. strncpy(bu
2df0: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 f, ret, (size_t)
2e00: 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 54 63 6c size);.. Tcl
2e10: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
2e20: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 Data) interp);..
2e30: 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 return (int)
2e40: 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 0a strlen(ret);..}.
2e50: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 }. Tcl_Re
2e60: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
2e70: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 a) interp);.
2e80: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76 65 72 69 return -1;..veri
2e90: 66 79 20 3d 20 76 65 72 69 66 79 3b 0a 7d 0a 0c fy = verify;.}..
2ea0: 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2ef0: 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b Session Callback
2f00: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a for Clients --.
2f10: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 *. *.Called whe
2f20: 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 n a new session
2f30: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 is added to the
2f40: 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e cache. In TLS 1.
2f50: 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 3. *.this may be
2f60: 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 received multip
2f70: 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 le times after t
2f80: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f he handshake. Fo
2f90: 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 r. *.earlier ver
2fa0: 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c sions, this will
2fb0: 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 be received dur
2fc0: 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b ing the handshak
2fd0: 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 e.. *. * Results
2fe0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.None. *. *
2ff0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
3000: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 .Calls callback
3010: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 2d (if defined). *-
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3060: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
3070: 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 t.SessionCallbac
3080: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
3090: 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 , SSL_SESSION *s
30a0: 65 73 73 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74 ession) {. St
30b0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
30c0: 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f (State*)SSL_get_
30d0: 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 app_data((SSL *)
30e0: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e ssl);. Tcl_In
30f0: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
3100: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
3110: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
3120: 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 dPtr;. const
3130: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 unsigned char *t
3140: 69 63 6b 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 icket;. const
3150: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
3160: 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 session_id;.
3170: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 int len;. int
3180: 20 63 6f 64 65 3b 0a 20 20 20 20 73 69 7a 65 5f code;. size_
3190: 74 20 6c 65 6e 32 3b 0a 0a 20 20 20 20 64 70 72 t len2;.. dpr
31a0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
31b0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
31c0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 r->callback == (
31d0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b Tcl_Obj*)NULL) {
31e0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
31f0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
3200: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d } else if (ssl =
3210: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
3220: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
3230: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
3240: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
3250: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
3260: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
3270: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3280: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3290: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
32a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
32b0: 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b "session", -1));
32c0: 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e .. /* Session
32d0: 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 id */. sessi
32e0: 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 on_id = SSL_SESS
32f0: 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 ION_get0_id_cont
3300: 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 6c 65 ext(session, &le
3310: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 n);. Tcl_List
3320: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3330: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3340: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3350: 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 6c 65 j(session_id, le
3360: 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 n));.. /* Ses
3370: 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a 20 sion ticket */.
3380: 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 SSL_SESSION_g
3390: 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 et0_ticket(sessi
33a0: 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 on, &ticket, &le
33b0: 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 n2);. Tcl_Lis
33c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
33d0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
33e0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
33f0: 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 bj(ticket, (int)
3400: 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 len2));.. /*
3410: 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 Lifetime - numbe
3420: 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a r of seconds */.
3430: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
3440: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3450: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 erp, cmdPtr,..Tc
3460: 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f l_NewLongObj((lo
3470: 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f ng) SSL_SESSION_
3480: 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 get_ticket_lifet
3490: 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e ime_hint(session
34a0: 29 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 )));.. Tcl_Pr
34b0: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
34c0: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 ta) interp);.
34d0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 Tcl_Preserve((C
34e0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
34f0: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 Ptr);.. Tcl_I
3500: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
3510: 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 tr);. code =
3520: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e Tcl_EvalObjEx(in
3530: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 terp, cmdPtr, TC
3540: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a L_EVAL_GLOBAL);.
3550: 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 if (code !=
3560: 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 TCL_OK) {.#if (T
3570: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
3580: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d == 8) && (TCL_M
3590: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 INOR_VERSION < 6
35a0: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e )..Tcl_Backgroun
35b0: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a dError(interp);.
35c0: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 #else..Tcl_Backg
35d0: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 roundException(i
35e0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 nterp, code);.#e
35f0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 ndif. }. T
3600: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
3610: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 cmdPtr);.. Tc
3620: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
3630: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
3640: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 ;. Tcl_Releas
3650: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
3660: 6e 74 65 72 70 29 3b 0a 20 20 20 20 2f 2a 20 49 nterp);. /* I
3670: 66 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 f return non-zer
3680: 6f 2c 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 o, caller will h
3690: 61 76 65 20 74 6f 20 64 6f 20 61 20 53 53 4c 5f ave to do a SSL_
36a0: 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 6f SESSION_free() o
36b0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e n the structure.
36c0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 */. return 0
36d0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
3720: 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 *. * ALPN Callba
3730: 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d ck for Servers -
3740: 2d 0a 20 2a 0a 20 2a 09 53 65 6c 65 63 74 20 77 -. *. *.Select w
3750: 68 69 63 68 20 70 72 6f 74 6f 63 6f 6c 20 28 68 hich protocol (h
3760: 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c ttp/1.1, h2, h3,
3770: 20 65 74 63 2e 29 20 74 6f 20 75 73 65 20 66 6f etc.) to use fo
3780: 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e r the. *.incomin
3790: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 2a g connection.. *
37a0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
37b0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
37c0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
37d0: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
37e0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 efined). *. * Re
37f0: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 turn codes:. *.S
3800: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
3810: 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 : ALPN protocol
3820: 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f selected. The co
3830: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
3840: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es.. *.SSL_TLSEX
3850: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 T_ERR_ALERT_FATA
3860: 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 L: There was no
3870: 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 overlap between
3880: 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 the client's. *.
3890: 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c 69 73 supplied lis
38a0: 74 20 61 6e 64 20 74 68 65 20 73 65 72 76 65 72 t and the server
38b0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 configuration.
38c0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 The connection w
38d0: 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 2e 0a ill be aborted..
38e0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
38f0: 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 R_NOACK: ALPN pr
3900: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 otocol not selec
3910: 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 ted, e.g., becau
3920: 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 se no ALPN. *.
3930: 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 protocols are
3940: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 configured for t
3950: 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 his connection.
3960: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
3970: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d ontinues.. *. *-
3980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39c0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
39d0: 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 63 t.ALPNCallback(c
39e0: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 onst SSL *ssl, c
39f0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
3a00: 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e ar **out, unsign
3a10: 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c ed char *outlen,
3a20: 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
3a30: 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 char *in, unsig
3a40: 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 ned int inlen, v
3a50: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 oid *arg) {.
3a60: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
3a70: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 = (State*)arg;.
3a80: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
3a90: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
3aa0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
3ab0: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
3ac0: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 int code;..
3ad0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
3ae0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
3af0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
3b00: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
3b10: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
3b20: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
3b30: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
3b40: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ssl == NULL) {..
3b50: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
3b60: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
3b70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 }.. /* Selec
3b80: 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 t protocol */.
3b90: 20 20 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 SSL_select_nex
3ba0: 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20 6f 75 74 t_proto(out, out
3bb0: 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 len, statePtr->p
3bc0: 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d rotos, statePtr-
3bd0: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 20 69 6e 2c >protos_len, in,
3be0: 20 69 6e 6c 65 6e 29 3b 0a 0a 20 20 20 20 63 6d inlen);.. cm
3bf0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
3c00: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
3c10: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 ->callback);.
3c20: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3c30: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3c40: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
3c50: 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e wStringObj("alpn
3c60: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
3c70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3c80: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3c90: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
3ca0: 69 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 ingObj(*out, -1)
3cb0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
3cc0: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
3cd0: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 ) interp);. T
3ce0: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
3cf0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
3d00: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 r);.. Tcl_Inc
3d10: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
3d20: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 );. code = Tc
3d30: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 l_EvalObjEx(inte
3d40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f rp, cmdPtr, TCL_
3d50: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 EVAL_GLOBAL);.
3d60: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 if (code != TC
3d70: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c L_OK) {.#if (TCL
3d80: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d _MAJOR_VERSION =
3d90: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e = 8) && (TCL_MIN
3da0: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a OR_VERSION < 6).
3db0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
3dc0: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 rror(interp);.#e
3dd0: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f lse..Tcl_Backgro
3de0: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 undException(int
3df0: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 erp, code);.#end
3e00: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c if. }. Tcl
3e10: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
3e20: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f dPtr);.. Tcl_
3e30: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
3e40: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
3e50: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
3e60: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
3e70: 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e erp);. return
3e80: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
3e90: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ee0: 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62 . *. * SNI Callb
3ef0: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 ack for Servers
3f00: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d --. *. *.Perform
3f10: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 73 65 6c server name sel
3f20: 65 63 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73 ection. *. * Res
3f30: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
3f40: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
3f50: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
3f60: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
3f70: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
3f80: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 des:. *.SSL_TLSE
3f90: 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 XT_ERR_OK: SNI h
3fa0: 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 ostname is accep
3fb0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
3fc0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
3fd0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
3fe0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e _ALERT_FATAL: SN
3ff0: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
4000: 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 t accepted. The
4010: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 connection. *.
4020: 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 is aborted. De
4030: 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 fault for alert
4040: 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f is SSL_AD_UNRECO
4050: 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 GNIZED_NAME.. *.
4060: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
4070: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e LERT_WARNING: SN
4080: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
4090: 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e t accepted, warn
40a0: 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 ing alert. *.
40b0: 20 73 65 6e 74 20 28 6e 6f 74 20 69 6e 20 54 4c sent (not in TL
40c0: 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e Sv1.3). The conn
40d0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
40e0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
40f0: 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 ERR_NOACK: SNI h
4100: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 ostname is not a
4110: 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 ccepted and not
4120: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a acknowledged,. *
4130: 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 . e.g. if SNI
4140: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f has not been co
4150: 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f nfigured. The co
4160: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
4170: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d es.. *. *-------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
41c0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 .static int.SNIC
41d0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
41e0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
41f0: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
4200: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
4210: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
4220: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
4230: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
4240: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
4250: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
4260: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
4270: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 ;. char *serv
4280: 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a ername = NULL;..
4290: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
42a0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
42b0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
42c0: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 ck == (Tcl_Obj*)
42d0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
42e0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
42f0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 K;. } else if
4300: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b (ssl == NULL) {
4310: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
4320: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
4330: 20 20 20 7d 0a 0a 20 20 20 20 73 65 72 76 65 72 }.. server
4340: 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 name = SSL_get_s
4350: 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 ervername(ssl, T
4360: 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 LSEXT_NAMETYPE_h
4370: 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 ost_name);. i
4380: 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c f (!servername |
4390: 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 | servername[0]
43a0: 3d 3d 20 27 5c 30 27 29 20 7b 0a 20 20 20 20 20 == '\0') {.
43b0: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c return SSL_TL
43c0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
43d0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 }.. cmdPt
43e0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
43f0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 eObj(statePtr->c
4400: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 allback);. Tc
4410: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4420: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4430: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
4440: 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d ringObj("sni", -
4450: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
4460: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4470: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4480: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
4490: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 bj(servername ,
44a0: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 -1));.. Tcl_P
44b0: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
44c0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
44d0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
44e0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
44f0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ePtr);.. Tcl_
4500: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
4510: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d Ptr);. code =
4520: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 Tcl_EvalObjEx(i
4530: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
4540: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b CL_EVAL_GLOBAL);
4550: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d . if (code !=
4560: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 TCL_OK) {.#if (
4570: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
4580: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f N == 8) && (TCL_
4590: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 MINOR_VERSION <
45a0: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6)..Tcl_Backgrou
45b0: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ndError(interp);
45c0: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b .#else..Tcl_Back
45d0: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 groundException(
45e0: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 interp, code);.#
45f0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 endif. }.
4600: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
4610: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 (cmdPtr);.. T
4620: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
4630: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
4640: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 );. Tcl_Relea
4650: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
4660: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 interp);. ret
4670: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
4680: 52 52 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a RR_OK;.}.../*. *
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46d0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 65 6c 6c 6f 20 ---. *. * Hello
46e0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 Callback for Ser
46f0: 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 vers --. *. *.Us
4700: 65 64 20 62 79 20 73 65 72 76 65 72 20 74 6f 20 ed by server to
4710: 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65 72 76 examine the serv
4720: 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 er name indicati
4730: 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e 73 69 on (SNI) extensi
4740: 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 20 62 on. *.provided b
4750: 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 y the client in
4760: 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63 74 20 order to select
4770: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 an appropriate c
4780: 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a 20 2a ertificate to. *
4790: 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 .present, and ma
47a0: 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 ke other configu
47b0: 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e ration adjustmen
47c0: 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 ts relevant to t
47d0: 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 hat server. *.na
47e0: 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 me and its confi
47f0: 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 guration. This i
4800: 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69 6e 67 ncludes swapping
4810: 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 out the associa
4820: 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 ted. *.SSL_CTX p
4830: 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e ointer, modifyin
4840: 67 20 74 68 65 20 73 65 72 76 65 72 27 73 20 6c g the server's l
4850: 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74 65 64 ist of permitted
4860: 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a 2a TLS versions,.*
4870: 09 63 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 .changing the se
4880: 72 76 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 rver's cipher li
4890: 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 st in response t
48a0: 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 o the client's c
48b0: 69 70 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e ipher list, etc.
48c0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
48d0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
48e0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
48f0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
4900: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
4910: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
4920: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c *.SSL_CLIENT_HEL
4930: 4c 4f 5f 52 45 54 52 59 20 3d 20 73 75 73 70 65 LO_RETRY = suspe
4940: 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 nd the handshake
4950: 2c 20 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68 , and the handsh
4960: 61 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c ake function wil
4970: 6c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 l return immedia
4980: 74 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 tely. *.SSL_CLIE
4990: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 20 3d NT_HELLO_ERROR =
49a0: 20 66 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e failure, termin
49b0: 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 ate connection.
49c0: 53 65 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72 Set alert to err
49d0: 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f or code.. *.SSL_
49e0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 CLIENT_HELLO_SUC
49f0: 43 45 53 53 20 3d 20 73 75 63 63 65 73 73 0a 20 CESS = success.
4a00: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
4a50: 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c ic int.HelloCall
4a60: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a back(const SSL *
4a70: 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c ssl, int *alert,
4a80: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 void *arg) {.
4a90: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
4aa0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b r = (State*)arg;
4ab0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
4ac0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
4ad0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
4ae0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
4af0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 . int code;.
4b00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 const char *s
4b10: 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 ervername;. c
4b20: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
4b30: 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f ar *p;. size_
4b40: 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 t len, remaining
4b50: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
4b60: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
4b70: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
4b80: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
4b90: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 j*)NULL) {..retu
4ba0: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
4bb0: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 R_OK;. } else
4bc0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
4bd0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
4be0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
4bf0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
4c00: 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 Get names */.
4c10: 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74 if (!SSL_client
4c20: 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28 _hello_get0_ext(
4c30: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45 ssl, TLSEXT_TYPE
4c40: 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70 _server_name, &p
4c50: 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c , &remaining) ||
4c60: 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 remaining <= 2)
4c70: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 {. retur
4c80: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
4c90: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
4ca0: 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 . /* Extract
4cb0: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 the length of th
4cc0: 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 e supplied list
4cd0: 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 of names. */.
4ce0: 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c len = (*(p++) <
4cf0: 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d < 8);. len +=
4d00: 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 *(p++);. if
4d10: 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d 61 (len + 2 != rema
4d20: 69 6e 69 6e 67 29 20 7b 0a 20 20 20 20 20 20 20 ining) {.
4d30: 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 return SSL_CLIE
4d40: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
4d50: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e }. remain
4d60: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 ing = len;..
4d70: 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70 /* The list in p
4d80: 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73 ractice only has
4d90: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e a single elemen
4da0: 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f t, so we only co
4db0: 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 74 nsider the first
4dc0: 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 one. */. if
4dd0: 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20 (remaining == 0
4de0: 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58 || *p++ != TLSEX
4df0: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f T_NAMETYPE_host_
4e00: 6e 61 6d 65 29 20 7b 0a 20 20 20 20 20 20 20 20 name) {.
4e10: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
4e20: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
4e30: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
4e40: 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f ng--;.. /* No
4e50: 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 w we can finally
4e60: 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 pull out the by
4e70: 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 te array with th
4e80: 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d e actual hostnam
4e90: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 e. */. if (re
4ea0: 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a maining <= 2) {.
4eb0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 return S
4ec0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
4ed0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
4ee0: 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c len = (*(p++) <
4ef0: 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d < 8);. len +=
4f00: 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 *(p++);. if
4f10: 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 (len + 2 > remai
4f20: 6e 69 6e 67 29 20 7b 0a 20 20 20 20 20 20 20 20 ning) {.
4f30: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
4f40: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
4f50: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
4f60: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 ng = len;. se
4f70: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 rvername = (cons
4f80: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 t char *)p;..
4f90: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
4fa0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
4fb0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
4fc0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4fd0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4fe0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
4ff0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 _NewStringObj("h
5000: 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 ello", -1));.
5010: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5020: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5030: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
5040: 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 wStringObj(serve
5050: 72 6e 61 6d 65 2c 20 28 69 6e 74 29 6c 65 6e 29 rname, (int)len)
5060: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
5070: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
5080: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 ) interp);. T
5090: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
50a0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
50b0: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 r);.. Tcl_Inc
50c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
50d0: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 );. code = Tc
50e0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 l_EvalObjEx(inte
50f0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f rp, cmdPtr, TCL_
5100: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 EVAL_GLOBAL);.
5110: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 if (code != TC
5120: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c L_OK) {.#if (TCL
5130: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d _MAJOR_VERSION =
5140: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e = 8) && (TCL_MIN
5150: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a OR_VERSION < 6).
5160: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
5170: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 rror(interp);.#e
5180: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f lse..Tcl_Backgro
5190: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 undException(int
51a0: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 erp, code);.#end
51b0: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c if. }. Tcl
51c0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
51d0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f dPtr);.. Tcl_
51e0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
51f0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
5200: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
5210: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
5220: 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e erp);. return
5230: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
5240: 4f 5f 53 55 43 43 45 53 53 3b 0a 7d 0a 0c 0a 2f O_SUCCESS;.}.../
5250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5260: 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 ****/./* Command
5270: 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a s */./**
5280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5290: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d **/../*. *------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
52e0: 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d . * CiphersObjCm
52f0: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 d -- list availa
5300: 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 ble ciphers. *.
5310: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
5320: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 is invoked to p
5330: 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a rocess the "tls:
5340: 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e :ciphers" comman
5350: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 d. *.to list ava
5360: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 ilable ciphers,
5370: 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f based upon proto
5380: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a col selected.. *
5390: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
53a0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
53b0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 esult list.. *.
53c0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
53d0: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e *.constructs an
53e0: 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 d destroys SSL c
53f0: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a ontext (CTX). *.
5400: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5440: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
5450: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f const char *pro
5460: 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 tocols[] = {.."s
5470: 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 sl2", "ssl3", "t
5480: 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 ls1", "tls1.1",
5490: 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e "tls1.2", "tls1.
54a0: 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 3", NULL.};.enum
54b0: 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 protocol {.
54c0: 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 TLS_SSL2, TLS_SS
54d0: 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c L3, TLS_TLS1, TL
54e0: 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c S_TLS1_1, TLS_TL
54f0: 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 S1_2, TLS_TLS1_3
5500: 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 , TLS_NONE.};..s
5510: 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 tatic int.Cipher
5520: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 sObjCmd(ClientDa
5530: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
5540: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
5550: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
5560: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
5570: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
5580: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c j *objPtr = NULL
5590: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 ;. SSL_CTX *c
55a0: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 tx = NULL;. S
55b0: 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a SL *ssl = NULL;.
55c0: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c STACK_OF(SSL
55d0: 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 _CIPHER) *sk;.
55e0: 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b char *cp, buf[
55f0: 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 BUFSIZ];. int
5600: 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20 index, verbose
5610: 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 = 0, use_support
5620: 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 ed = 0;.. dpr
5630: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
5640: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c . if ((objc <
5650: 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 2) || (objc > 4
5660: 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e )) {..Tcl_WrongN
5670: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
5680: 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f , objv, "protoco
5690: 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 l ?verbose? ?sup
56a0: 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 ported?");..retu
56b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
56c0: 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f }. if (Tcl_
56d0: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 GetIndexFromObj(
56e0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c interp, objv[1],
56f0: 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f protocols, "pro
5700: 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 tocol", 0, &inde
5710: 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a x) != TCL_OK) {.
5720: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
5730: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
5740: 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 ((objc > 2) && T
5750: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f cl_GetBooleanFro
5760: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
5770: 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 v[2], &verbose)
5780: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 != TCL_OK) {..re
5790: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
57a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f }. if ((o
57b0: 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f bjc > 3) && Tcl_
57c0: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 GetBooleanFromOb
57d0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 j(interp, objv[3
57e0: 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 ], &use_supporte
57f0: 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a d) != TCL_OK) {.
5800: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
5810: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 R;. }.. ER
5820: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
5830: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 .. switch ((e
5840: 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 num protocol)ind
5850: 65 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f ex) {..case TLS_
5860: 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 SSL2:.#if OPENSS
5870: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
5880: 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 >= 0x10100000L
5890: 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 || defined(NO_SS
58a0: 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L2) || defined(O
58b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
58c0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
58d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
58e0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
58f0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
5900: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
5910: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
5920: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
5930: 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 . ctx = SSL_C
5940: 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65 74 TX_new(SSLv2_met
5950: 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 hod()); break;.#
5960: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
5970: 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 SSL3:.#if define
5980: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 d(NO_SSL3) || de
5990: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
59a0: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
59b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
59c0: 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 3_METHOD).. T
59d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
59e0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
59f0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
5a00: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
5a10: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
5a20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
5a30: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 OR;.#else.. c
5a40: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
5a50: 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 29 (SSLv3_method())
5a60: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
5a70: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a .case TLS_TLS1:.
5a80: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
5a90: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
5aa0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
5ab0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
5ac0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 SSL_NO_TLS1_METH
5ad0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 OD).. Tcl_App
5ae0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
5af0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
5b00: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
5b10: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
5b20: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
5b30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
5b40: 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 lse.. ctx = S
5b50: 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 SL_CTX_new(TLSv1
5b60: 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 _method()); brea
5b70: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 k;.#endif..case
5b80: 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 TLS_TLS1_1:.#if
5b90: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
5ba0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
5bb0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
5bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
5bd0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 SSL_NO_TLS1_1_ME
5be0: 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 THOD).. Tcl_A
5bf0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
5c00: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e rp, protocols[in
5c10: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f dex], ": protoco
5c20: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
5c30: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 , NULL);.. re
5c40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
5c50: 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d #else.. ctx =
5c60: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 SSL_CTX_new(TLS
5c70: 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 v1_1_method());
5c80: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
5c90: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a ase TLS_TLS1_2:.
5ca0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
5cb0: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
5cc0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
5cd0: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
5ce0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
5cf0: 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 2_METHOD).. T
5d00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
5d10: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
5d20: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
5d30: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
5d40: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
5d50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
5d60: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 OR;.#else.. c
5d70: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
5d80: 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 (TLSv1_2_method(
5d90: 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 )); break;.#endi
5da0: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
5db0: 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _3:.#if defined(
5dc0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
5dd0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
5de0: 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 63 _TLS1_3).. Tc
5df0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
5e00: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
5e10: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
5e20: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
5e30: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
5e40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
5e50: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 R;.#else.. ct
5e60: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 x = SSL_CTX_new(
5e70: 54 4c 53 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 20 TLS_method());.
5e80: 20 20 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43 SSL_C
5e90: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f TX_set_min_proto
5ea0: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
5eb0: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 S1_3_VERSION);..
5ec0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
5ed0: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f max_proto_versio
5ee0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
5ef0: 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 RSION);.. bre
5f00: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 ak;.#endif..defa
5f10: 75 6c 74 3a 0a 09 20 20 20 20 62 72 65 61 6b 3b ult:.. break;
5f20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 . }. if (c
5f30: 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 tx == NULL) {..T
5f40: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
5f50: 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 interp, REASON()
5f60: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
5f70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
5f80: 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c }.. ssl = SSL
5f90: 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 _new(ctx);. i
5fa0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 f (ssl == NULL)
5fb0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
5fc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 ult(interp, REAS
5fd0: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 ON(), NULL);..SS
5fe0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
5ff0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
6000: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
6010: 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f * Use list and o
6020: 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 rder as would be
6030: 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e sent in a Clien
6040: 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 tHello or all av
6050: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 ailable ciphers
6060: 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 */. if (use_s
6070: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 upported) {..sk
6080: 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f = SSL_get1_suppo
6090: 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c rted_ciphers(ssl
60a0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
60b0: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 .sk = SSL_get_ci
60c0: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 phers(ssl);.
60d0: 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d }.. if (sk !=
60e0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 NULL) {..if (!v
60f0: 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f erbose) {.. o
6100: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
6110: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
6120: 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 .. for (int i
6130: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c = 0; i < sk_SSL
6140: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b _CIPHER_num(sk);
6150: 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 i++) {...const
6160: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 SSL_CIPHER *c =
6170: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 sk_SSL_CIPHER_va
6180: 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 lue(sk, i);...if
6190: 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e (c == NULL) con
61a0: 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 tinue;..../* cip
61b0: 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e her name or (NON
61c0: 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c E) */...cp = SSL
61d0: 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 _CIPHER_get_name
61e0: 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d (c);...if (cp ==
61f0: 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 NULL) break;...
6200: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
6210: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
6220: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
6230: 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 StringObj(cp, -1
6240: 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 ));.. }...} e
6250: 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 lse {.. objPt
6260: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e r = Tcl_NewStrin
6270: 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 gObj("",0);..
6280: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b for (int i = 0;
6290: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 i < sk_SSL_CIPH
62a0: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 ER_num(sk); i++)
62b0: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 {...const SSL_C
62c0: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 IPHER *c = sk_SS
62d0: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 L_CIPHER_value(s
62e0: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d k, i);...if (c =
62f0: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 = NULL) continue
6300: 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 ;..../* textual
6310: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 description of t
6320: 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 he cipher */...i
6330: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 f (SSL_CIPHER_de
6340: 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 scription(c, buf
6350: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 , sizeof(buf)) !
6360: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 = NULL) {...
6370: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 Tcl_AppendToObj(
6380: 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 69 6e objPtr, buf, (in
6390: 74 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b t) strlen(buf));
63a0: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 ...} else {...
63b0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 Tcl_AppendToOb
63c0: 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f j(objPtr, "UNKNO
63d0: 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 WN\n", 8);...}..
63e0: 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 }..}..if (us
63f0: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 e_supported) {..
6400: 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 sk_SSL_CIPHE
6410: 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 R_free(sk);..}.
6420: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 }. SSL_fre
6430: 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f e(ssl);. SSL_
6440: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a CTX_free(ctx);..
6450: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
6460: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
6470: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
6480: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
6490: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
64a0: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
64f0: 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f *. * ProtocolsO
6500: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 bjCmd -- list av
6510: 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c ailable protocol
6520: 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f s. *. *.This pro
6530: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
6540: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 d to process the
6550: 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 "tls::protocols
6560: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 " command. *.to
6570: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 list available p
6580: 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 rotocols.. *. *
6590: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
65a0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
65b0: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 t list.. *. * Si
65c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
65d0: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
65e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
6620: 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 .static int.Prot
6630: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65 ocolsObjCmd(Clie
6640: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
6650: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
6660: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
6670: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
6680: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
6690: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a l_Obj *objPtr;..
66a0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
66b0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
66c0: 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 objc != 1) {..Tc
66d0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
66e0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
66f0: 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c "");..return TCL
6700: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
6710: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
6720: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
6730: 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 LL);..#if OPENSS
6740: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
6750: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 < 0x10100000L &
6760: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 & !defined(NO_SS
6770: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L2) && !defined(
6780: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
6790: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
67a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
67b0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
67c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
67d0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c rotocols[TLS_SSL
67e0: 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 2], -1));.#endif
67f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
6800: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
6810: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
6820: 4c 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 L3). Tcl_List
6830: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
6840: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
6850: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
6860: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
6870: 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e SSL3], -1));.#en
6880: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
6890: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 (NO_TLS1) && !de
68a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
68b0: 5f 54 4c 53 31 29 0a 20 20 20 20 54 63 6c 5f 4c _TLS1). Tcl_L
68c0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
68d0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
68e0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
68f0: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
6900: 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a LS_TLS1], -1));.
6910: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
6920: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 ned(NO_TLS1_1) &
6930: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
6940: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 SL_NO_TLS1_1).
6950: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
6960: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
6970: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
6980: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
6990: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 ocols[TLS_TLS1_1
69a0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
69b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
69c0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
69d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
69e0: 4c 53 31 5f 32 29 0a 20 20 20 20 54 63 6c 5f 4c LS1_2). Tcl_L
69f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
6a00: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
6a10: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
6a20: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
6a30: 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 LS_TLS1_2], -1))
6a40: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
6a50: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
6a60: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
6a70: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
6a80: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
6a90: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
6aa0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
6ab0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
6ac0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
6ad0: 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 _3], -1));.#endi
6ae0: 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 f.. Tcl_SetOb
6af0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
6b00: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
6b10: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
6b20: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
6b30: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
6b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b80: 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 --. *. * Handsha
6b90: 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 keObjCmd --. *.
6ba0: 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 *.This command i
6bb0: 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 s used to verify
6bc0: 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e whether the han
6bd0: 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 dshake is comple
6be0: 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a te. *.or not.. *
6bf0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
6c00: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
6c10: 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 esult. 1 means h
6c20: 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 andshake complet
6c30: 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 e, 0 means pendi
6c40: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ng.. *. * Side e
6c50: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 ffects:. *.May f
6c60: 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 orce SSL negotia
6c70: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 tion to take pla
6c80: 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ce.. *. *-------
6c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
6cd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 .static int Hand
6ce0: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 shakeObjCmd(Clie
6cf0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
6d00: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
6d10: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
6d20: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
6d30: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
6d40: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 l_Channel chan;
6d50: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 /* The ch
6d60: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
6d70: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 ode on. */. S
6d80: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 tate *statePtr;
6d90: 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 /* client
6da0: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
6db0: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e ocket */. con
6dc0: 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 st char *errStr
6dd0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
6de0: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 ret = 1;. int
6df0: 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 err = 0;.. d
6e00: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
6e10: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
6e20: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
6e30: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
6e40: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
6e50: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 nel");..return(T
6e60: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
6e70: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
6e80: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
6e90: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
6ea0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d gFromObj(objv[1]
6eb0: 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a , NULL), NULL);.
6ec0: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
6ed0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
6ee0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 LL) {..return(TC
6ef0: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a L_ERROR);. }.
6f00: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
6f10: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
6f20: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
6f30: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
6f40: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
6f50: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 nel(chan);. i
6f60: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
6f70: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
6f80: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
6f90: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
6fa0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
6fb0: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
6fc0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
6fd0: 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e me(chan), "\": n
6fe0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
6ff0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
7000: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
7010: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 }. statePtr
7020: 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f = (State *)Tcl_
7030: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
7040: 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 ceData(chan);..
7050: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
7060: 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 ing Tls_WaitForC
7070: 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 onnect");. re
7080: 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 t = Tls_WaitForC
7090: 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c onnect(statePtr,
70a0: 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 &err, 1);. d
70b0: 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 printf("Tls_Wait
70c0: 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 ForConnect retur
70d0: 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a ned: %i", ret);.
70e0: 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 . if (ret < 0
70f0: 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e && ((statePtr->
7100: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
7110: 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d ASYNC) && (err =
7120: 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 = EAGAIN))) {..d
7130: 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 printf("Async se
7140: 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 t and err = EAGA
7150: 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a IN");..ret = 0;.
7160: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 } else if (r
7170: 65 74 20 3c 20 30 29 20 7b 0a 09 65 72 72 53 74 et < 0) {..errSt
7180: 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 r = statePtr->er
7190: 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 r;..Tcl_ResetRes
71a0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 ult(interp);..Tc
71b0: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b l_SetErrno(err);
71c0: 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c ...if (!errStr |
71d0: 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 | (*errStr == 0)
71e0: 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 ) {.. errStr
71f0: 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 = Tcl_PosixError
7200: 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 (interp);..}...T
7210: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
7220: 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 interp, "handsha
7230: 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 ke failed: ", er
7240: 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e rStr, (char *) N
7250: 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 ULL);..dprintf("
7260: 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 Returning TCL_ER
7270: 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 ROR with handsha
7280: 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 ke failed: %s",
7290: 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e errStr);..return
72a0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
72b0: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 } else {..if (e
72c0: 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 rr != 0) {..
72d0: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 dprintf("Got an
72e0: 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d error with a com
72f0: 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 pleted handshake
7300: 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 : err = %i", err
7310: 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a );..}..ret = 1;.
7320: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
7330: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 tf("Returning TC
7340: 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c L_OK with data \
7350: 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 "%i\"", ret);.
7360: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
7370: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
7380: 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a ewIntObj(ret));.
7390: 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f return(TCL_O
73a0: 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 K);..clientData
73b0: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a = clientData;.}.
73c0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
73d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
73e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
73f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
7410: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a ImportObjCmd --.
7420: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
7430: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
7440: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
7450: 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a ssl" command. *.
7460: 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 *.The ssl comma
7470: 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 nd pushes SSL ov
7480: 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e er a (newly conn
7490: 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 ected) tcp socke
74a0: 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a t. *. * Results:
74b0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
74c0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
74d0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
74e0: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 *.May modify the
74f0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 behavior of an
7500: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 IO channel.. *.
7510: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
7520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7550: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
7560: 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 int.ImportObjCmd
7570: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
7580: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
7590: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
75a0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
75b0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
75c0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
75d0: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
75e0: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
75f0: 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 de on. */. St
7600: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 ate *statePtr;..
7610: 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 /* client state
7620: 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a for ssl socket *
7630: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 /. SSL_CTX *c
7640: 74 78 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c tx. = NUL
7650: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
7660: 73 63 72 69 70 74 09 20 20 20 20 20 20 20 20 3d script. =
7670: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f NULL;. Tcl_O
7680: 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 bj *password.
7690: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
76a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 Tcl_DString upp
76b0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
76c0: 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e tion, upperChann
76d0: 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 elBlocking, uppe
76e0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
76f0: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f , upperChannelEO
7700: 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 FChar;. int i
7710: 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 dx, len;. int
7720: 20 66 6c 61 67 73 09 09 20 20 20 20 20 20 20 20 flags..
7730: 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a = TLS_TCL_INIT;.
7740: 20 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 int server..
7750: 20 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 = 0;./*
7760: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e is connection in
7770: 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 coming or outgoi
7780: 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 ng? */. char
7790: 2a 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 *keyfile.
77a0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
77b0: 72 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20 20 r *certfile.
77c0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
77d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
77e0: 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ey .= NULL;.
77f0: 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20 20 int key_len
7800: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 = 0
7810: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ;. unsigned c
7820: 68 61 72 20 2a 63 65 72 74 20 20 20 20 20 20 20 har *cert
7830: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e = NULL;. in
7840: 74 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 t cert_len
7850: 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 = 0;.
7860: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 char *ciphers
7870: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
7880: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 . char *ciphe
7890: 72 73 75 69 74 65 73 09 20 20 20 20 20 20 20 20 rsuites.
78a0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
78b0: 20 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 *CAfile.
78c0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
78d0: 72 20 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 r *CAdir..
78e0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 = NULL;. ch
78f0: 61 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 ar *DHparams.
7900: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
7910: 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 char *model..
7920: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
7930: 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 char *serverna
7940: 6d 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c me. = NUL
7950: 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 L;./* hostname f
7960: 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 or Server Name I
7970: 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 ndication */.
7980: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
7990: 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 char *session_id
79a0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
79b0: 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 _Obj *alpn..= NU
79c0: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 LL;. int ssl2
79d0: 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a = 0, ssl3 = 0;.
79e0: 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 int tls1 = 1
79f0: 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c , tls1_1 = 1, tl
7a00: 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 s1_2 = 1, tls1_3
7a10: 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 = 1;. int pr
7a20: 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d oto = 0, level =
7a30: 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 -1;. int ver
7a40: 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 ify = 0, require
7a50: 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 = 0, request =
7a60: 31 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 1;.. dprintf(
7a70: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 "Called");..#if
7a80: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
7a90: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
7aa0: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 000L && !defined
7ab0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
7ac0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f ) && !defined(NO
7ad0: 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e 65 _SSL2) && define
7ae0: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 d(NO_SSL3) && de
7af0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 fined(NO_TLS1) &
7b00: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 & defined(NO_TLS
7b10: 31 5f 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 1_1) && defined(
7b20: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 64 65 NO_TLS1_2) && de
7b30: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
7b40: 0a 20 20 20 20 73 73 6c 32 20 3d 20 31 3b 0a 23 . ssl2 = 1;.#
7b50: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
7b60: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
7b70: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
7b80: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 66 69 NO_SSL3) && defi
7b90: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 ned(NO_SSL2) &&
7ba0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
7bb0: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 && defined(NO_T
7bc0: 4c 53 31 5f 31 29 20 26 26 20 64 65 66 69 6e 65 LS1_1) && define
7bd0: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 d(NO_TLS1_2) &&
7be0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
7bf0: 33 29 0a 20 20 20 20 73 73 6c 33 20 3d 20 31 3b 3). ssl3 = 1;
7c00: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
7c10: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 ned(NO_TLS1) ||
7c20: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7c30: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 NO_TLS1). tls
7c40: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 1 = 0;.#endif.#i
7c50: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
7c60: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_1) || defined(
7c70: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
7c80: 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 1). tls1_1 =
7c90: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
7ca0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
7cb0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7cc0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 SSL_NO_TLS1_2).
7cd0: 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 tls1_2 = 0;.#
7ce0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
7cf0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 d(NO_TLS1_3) ||
7d00: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7d10: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 NO_TLS1_3). t
7d20: 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 ls1_3 = 0;.#endi
7d30: 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 f.. if (objc
7d40: 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e < 2) {..Tcl_Wron
7d50: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
7d60: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
7d70: 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a el ?options?");.
7d80: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7d90: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 R;. }.. ch
7da0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
7db0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f nel(interp, Tcl_
7dc0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
7dd0: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c (objv[1], NULL),
7de0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
7df0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
7e00: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
7e10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7e20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
7e30: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
7e40: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
7e50: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
7e60: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
7e70: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
7e80: 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 ;.. for (idx
7e90: 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b = 2; idx < objc;
7ea0: 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 idx++) {..char
7eb0: 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 *opt = Tcl_GetSt
7ec0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
7ed0: 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 [idx], NULL);...
7ee0: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d if (opt[0] != '-
7ef0: 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a ').. break;..
7f00: 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 .OPTSTR("-cadir"
7f10: 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 , CAdir);..OPTST
7f20: 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 R("-cafile", CAf
7f30: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
7f40: 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 certfile", certf
7f50: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
7f60: 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 cipher", ciphers
7f70: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 );..OPTSTR("-cip
7f80: 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b hers", ciphers);
7f90: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 ..OPTSTR("-ciphe
7fa0: 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 rsuites", cipher
7fb0: 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a suites);..OPTOBJ
7fc0: 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 ("-command", scr
7fd0: 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ipt);..OPTSTR("-
7fe0: 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 dhparams", DHpar
7ff0: 61 6d 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ams);..OPTSTR("-
8000: 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c keyfile", keyfil
8010: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f e);..OPTSTR("-mo
8020: 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f del", model);..O
8030: 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 PTOBJ("-password
8040: 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f ", password);..O
8050: 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 PTBOOL("-require
8060: 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 ", require);..OP
8070: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 TBOOL("-request"
8080: 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 , request);..OPT
8090: 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 6c 65 INT("-securityle
80a0: 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f vel", level);..O
80b0: 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 PTBOOL("-server"
80c0: 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 , server);..OPTS
80d0: 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 TR("-servername"
80e0: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 , servername);..
80f0: 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e OPTSTR("-session
8100: 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 _id", session_id
8110: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 );..OPTOBJ("-alp
8120: 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 42 n", alpn);..OPTB
8130: 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c OOL("-ssl2", ssl
8140: 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 2);..OPTBOOL("-s
8150: 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 sl3", ssl3);..OP
8160: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 TBOOL("-tls1", t
8170: 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 ls1);..OPTBOOL("
8180: 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 -tls1.1", tls1_1
8190: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
81a0: 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a s1.2", tls1_2);.
81b0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e .OPTBOOL("-tls1.
81c0: 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 3", tls1_3);..OP
81d0: 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 TBYTE("-cert", c
81e0: 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a ert, cert_len);.
81f0: 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c .OPTBYTE("-key",
8200: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a key, key_len);.
8210: 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e ..OPTBAD("option
8220: 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 ", "-alpn, -cadi
8230: 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 r, -cafile, -cer
8240: 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 t, -certfile, -c
8250: 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 ipher, -ciphersu
8260: 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 ites, -command,
8270: 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c -dhparams, -key,
8280: 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 -keyfile, -mode
8290: 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 72 l, -password, -r
82a0: 65 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73 74 equire, -request
82b0: 2c 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c , -securitylevel
82c0: 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 , -server, -serv
82d0: 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e ername, -session
82e0: 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c _id, -ssl2, -ssl
82f0: 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 3, -tls1, -tls1.
8300: 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 6f 72 20 2d 1, -tls1.2, or -
8310: 74 6c 73 31 2e 33 22 29 3b 0a 0a 09 72 65 74 75 tls1.3");...retu
8320: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
8330: 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 }. if (requ
8340: 65 73 74 29 09 20 20 20 20 76 65 72 69 66 79 20 est). verify
8350: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c |= SSL_VERIFY_CL
8360: 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f IENT_ONCE | SSL_
8370: 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 VERIFY_PEER;.
8380: 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 if (request &&
8390: 72 65 71 75 69 72 65 29 20 76 65 72 69 66 79 20 require) verify
83a0: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 |= SSL_VERIFY_FA
83b0: 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 IL_IF_NO_PEER_CE
83c0: 52 54 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 RT;. if (veri
83d0: 66 79 20 3d 3d 20 30 29 09 76 65 72 69 66 79 20 fy == 0).verify
83e0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e = SSL_VERIFY_NON
83f0: 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d E;.. proto |=
8400: 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f (ssl2 ? TLS_PRO
8410: 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 TO_SSL2 : 0);.
8420: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 proto |= (ssl3
8430: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c ? TLS_PROTO_SSL
8440: 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 3 : 0);. prot
8450: 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 o |= (tls1 ? TLS
8460: 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 _PROTO_TLS1 : 0)
8470: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
8480: 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f tls1_1 ? TLS_PRO
8490: 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a TO_TLS1_1 : 0);.
84a0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
84b0: 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f s1_2 ? TLS_PROTO
84c0: 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 _TLS1_2 : 0);.
84d0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
84e0: 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _3 ? TLS_PROTO_T
84f0: 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 LS1_3 : 0);..
8500: 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c /* reset to NUL
8510: 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e L if blank strin
8520: 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 g provided */.
8530: 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a if (cert && !*
8540: 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63 cert).. c
8550: 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ert. = NU
8560: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 LL;. if (key
8570: 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 && !*key)..
8580: 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d key. =
8590: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
85a0: 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 ertfile && !*cer
85b0: 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 tfile) c
85c0: 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a ertfile.= NULL;.
85d0: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 if (keyfile
85e0: 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b && !*keyfile)..k
85f0: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d eyfile. =
8600: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
8610: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 iphers && !*ciph
8620: 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70 ers). cip
8630: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e hers. = N
8640: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 ULL;. if (cip
8650: 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 hersuites && !*c
8660: 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70 iphersuites) cip
8670: 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e hersuites = N
8680: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 ULL;. if (CAf
8690: 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 ile && !*CAfile)
86a0: 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 . CAfile.
86b0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
86c0: 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26 if (CAdir &&
86d0: 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 20 !*CAdir).
86e0: 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20 20 CAdir.
86f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
8700: 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 DHparams && !*DH
8710: 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 params).
8720: 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 DHparams
8730: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 = NULL;.. /*
8740: 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f new SSL state */
8750: 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d . statePtr..=
8760: 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c (State *) ckall
8770: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 oc((unsigned) si
8780: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 zeof(State));.
8790: 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 memset(statePt
87a0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 r, 0, sizeof(Sta
87b0: 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 te));.. state
87c0: 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 Ptr->flags.= fla
87d0: 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 gs;. statePtr
87e0: 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 ->interp.= inter
87f0: 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d p;. statePtr-
8800: 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 >vflags.= verify
8810: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
8820: 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f err.= "";.. /
8830: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 * allocate scrip
8840: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 t */. if (scr
8850: 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 ipt) {..(void) T
8860: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
8870: 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e Obj(script, &len
8880: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
8890: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 statePtr->ca
88a0: 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b llback = script;
88b0: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
88c0: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
88d0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 >callback);..}.
88e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
88f0: 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a ocate password *
8900: 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f /. if (passwo
8910: 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 rd) {..(void) Tc
8920: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
8930: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 bj(password, &le
8940: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
8950: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 . statePtr->p
8960: 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f assword = passwo
8970: 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 rd;.. Tcl_Inc
8980: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
8990: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 tr->password);..
89a0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 }. }.. if
89b0: 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 (model != NULL)
89c0: 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a {..int mode;../*
89d0: 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 Get the "model"
89e0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 context */..cha
89f0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
8a00: 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c el(interp, model
8a10: 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 , &mode);..if (c
8a20: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
8a30: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 nel) NULL) {..
8a40: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
8a50: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
8a60: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
8a70: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 RROR;..}.../*..
8a80: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
8a90: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
8aa0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 pmost channel..
8ab0: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 */..chan = Tcl_G
8ac0: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
8ad0: 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 n);..if (Tcl_Get
8ae0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
8af0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
8b00: 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 Type()) {.. T
8b10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8b20: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
8b30: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
8b40: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
8b50: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 n),..."\": not a
8b60: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
8b70: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
8b80: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
8b90: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
8ba0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
8bb0: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 }..ctx = ((State
8bc0: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
8bd0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
8be0: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d an))->ctx;. }
8bf0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 else {..if ((ct
8c00: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 x = CTX_Init(sta
8c10: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 tePtr, server, p
8c20: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 roto, keyfile, c
8c30: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 ertfile, key, ce
8c40: 72 74 2c 0a 09 20 20 20 20 6b 65 79 5f 6c 65 6e rt,.. key_len
8c50: 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 , cert_len, CAdi
8c60: 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 r, CAfile, ciphe
8c70: 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 rs, ciphersuites
8c80: 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d , level, DHparam
8c90: 73 29 29 20 3d 3d 20 28 53 53 4c 5f 43 54 58 2a s)) == (SSL_CTX*
8ca0: 29 30 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 )0) {.. Tls_F
8cb0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
8cc0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
8cd0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
8ce0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 }. }.. sta
8cf0: 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 tePtr->ctx = ctx
8d00: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
8d10: 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 We need to make
8d20: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 sure that the c
8d30: 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 hannel works in
8d40: 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a binary (for the.
8d50: 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f * encryptio
8d60: 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f n not to get goo
8d70: 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 fed up).. *
8d80: 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 We only want to
8d90: 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66 65 adjust the buffe
8da0: 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 63 ring in pre-v2 c
8db0: 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 hannels, where.
8dc0: 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e 6e * each chann
8dd0: 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 el in the stack
8de0: 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20 6f maintained its o
8df0: 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20 20 wn buffers..
8e00: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 */. Tcl_DStr
8e10: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
8e20: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
8e30: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
8e40: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
8e50: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 nnelBlocking);.
8e60: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
8e70: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
8e80: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 EOFChar);. Tc
8e90: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
8ea0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
8eb0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 ing);. Tcl_Ge
8ec0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
8ed0: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 nterp, chan, "-e
8ee0: 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 ofchar", &upperC
8ef0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a hannelEOFChar);.
8f00: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e Tcl_GetChann
8f10: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
8f20: 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e chan, "-encodin
8f30: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 g", &upperChanne
8f40: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 lEncoding);.
8f50: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
8f60: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
8f70: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
8f80: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
8f90: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 Translation);.
8fa0: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
8fb0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
8fc0: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 han, "-blocking"
8fd0: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 , &upperChannelB
8fe0: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 locking);. Tc
8ff0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
9000: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
9010: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c "-translation",
9020: 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 "binary");.
9030: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
9040: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
9050: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 n, "-blocking",
9060: 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 "true");. dpr
9070: 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 intf("Consuming
9080: 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c Tcl channel %s",
9090: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
90a0: 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 ame(chan));.
90b0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
90c0: 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 Tcl_StackChanne
90d0: 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 l(interp, Tls_Ch
90e0: 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c annelType(), (Cl
90f0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
9100: 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 4c tr, (TCL_READABL
9110: 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 E | TCL_WRITABLE
9120: 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 ), chan);. dp
9130: 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 63 rintf("Created c
9140: 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 hannel named %s"
9150: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
9160: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
9170: 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73 elf));. if (s
9180: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d tatePtr->self ==
9190: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
91a0: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e ULL) {../*.. * N
91b0: 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 o use of Tcl_Eve
91c0: 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61 ntuallyFree beca
91d0: 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 use no possible
91e0: 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 Tcl_Preserve...
91f0: 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 */..Tls_Free((ch
9200: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
9210: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
9220: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
9230: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
9240: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
9250: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 ePtr->self, "-tr
9260: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f anslation", Tcl_
9270: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
9280: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
9290: 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c ation));. Tcl
92a0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
92b0: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
92c0: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f tr->self, "-enco
92d0: 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 ding", Tcl_DStri
92e0: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
92f0: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b annelEncoding));
9300: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
9310: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
9320: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
9330: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 , "-eofchar", Tc
9340: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
9350: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
9360: 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 har));. Tcl_S
9370: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
9380: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
9390: 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 ->self, "-blocki
93a0: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 ng", Tcl_DString
93b0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
93c0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a nelBlocking));..
93d0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 /*. * SS
93e0: 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e L Initialization
93f0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 . */. sta
9400: 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c tePtr->ssl = SSL
9410: 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 _new(statePtr->c
9420: 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 tx);. if (!st
9430: 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 atePtr->ssl) {..
9440: 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 /* SSL library e
9450: 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 rror */..Tcl_App
9460: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
9470: 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 , "couldn't cons
9480: 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f truct ssl sessio
9490: 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 n: ", REASON(),
94a0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
94b0: 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 .Tls_Free((char
94c0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 *) statePtr);..r
94d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
94e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
94f0: 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e et host server n
9500: 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 ame */. if (s
9510: 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a ervername) {../*
9520: 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72 Sets the server
9530: 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e name indication
9540: 20 28 53 4e 49 29 20 43 6c 69 65 6e 74 48 65 6c (SNI) ClientHel
9550: 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a lo extension */.
9560: 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c .if (!SSL_set_tl
9570: 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 sext_host_name(s
9580: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 tatePtr->ssl, se
9590: 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 rvername) && req
95a0: 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c uire) {.. Tcl
95b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
95c0: 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54 terp, "setting T
95d0: 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 LS host name ext
95e0: 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 ension failed",
95f0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
9600: 20 20 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f Tls_
9610: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
9620: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 atePtr);.
9630: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f return TCL_
9640: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d ERROR;. }
9650: 0a 0a 09 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 .../* Configure
9660: 73 65 72 76 65 72 20 68 6f 73 74 20 6e 61 6d 65 server host name
9670: 20 63 68 65 63 6b 73 20 69 6e 20 74 68 65 20 53 checks in the S
9680: 53 4c 20 63 6c 69 65 6e 74 2e 20 53 65 74 20 44 SL client. Set D
9690: 4e 53 20 68 6f 73 74 6e 61 6d 65 20 74 6f 0a 09 NS hostname to..
96a0: 20 20 20 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 name for peer
96b0: 20 63 65 72 74 69 66 69 63 61 74 65 20 63 68 65 certificate che
96c0: 63 6b 73 2e 20 53 53 4c 5f 73 65 74 31 5f 68 6f cks. SSL_set1_ho
96d0: 73 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f st has limitatio
96e0: 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c ns. */..if (!SSL
96f0: 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 _add1_host(state
9700: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 Ptr->ssl, server
9710: 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 name)) {.. Tc
9720: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
9730: 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 nterp, "setting
9740: 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66 61 DNS host name fa
9750: 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 iled", (char *)
9760: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 NULL);.
9770: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
9780: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
9790: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 retu
97a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
97b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 . }.. /* R
97c0: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 esume session id
97d0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 */. if (sess
97e0: 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e ion_id && strlen
97f0: 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 (session_id) <=
9800: 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f SSL_MAX_SID_CTX_
9810: 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 LENGTH) {../* SS
9820: 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 L_set_session()
9830: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 */..if (!SSL_SES
9840: 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e SION_set1_id_con
9850: 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 text(SSL_get_ses
9860: 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 sion(statePtr->s
9870: 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c sl), session_id,
9880: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 (unsigned int)
9890: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 strlen(session_i
98a0: 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f d))) {.. Tcl_
98b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
98c0: 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 erp, "Resume ses
98d0: 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 73 69 sion id ", sessi
98e0: 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 64 22 on_id, " failed"
98f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9900: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6c ;. Tl
9910: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
9920: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 statePtr);.
9930: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 return TC
9940: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 L_ERROR;..}.
9950: 7d 0a 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 }.. if (alpn)
9960: 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 {../* Convert a
9970: 20 54 63 6c 20 6c 69 73 74 20 69 6e 74 6f 20 61 Tcl list into a
9980: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 protocol-list i
9990: 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f n wire-format */
99a0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
99b0: 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e *protos, *p;..un
99c0: 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f signed int proto
99d0: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 s_len = 0;..int
99e0: 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 i, len, cnt;..Tc
99f0: 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 l_Obj **list;...
9a00: 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 if (Tcl_ListObjG
9a10: 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 etElements(inter
9a20: 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 p, alpn, &cnt, &
9a30: 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 list) != TCL_OK)
9a40: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
9a50: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
9a60: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
9a70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
9a80: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 ./* Determine th
9a90: 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 e memory require
9aa0: 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 d for the protoc
9ab0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 ol-list */..for
9ac0: 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b (i = 0; i < cnt;
9ad0: 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c i++) {.. Tcl
9ae0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
9af0: 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 j(list[i], &len)
9b00: 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e ;.. if (len >
9b10: 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 255) {...Tcl_Ap
9b20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
9b30: 70 2c 20 22 61 6c 70 6e 20 70 72 6f 74 6f 63 6f p, "alpn protoco
9b40: 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 l name too long"
9b50: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9b60: 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63 68 ;...Tls_Free((ch
9b70: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
9b80: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
9b90: 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 ROR;.. }..
9ba0: 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 protos_len += 1
9bb0: 20 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 + len;..}.../*
9bc0: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 Build the comple
9bd0: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 te protocol-list
9be0: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b */..protos = ck
9bf0: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e alloc(protos_len
9c00: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d );../* protocol-
9c10: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 lists consist of
9c20: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 8-bit length-pr
9c30: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 efixed, byte str
9c40: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 69 20 ings */..for (i
9c50: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b = 0, p = protos;
9c60: 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b i < cnt; i++) {
9c70: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 .. char *str
9c80: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
9c90: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 romObj(list[i],
9ca0: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b &len);.. *p++
9cb0: 20 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d = len;.. mem
9cc0: 63 70 79 28 70 2c 20 73 74 72 2c 20 6c 65 6e 29 cpy(p, str, len)
9cd0: 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b ;.. p += len;
9ce0: 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 ..}.../* SSL_set
9cf0: 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b _alpn_protos mak
9d00: 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 es a copy of the
9d10: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a protocol-list *
9d20: 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 /../* Note: This
9d30: 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 functions rever
9d40: 73 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 ses the return v
9d50: 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 alue convention
9d60: 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f */..if (SSL_set_
9d70: 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 alpn_protos(stat
9d80: 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f ePtr->ssl, proto
9d90: 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 s, protos_len))
9da0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
9db0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
9dc0: 22 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 61 "failed to set a
9dd0: 6c 70 6e 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 lpn protocols",
9de0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
9df0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
9e00: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
9e10: 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72 ;.. ckfree(pr
9e20: 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75 otos);.. retu
9e30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
9e40: 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 .../* Store prot
9e50: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 ocols list */..s
9e60: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
9e70: 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 = protos;..state
9e80: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 Ptr->protos_len
9e90: 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 = protos_len;.
9ea0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 } else {..stat
9eb0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e ePtr->protos = N
9ec0: 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e ULL;..statePtr->
9ed0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a protos_len = 0;.
9ee0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
9ef0: 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 * SSL Callbac
9f00: 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 ks. */. S
9f10: 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_set_app_data(
9f20: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 statePtr->ssl, (
9f30: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
9f40: 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 ;./* point back
9f50: 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c to us */. SSL
9f60: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 _set_verify(stat
9f70: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 ePtr->ssl, verif
9f80: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 y, VerifyCallbac
9f90: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f k);. SSL_CTX_
9fa0: 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 set_info_callbac
9fb0: 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c k(statePtr->ctx,
9fc0: 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a InfoCallback);.
9fd0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 . /* Create T
9fe0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 cl_Channel BIO H
9ff0: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 andler */. st
a000: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 atePtr->p_bio.=
a010: 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 BIO_new_tcl(stat
a020: 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 ePtr, BIO_NOCLOS
a030: 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 E);. statePtr
a040: 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 ->bio.= BIO_new(
a050: 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 BIO_f_ssl());..
a060: 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20 7b if (server) {
a070: 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c ../* Server call
a080: 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 backs */..SSL_CT
a090: 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 X_set_alpn_selec
a0a0: 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 t_cb(statePtr->c
a0b0: 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b tx, ALPNCallback
a0c0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
a0d0: 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 tr);..SSL_CTX_se
a0e0: 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e t_tlsext_servern
a0f0: 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 ame_arg(statePtr
a100: 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 ->ctx, (void *)s
a110: 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 tatePtr);..SSL_C
a120: 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 TX_set_tlsext_se
a130: 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 rvername_callbac
a140: 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c k(statePtr->ctx,
a150: 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 SNICallback);..
a160: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 SSL_CTX_set_clie
a170: 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 nt_hello_cb(stat
a180: 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f ePtr->ctx, Hello
a190: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 Callback, (void
a1a0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 09 73 *)statePtr);...s
a1b0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c tatePtr->flags |
a1c0: 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 = TLS_TCL_SERVER
a1d0: 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 ;..SSL_set_accep
a1e0: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 t_state(statePtr
a1f0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c ->ssl);. } el
a200: 73 65 20 7b 0a 09 2f 2a 20 53 65 73 73 69 6f 6e se {../* Session
a210: 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c caching */..SSL
a220: 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e _CTX_set_session
a230: 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 _cache_mode(stat
a240: 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 ePtr->ctx, SSL_S
a250: 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 ESS_CACHE_CLIENT
a260: 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 | SSL_SESS_CACH
a270: 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 E_NO_INTERNAL_ST
a280: 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ORE);..SSL_CTX_s
a290: 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 ess_set_new_cb(s
a2a0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 tatePtr->ctx, Se
a2b0: 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a ssionCallback);.
a2c0: 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 ..SSL_set_connec
a2d0: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 t_state(statePtr
a2e0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 ->ssl);. }.
a2f0: 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 SSL_set_bio(st
a300: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 atePtr->ssl, sta
a310: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 tePtr->p_bio, st
a320: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a atePtr->p_bio);.
a330: 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 BIO_set_ssl(
a340: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 statePtr->bio, s
a350: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 tatePtr->ssl, BI
a360: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 O_NOCLOSE);..
a370: 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f /*. * End o
a380: 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 f SSL Init.
a390: 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 */. dprintf("
a3a0: 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 Returning %s", T
a3b0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
a3c0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
a3d0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 ));. Tcl_SetR
a3e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 esult(interp, (c
a3f0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 har *) Tcl_GetCh
a400: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
a410: 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 tr->self), TCL_V
a420: 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 OLATILE);.. r
a430: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
a440: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
a450: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ntData;.}.../*.
a460: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
a470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a4a0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 ----. *. * Unimp
a4b0: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a ortObjCmd --. *.
a4c0: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
a4d0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
a4e0: 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f remove the topmo
a4f0: 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 st channel filte
a500: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
a510: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
a520: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
a530: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
a540: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 *.May modify th
a550: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e e behavior of an
a560: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a IO channel.. *.
a570: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
a580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a5b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
a5c0: 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a int.UnimportObj
a5d0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
a5e0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
a5f0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
a600: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
a610: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
a620: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
a630: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
a640: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
a650: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 mode on. */..
a660: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
a670: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
a680: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc != 2) {..Tcl_
a690: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
a6a0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
a6b0: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 hannel");..retur
a6c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
a6d0: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
a6e0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
a6f0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
a700: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 ing(objv[1]), NU
a710: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
a720: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
a730: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
a740: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
a750: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
a760: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
a770: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
a780: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
a790: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
a7a0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a Channel(chan);..
a7b0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
a7c0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
a7d0: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
a7e0: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
a7f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
a800: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
a810: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
a820: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
a830: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 ."\": not a TLS
a840: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
a850: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
a860: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
a870: 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 f (Tcl_UnstackCh
a880: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 annel(interp, ch
a890: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 an) == TCL_ERROR
a8a0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
a8b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
a8c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
a8d0: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
a8e0: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
a8f0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
a900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a930: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 -------. *. * CT
a940: 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 X_Init -- constr
a950: 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e uct a SSL_CTX in
a960: 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 stance. *. * Res
a970: 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 ults:. *.A valid
a980: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 SSL_CTX instanc
a990: 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a e or NULL.. *. *
a9a0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
a9b0: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c *.constructs SSL
a9c0: 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 context (CTX).
a9d0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
a9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aa00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aa10: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
aa20: 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 ic SSL_CTX *.CTX
aa30: 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 _Init(State *sta
aa40: 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 tePtr, int isSer
aa50: 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 ver, int proto,
aa60: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 char *keyfile, c
aa70: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 har *certfile,.
aa80: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
aa90: 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 *key, unsigned
aaa0: 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 char *cert, int
aab0: 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 key_len, int cer
aac0: 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 t_len, char *CAd
aad0: 69 72 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 ir,. char *CA
aae0: 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68 file, char *ciph
aaf0: 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68 65 ers, char *ciphe
ab00: 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 rsuites, int lev
ab10: 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 el, char *DHpara
ab20: 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e ms) {. Tcl_In
ab30: 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 terp *interp = s
ab40: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
ab50: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 . SSL_CTX *ct
ab60: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 x = NULL;. Tc
ab70: 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 l_DString ds;.
ab80: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 Tcl_DString ds
ab90: 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 1;. int off =
aba0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 0;. int load
abb0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 _private_key;.
abc0: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 const SSL_METH
abd0: 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 OD *method;..
abe0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
abf0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 ");.. if (!pr
ac00: 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 oto) {..Tcl_Appe
ac10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ac20: 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f "no valid proto
ac30: 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 4e col selected", N
ac40: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 ULL);..return (S
ac50: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 SL_CTX *)0;.
ac60: 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 }.. /* create
ac70: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
ac80: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
ac90: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 ION_NUMBER >= 0x
aca0: 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 10100000L || def
acb0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c ined(NO_SSL2) ||
acc0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
acd0: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 _NO_SSL2). if
ace0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
acf0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 TLS_PROTO_SSL2)
ad00: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
ad10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
ad20: 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 SL2 protocol not
ad30: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
ad40: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c L);..return (SSL
ad50: 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a _CTX *)0;. }.
ad60: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
ad70: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 ed(NO_SSL3) || d
ad80: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
ad90: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 O_SSL3). if (
ada0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
adb0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 LS_PROTO_SSL3))
adc0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
add0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c ult(interp, "SSL
ade0: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 3 protocol not s
adf0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
ae00: 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 ;..return (SSL_C
ae10: 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 TX *)0;. }.#e
ae20: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
ae30: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 (NO_TLS1) || def
ae40: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
ae50: 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e TLS1). if (EN
ae60: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
ae70: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a _PROTO_TLS1)) {.
ae80: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
ae90: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
aea0: 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .0 protocol not
aeb0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
aec0: 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f );..return (SSL_
aed0: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 CTX *)0;. }.#
aee0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
aef0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 d(NO_TLS1_1) ||
af00: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
af10: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 NO_TLS1_1). i
af20: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
af30: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
af40: 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 _1)) {..Tcl_Appe
af50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
af60: 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 "TLS 1.1 protoc
af70: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
af80: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
af90: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
afa0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
afb0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
afc0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
afd0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
afe0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
aff0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
b000: 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 TO_TLS1_2)) {..T
b010: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
b020: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 interp, "TLS 1.2
b030: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
b040: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
b050: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
b060: 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e X *)0;. }.#en
b070: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
b080: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
b090: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
b0a0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 _TLS1_3). if
b0b0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
b0c0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
b0d0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
b0e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b0f0: 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c TLS 1.3 protocol
b100: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
b110: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
b120: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 (SSL_CTX *)0;.
b130: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 }.#endif..
b140: 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b switch (proto) {
b150: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
b160: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
b170: 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 10100000L && !de
b180: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 fined(NO_SSL2) &
b190: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
b1a0: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 SL_NO_SSL2).
b1b0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 case TLS_PROTO_S
b1c0: 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 53 SL2:..method = S
b1d0: 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 SLv2_method();..
b1e0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
b1f0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
b200: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
b210: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
b220: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
b230: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 NSSL_NO_SSL3_MET
b240: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
b250: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d S_PROTO_SSL3:..m
b260: 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 ethod = SSLv3_me
b270: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
b280: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
b290: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 ned(NO_TLS1) &&
b2a0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
b2b0: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 _NO_TLS1) && !de
b2c0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
b2d0: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 _TLS1_METHOD).
b2e0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
b2f0: 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d _TLS1:..method =
b300: 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b TLSv1_method();
b310: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
b320: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
b330: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
b340: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
b350: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
b360: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
b370: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_1_METHOD).
b380: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
b390: 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 TLS1_1:..method
b3a0: 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 = TLSv1_1_method
b3b0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
b3c0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
b3d0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
b3e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
b3f0: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
b400: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
b410: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a _TLS1_2_METHOD).
b420: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
b430: 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 TO_TLS1_2:..meth
b440: 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 od = TLSv1_2_met
b450: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 hod();..break;.#
b460: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
b470: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 ed(NO_TLS1_3) &&
b480: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
b490: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
b4a0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
b4b0: 54 4c 53 31 5f 33 3a 0a 09 2f 2a 0a 09 20 2a 20 TLS1_3:../*.. *
b4c0: 54 68 65 20 76 65 72 73 69 6f 6e 20 72 61 6e 67 The version rang
b4d0: 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 e is constrained
b4e0: 20 62 65 6c 6f 77 2c 0a 09 20 2a 20 61 66 74 65 below,.. * afte
b4f0: 72 20 74 68 65 20 63 6f 6e 74 65 78 74 20 69 73 r the context is
b500: 20 63 72 65 61 74 65 64 2e 20 20 55 73 65 20 74 created. Use t
b510: 68 65 0a 09 20 2a 20 67 65 6e 65 72 69 63 20 6d he.. * generic m
b520: 65 74 68 6f 64 20 68 65 72 65 2e 0a 09 20 2a 2f ethod here... */
b530: 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d ..method = TLS_m
b540: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
b550: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 .#endif. defa
b560: 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 ult:../* Negotia
b570: 74 65 20 68 69 67 68 65 73 74 20 61 76 61 69 6c te highest avail
b580: 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 able SSL/TLS ver
b590: 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 sion */..method
b5a0: 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a = TLS_method();.
b5b0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
b5c0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
b5d0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
b5e0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
b5f0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
b600: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 L_NO_SSL2)..off
b610: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
b620: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c o, TLS_PROTO_SSL
b630: 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 2) ? 0 : SSL_O
b640: 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e P_NO_SSLv2);.#en
b650: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
b660: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 (NO_SSL3) && !de
b670: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
b680: 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 _SSL3)..off |= (
b690: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
b6a0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 LS_PROTO_SSL3)
b6b0: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
b6c0: 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a _SSLv3);.#endif.
b6d0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
b6e0: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 TLS1) && !define
b6f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
b700: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 1)..off |= (ENAB
b710: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
b720: 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 ROTO_TLS1) ? 0
b730: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
b740: 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 v1);.#endif.#if
b750: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
b760: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
b770: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
b780: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 1)..off |= (ENAB
b790: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
b7a0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 ROTO_TLS1_1) ? 0
b7b0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
b7c0: 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 v1_1);.#endif.#i
b7d0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
b7e0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
b7f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
b800: 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 1_2)..off |= (EN
b810: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
b820: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f _PROTO_TLS1_2) ?
b830: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
b840: 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a LSv1_2);.#endif.
b850: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
b860: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
b870: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
b880: 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 LS1_3)..off |= (
b890: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
b8a0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
b8b0: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
b8c0: 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 _TLSv1_3);.#endi
b8d0: 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a f..break;. }.
b8e0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
b8f0: 72 72 6f 72 28 29 3b 0a 20 20 20 20 63 74 78 20 rror();. ctx
b900: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 = SSL_CTX_new(me
b910: 74 68 6f 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 thod);.. if (
b920: 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 !ctx) {..return(
b930: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL);. }..
b940: 20 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c if (getenv(SSL
b950: 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 KEYLOGFILE)) {..
b960: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c SSL_CTX_set_keyl
b970: 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c og_callback(ctx,
b980: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 KeyLogCallback)
b990: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 ;. }..#if !de
b9a0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
b9b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
b9c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
b9d0: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d if (proto ==
b9e0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
b9f0: 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 3) {..SSL_CTX_se
ba00: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 t_min_proto_vers
ba10: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
ba20: 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 VERSION);..SSL_C
ba30: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f TX_set_max_proto
ba40: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
ba50: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 S1_3_VERSION);.
ba60: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 }.#endif..
ba70: 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 /* Force cipher
ba80: 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 selection order
ba90: 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 by server */.
baa0: 20 20 69 66 20 28 21 69 73 53 65 72 76 65 72 29 if (!isServer)
bab0: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
bac0: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c options(ctx, SSL
bad0: 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 _OP_CIPHER_SERVE
bae0: 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 R_PREFERENCE);.
baf0: 20 20 20 7d 0a 0a 20 20 20 20 53 53 4c 5f 43 54 }.. SSL_CT
bb00: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 X_set_app_data(c
bb10: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 tx, (void*)inter
bb20: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 p);./* remember
bb30: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
bb40: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
bb50: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
bb60: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 SSL_OP_ALL);./*
bb70: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b all SSL bug work
bb80: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 arounds */. S
bb90: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
bba0: 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f ns(ctx, off);../
bbb0: 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 * disable protoc
bbc0: 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 ol versions */.#
bbd0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
bbe0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
bbf0: 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 101000L. SSL_
bc00: 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 CTX_set_mode(ctx
bc10: 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f , SSL_MODE_AUTO_
bc20: 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c RETRY);./* handl
bc30: 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 e new handshakes
bc40: 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 20 2a in background *
bc50: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c /.#endif. SSL
bc60: 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 _CTX_sess_set_ca
bc70: 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 che_size(ctx, 12
bc80: 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 8);.. /* Set
bc90: 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 user defined cip
bca0: 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 hers, cipher sui
bcb0: 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 tes, and securit
bcc0: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 y level */. i
bcd0: 66 20 28 28 28 63 69 70 68 65 72 73 20 21 3d 20 f (((ciphers !=
bce0: 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 NULL) && !SSL_CT
bcf0: 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 X_set_cipher_lis
bd00: 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 t(ctx, ciphers))
bd10: 20 7c 7c 20 5c 0a 09 28 28 63 69 70 68 65 72 73 || \..((ciphers
bd20: 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 uites != NULL) &
bd30: 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 & !SSL_CTX_set_c
bd40: 69 70 68 65 72 73 75 69 74 65 73 28 63 74 78 2c iphersuites(ctx,
bd50: 20 63 69 70 68 65 72 73 75 69 74 65 73 29 29 29 ciphersuites)))
bd60: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
bd70: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
bd80: 20 22 53 65 74 20 63 69 70 68 65 72 73 20 66 61 "Set ciphers fa
bd90: 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 iled", (char *)
bda0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
bdb0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
bdc0: 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f return (SSL_
bdd0: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a CTX *)0;. }..
bde0: 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 /* Set secur
bdf0: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 ity level */.
be00: 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 if (level > -1
be10: 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a && level < 6) {.
be20: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 ./* SSL_set_secu
be30: 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 rity_level */..S
be40: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 SL_CTX_set_secur
be50: 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c ity_level(ctx, l
be60: 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 evel);. }..
be70: 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 /* set some ca
be80: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 llbacks */. S
be90: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 SL_CTX_set_defau
bea0: 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 lt_passwd_cb(ctx
beb0: 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 , PasswordCallba
bec0: 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 ck);. SSL_CTX
bed0: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 _set_default_pas
bee0: 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 swd_cb_userdata(
bef0: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ctx, (void *)sta
bf00: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 tePtr);.. /*
bf10: 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 read a Diffie-He
bf20: 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 llman parameters
bf30: 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 file, or use th
bf40: 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a e built-in one *
bf50: 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c /.#ifdef OPENSSL
bf60: 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 _NO_DH. if (D
bf70: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 Hparams != NULL)
bf80: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
bf90: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 sult(interp, "DH
bfa0: 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f parameter suppo
bfb0: 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 rt not available
bfc0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
bfd0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
bfe0: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 28 (ctx);..return (
bff0: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 SSL_CTX *)0;.
c000: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 }.#else. {..
c010: 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 DH* dh;..if (DHp
c020: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b arams != NULL) {
c030: 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a .. BIO *bio;.
c040: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
c050: 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20 Init(&ds);..
c060: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 bio = BIO_new_fi
c070: 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c le(F2N(DHparams,
c080: 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 &ds), "r");..
c090: 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 if (!bio) {...
c0a0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
c0b0: 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 &ds);...Tcl_Appe
c0c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
c0d0: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 "Could not find
c0e0: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 DH parameters f
c0f0: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ile", (char *) N
c100: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
c110: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
c120: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
c130: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 ;.. }... d
c140: 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f h = PEM_read_bio
c150: 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e _DHparams(bio, N
c160: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 ULL, NULL, NULL)
c170: 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 ;.. BIO_free(
c180: 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 bio);.. Tcl_D
c190: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
c1a0: 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b .. if (!dh) {
c1b0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
c1c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 ult(interp, "Cou
c1d0: 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 ld not read DH p
c1e0: 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 arameters from f
c1f0: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ile", (char *) N
c200: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
c210: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
c220: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
c230: 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 ;.. }..} else
c240: 20 7b 0a 09 20 20 20 20 64 68 20 3d 20 67 65 74 {.. dh = get
c250: 5f 64 68 50 61 72 61 6d 73 28 29 3b 0a 09 7d 0a _dhParams();..}.
c260: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 .SSL_CTX_set_tmp
c270: 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 44 _dh(ctx, dh);..D
c280: 48 5f 66 72 65 65 28 64 68 29 3b 0a 20 20 20 20 H_free(dh);.
c290: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a }.#endif.. /*
c2a0: 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 set our certifi
c2b0: 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 cate */. load
c2c0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 _private_key = 0
c2d0: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 ;. if (certfi
c2e0: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c le != NULL) {..l
c2f0: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 oad_private_key
c300: 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 = 1;...Tcl_DStri
c310: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 ngInit(&ds);...i
c320: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
c330: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 ertificate_file(
c340: 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c ctx, F2N(certfil
c350: 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c e, &ds), SSL_FIL
c360: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 ETYPE_PEM) <= 0)
c370: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 {.. Tcl_DStr
c380: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
c390: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
c3a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
c3b0: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 ble to set certi
c3c0: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 ficate file ", c
c3d0: 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 ertfile, ": ",..
c3e0: 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c .. REASON(),
c3f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
c400: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
c410: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
c420: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 turn (SSL_CTX *)
c430: 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 0;..}. } else
c440: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c if (cert != NUL
c450: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 L) {..load_priva
c460: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 te_key = 1;..if
c470: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 (SSL_CTX_use_cer
c480: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 tificate_ASN1(ct
c490: 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 x, cert_len, cer
c4a0: 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 t) <= 0) {..
c4b0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
c4c0: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 &ds);.. Tcl_A
c4d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
c4e0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
c4f0: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 et certificate:
c500: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f ",.... REASO
c510: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
c520: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
c530: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
c540: 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 return (SSL_CT
c550: 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 X *)0;..}. }
c560: 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 else {..certfile
c570: 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 = (char*)X509_g
c580: 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f et_default_cert_
c590: 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 file();...if (SS
c5a0: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 L_CTX_use_certif
c5b0: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 icate_file(ctx,
c5c0: 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 certfile, SSL_FI
c5d0: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 LETYPE_PEM) <= 0
c5e0: 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 ) {.#if 0.. T
c5f0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
c600: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 ds);.. Tcl_Ap
c610: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
c620: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 p, "unable to us
c630: 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 e default certif
c640: 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 icate file ", ce
c650: 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 rtfile, ": ",...
c660: 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 . REASON(),
c670: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
c680: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 . SSL_CTX_fre
c690: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 e(ctx);.. ret
c6a0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
c6b0: 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 ;.#endif..}.
c6c0: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 }.. /* set ou
c6d0: 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f r private key */
c6e0: 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 . if (load_pr
c6f0: 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 ivate_key) {..if
c700: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c (keyfile == NUL
c710: 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c L && key == NULL
c720: 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 ) {.. keyfile
c730: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a = certfile;..}.
c740: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d ..if (keyfile !=
c750: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a NULL) {.. /*
c760: 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 get the private
c770: 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 key associated
c780: 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 with this certif
c790: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 icate */.. if
c7a0: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c (keyfile == NUL
c7b0: 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d L) {...keyfile =
c7c0: 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 certfile;..
c7d0: 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f }... if (SSL_
c7e0: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b CTX_use_PrivateK
c7f0: 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e ey_file(ctx, F2N
c800: 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 (keyfile, &ds),
c810: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
c820: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f ) <= 0) {...Tcl_
c830: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
c840: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 ;.../* flush the
c850: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 passphrase whic
c860: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 h might be left
c870: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f in the result */
c880: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
c890: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 (interp, NULL, T
c8a0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 CL_STATIC);...Tc
c8b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
c8c0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
c8d0: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 o set public key
c8e0: 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 file ", keyfile
c8f0: 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20 20 , " ",....
c900: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 REASON(), (ch
c910: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
c920: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
c930: 3b 0a 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f ;...return (SSL_
c940: 43 54 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a CTX *)0;.. }.
c950: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
c960: 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 Free(&ds);...} e
c970: 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e lse if (key != N
c980: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 ULL) {.. if (
c990: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 SSL_CTX_use_Priv
c9a0: 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f ateKey_ASN1(EVP_
c9b0: 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b PKEY_RSA, ctx, k
c9c0: 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 ey,key_len) <= 0
c9d0: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
c9e0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a gFree(&ds);.../*
c9f0: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
ca00: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
ca10: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
ca20: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
ca30: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
ca40: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
ca50: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
ca60: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ca70: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
ca80: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 public key: ", R
ca90: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
caa0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
cab0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
cac0: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
cad0: 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 *)0;.. }..}..
cae0: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 /* Now we know t
caf0: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 hat a key and ce
cb00: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 rt have been set
cb10: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 against.. * the
cb20: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
cb30: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 .if (!SSL_CTX_ch
cb40: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 eck_private_key(
cb50: 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c ctx)) {.. Tcl
cb60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
cb70: 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b terp, "private k
cb80: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 ey does not matc
cb90: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 h the certificat
cba0: 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 e public key",..
cbb0: 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 .. (char *)
cbc0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
cbd0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
cbe0: 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f return (SSL_
cbf0: 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 CTX *)0;..}.
cc00: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 76 65 }.. /* Set ve
cc10: 72 69 66 69 63 61 74 69 6f 6e 20 43 41 73 20 2a rification CAs *
cc20: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e /. Tcl_DStrin
cc30: 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20 gInit(&ds);.
cc40: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
cc50: 26 64 73 31 29 3b 0a 20 20 20 20 69 66 20 28 21 &ds1);. if (!
cc60: 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 SSL_CTX_load_ver
cc70: 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 ify_locations(ct
cc80: 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 x, F2N(CAfile, &
cc90: 64 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 ds), F2N(CAdir,
cca0: 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f &ds1)) ||..!SSL_
ccb0: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
ccc0: 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 verify_paths(ctx
ccd0: 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f )) {.#if 0..Tcl_
cce0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
ccf0: 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ;..Tcl_DStringFr
cd00: 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f ee(&ds1);../* Do
cd10: 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63 61 n't currently ca
cd20: 72 65 20 69 66 20 74 68 69 73 20 66 61 69 6c 73 re if this fails
cd30: 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 */..Tcl_AppendR
cd40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
cd50: 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69 66 SL default verif
cd60: 79 20 70 61 74 68 73 3a 20 22 2c 20 52 45 41 53 y paths: ", REAS
cd70: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
cd80: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
cd90: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
cda0: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
cdb0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
cdc0: 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 /* https://sou
cdd0: 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 rceforge.net/p/t
cde0: 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 ls/bugs/57/ */.
cdf0: 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 /* XXX:TODO:
ce00: 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70 Let the user sup
ce10: 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 ply values here
ce20: 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 instead of somet
ce30: 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 hing that exists
ce40: 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 on the filesyst
ce50: 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 em */. if (CA
ce60: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
ce70: 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e .STACK_OF(X509_N
ce80: 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 AME) *certNames
ce90: 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e = SSL_load_clien
cea0: 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 t_CA_file(F2N(CA
ceb0: 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 file, &ds));..if
cec0: 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e (certNames != N
ced0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f ULL) {.. SSL_
cee0: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 CTX_set_client_C
cef0: 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 A_list(ctx, cert
cf00: 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d Names);..}. }
cf10: 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
cf20: 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 gFree(&ds);.
cf30: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
cf40: 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72 &ds1);. retur
cf50: 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a n ctx;.}.../*. *
cf60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cfa0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 ---. *. * Status
cfb0: 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
cfc0: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 certificate for
cfd0: 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e connected peer.
cfe0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
cff0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
d000: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
d010: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
d020: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
d030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
d070: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
d080: 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 tatusObjCmd(Clie
d090: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
d0a0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
d0b0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
d0c0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
d0d0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 objv[]) {. St
d0e0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 ate *statePtr;.
d0f0: 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 X509 *peer;.
d100: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
d110: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e tr;. Tcl_Chan
d120: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 nel chan;. ch
d130: 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c ar *channelName,
d140: 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 *ciphers;. i
d150: 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e nt mode;. con
d160: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
d170: 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 *proto;. uns
d180: 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 igned int len;.
d190: 20 20 20 63 68 61 72 20 2a 70 65 65 72 6e 61 6d char *peernam
d1a0: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 e = NULL;.. d
d1b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
d1c0: 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 6f ;.. switch (o
d1d0: 62 6a 63 29 20 7b 0a 09 63 61 73 65 20 32 3a 0a bjc) {..case 2:.
d1e0: 09 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 . channelName
d1f0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
d200: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
d210: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 NULL);.. bre
d220: 61 6b 3b 0a 0a 09 63 61 73 65 20 33 3a 0a 09 20 ak;...case 3:..
d230: 20 20 20 69 66 20 28 21 73 74 72 63 6d 70 20 28 if (!strcmp (
d240: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 20 28 6f Tcl_GetString (o
d250: 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c bjv[1]), "-local
d260: 22 29 29 20 7b 0a 09 09 63 68 61 6e 6e 65 6c 4e ")) {...channelN
d270: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 ame = Tcl_GetStr
d280: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
d290: 32 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 09 62 72 65 2], NULL);...bre
d2a0: 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ak;.. }..
d2b0: 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 2d 74 68 72 /* else fall-thr
d2c0: 6f 75 67 68 20 2e 2e 2e 20 2a 2f 0a 23 69 66 20 ough ... */.#if
d2d0: 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f defined(__GNUC__
d2e0: 29 0a 09 20 20 20 20 5f 5f 61 74 74 72 69 62 75 ).. __attribu
d2f0: 74 65 5f 5f 28 28 66 61 6c 6c 74 68 72 6f 75 67 te__((fallthroug
d300: 68 29 29 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 h));.#endif..def
d310: 61 75 6c 74 3a 0a 09 20 20 20 20 54 63 6c 5f 57 ault:.. Tcl_W
d320: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
d330: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d rp, 1, objv, "?-
d340: 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 local? channel")
d350: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
d360: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
d370: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
d380: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
d390: 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 , channelName, &
d3a0: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 mode);. if (c
d3b0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
d3c0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
d3d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
d3e0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4d 61 6b }. /* Mak
d3f0: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
d400: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
d410: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
d420: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
d430: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
d440: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
d450: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
d460: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
d470: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
d480: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
d490: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
d4a0: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
d4b0: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
d4c0: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 ."\": not a TLS
d4d0: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
d4e0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
d4f0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 OR;. }. st
d500: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
d510: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *) Tcl_GetChanne
d520: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
d530: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a an);. if (obj
d540: 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 c == 2) {..peer
d550: 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 = SSL_get_peer_c
d560: 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 ertificate(state
d570: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
d580: 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 else {..peer =
d590: 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 SSL_get_certific
d5a0: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ate(statePtr->ss
d5b0: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 l);. }. if
d5c0: 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 (peer) {..objPt
d5d0: 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f r = Tls_NewX509O
d5e0: 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 bj(interp, peer)
d5f0: 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 ;..if (objc == 2
d600: 29 20 7b 20 58 35 30 39 5f 66 72 65 65 28 70 65 ) { X509_free(pe
d610: 65 72 29 3b 20 7d 0a 20 20 20 20 7d 20 65 6c 73 er); }. } els
d620: 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 e {..objPtr = Tc
d630: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
d640: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL);. }..
d650: 20 20 2f 2a 20 50 65 65 72 20 63 65 72 74 20 63 /* Peer cert c
d660: 68 61 69 6e 20 28 63 6c 69 65 6e 74 20 6f 6e 6c hain (client onl
d670: 79 29 20 2a 2f 0a 20 20 20 20 53 54 41 43 4b 5f y) */. STACK_
d680: 4f 46 28 58 35 30 39 29 2a 20 73 73 6c 5f 63 65 OF(X509)* ssl_ce
d690: 72 74 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 rts = SSL_get_pe
d6a0: 65 72 5f 63 65 72 74 5f 63 68 61 69 6e 28 73 74 er_cert_chain(st
d6b0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
d6c0: 20 20 69 66 20 28 21 70 65 65 72 20 26 26 20 28 if (!peer && (
d6d0: 73 73 6c 5f 63 65 72 74 73 20 3d 3d 20 4e 55 4c ssl_certs == NUL
d6e0: 4c 20 7c 7c 20 73 6b 5f 58 35 30 39 5f 6e 75 6d L || sk_X509_num
d6f0: 28 73 73 6c 5f 63 65 72 74 73 29 20 3d 3d 20 30 (ssl_certs) == 0
d700: 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c )) {..return TCL
d710: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
d720: 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 /* Peer name
d730: 66 72 6f 6d 20 63 65 72 74 20 2a 2f 0a 20 20 20 from cert */.
d740: 20 69 66 20 28 53 53 4c 5f 67 65 74 5f 76 65 72 if (SSL_get_ver
d750: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 ify_result(state
d760: 50 74 72 2d 3e 73 73 6c 29 20 3d 3d 20 58 35 30 Ptr->ssl) == X50
d770: 39 5f 56 5f 4f 4b 29 20 7b 0a 09 70 65 65 72 6e 9_V_OK) {..peern
d780: 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 30 5f 70 ame = SSL_get0_p
d790: 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 eername(statePtr
d7a0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 ->ssl);. }.
d7b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
d7c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
d7d0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
d7e0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 ewStringObj("pee
d7f0: 72 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20 rname", -1));.
d800: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
d810: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
d820: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
d830: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 65 65 72 ewStringObj(peer
d840: 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 name, -1));..
d850: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
d860: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
d870: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
d880: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 62 69 74 wStringObj("sbit
d890: 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 s", -1));. Tc
d8a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
d8b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
d8c0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e bjPtr, Tcl_NewIn
d8d0: 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70 tObj(SSL_get_cip
d8e0: 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 74 her_bits(statePt
d8f0: 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b r->ssl, NULL)));
d900: 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 .. ciphers =
d910: 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 (char*)SSL_get_c
d920: 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e ipher(statePtr->
d930: 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 28 63 ssl);. if ((c
d940: 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 iphers != NULL)
d950: 26 26 20 28 73 74 72 63 6d 70 28 63 69 70 68 65 && (strcmp(ciphe
d960: 72 73 2c 20 22 28 4e 4f 4e 45 29 22 29 20 21 3d rs, "(NONE)") !=
d970: 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 0)) {..Tcl_List
d980: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
d990: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
d9a0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
d9b0: 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29 29 j("cipher", -1))
d9c0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
d9d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
d9e0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
d9f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c NewStringObj(SSL
da00: 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 _get_cipher(stat
da10: 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 ePtr->ssl), -1))
da20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
da30: 56 65 72 69 66 79 20 74 68 65 20 58 35 30 39 20 Verify the X509
da40: 63 65 72 74 69 66 69 63 61 74 65 20 70 72 65 73 certificate pres
da50: 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 65 ented by the pee
da60: 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 r */. Tcl_Lis
da70: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
da80: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
da90: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
daa0: 62 6a 28 22 76 61 6c 69 64 61 74 69 6f 6e 22 2c bj("validation",
dab0: 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 53 -1));. if (S
dac0: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 SL_get_verify_re
dad0: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 sult(statePtr->s
dae0: 73 6c 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b sl) != X509_V_OK
daf0: 29 20 7b 0a 09 2f 2a 20 70 72 6f 74 6f 20 3d 20 ) {../* proto =
db00: 22 66 61 69 6c 65 64 22 3b 20 2a 2f 0a 09 70 72 "failed"; */..pr
db10: 6f 74 6f 20 3d 20 52 45 41 53 4f 4e 28 29 3b 0a oto = REASON();.
db20: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 72 } else {..pr
db30: 6f 74 6f 20 3d 20 22 6f 6b 22 3b 0a 20 20 20 20 oto = "ok";.
db40: 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 }. Tcl_ListOb
db50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
db60: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
db70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
db80: 70 72 6f 74 6f 2c 20 2d 31 29 29 3b 0a 0a 20 20 proto, -1));..
db90: 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 /* Report the
dba0: 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f selected protoco
dbb0: 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 l as a result of
dbc0: 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e the negotiation
dbd0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 */. SSL_get0
dbe0: 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 _alpn_selected(s
dbf0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 tatePtr->ssl, &p
dc00: 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 roto, &len);.
dc10: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
dc20: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
dc30: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
dc40: 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e wStringObj("alpn
dc50: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
dc60: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
dc70: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
dc80: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
dc90: 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 ingObj((char *)p
dca0: 72 6f 74 6f 2c 20 28 69 6e 74 29 6c 65 6e 29 29 roto, (int)len))
dcb0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
dcc0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
dcd0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
dce0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
dcf0: 22 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 29 3b "version", -1));
dd00: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
dd10: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
dd20: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
dd30: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 l_NewStringObj(S
dd40: 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 SL_get_version(s
dd50: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d tatePtr->ssl), -
dd60: 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 1));.. Tcl_Se
dd70: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
dd80: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
dd90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
dda0: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
ddb0: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
ddc0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
ddd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ddf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
de00: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e -----. *. * Conn
de10: 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 ectionInfoObjCmd
de20: 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 -- return conne
de30: 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 ction info from
de40: 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 OpenSSL.. *. * R
de50: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 esults:. *.A lis
de60: 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 t of connection
de70: 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d info. *. *-----
de80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
de90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
deb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
dec0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 */..static int C
ded0: 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a onnectionInfoObj
dee0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
def0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
df00: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
df10: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
df20: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
df30: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
df40: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
df50: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
df60: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 mode on. */.
df70: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
df80: 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 ;../* client sta
df90: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 te for ssl socke
dfa0: 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a t */. Tcl_Obj
dfb0: 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 63 6f *objPtr;. co
dfc0: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 nst SSL *ssl;.
dfd0: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 const SSL_CIPH
dfe0: 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 ER *cipher;.
dff0: 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f const SSL_SESSIO
e000: 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 N *session;.
e010: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
e020: 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 har *proto;.
e030: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e unsigned int len
e040: 3b 0a 20 20 20 20 6c 6f 6e 67 20 6d 6f 64 65 3b ;. long mode;
e050: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
e060: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
e070: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
e080: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
e090: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 el");..return(TC
e0a0: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a L_ERROR);. }.
e0b0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
e0c0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
e0d0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
e0e0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
e0f0: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 NULL), NULL);.
e100: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
e110: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
e120: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c L) {..return(TCL
e130: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a _ERROR);. }..
e140: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
e150: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
e160: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
e170: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
e180: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
e190: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 el(chan);. if
e1a0: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
e1b0: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
e1c0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
e1d0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
e1e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
e1f0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
e200: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
e210: 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f e(chan), "\": no
e220: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 t a TLS channel"
e230: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
e240: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
e250: 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d }.. objPtr =
e260: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
e270: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 0, NULL);.. /
e280: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 * Connection inf
e290: 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 o */. statePt
e2a0: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c r = (State *)Tcl
e2b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
e2c0: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 nceData(chan);.
e2d0: 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 ssl = statePt
e2e0: 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 r->ssl;. if (
e2f0: 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ssl != NULL) {..
e300: 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 /* connection st
e310: 61 74 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 ate */..Tcl_List
e320: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
e330: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
e340: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
e350: 6a 28 22 73 74 61 74 65 22 2c 20 2d 31 29 29 3b j("state", -1));
e360: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
e370: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
e380: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
e390: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
e3a0: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e state_string_lon
e3b0: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 g(ssl), -1));...
e3c0: 2f 2a 20 47 65 74 20 73 65 72 76 65 72 20 6e 61 /* Get server na
e3d0: 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f me */..Tcl_ListO
e3e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e3f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e400: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e410: 28 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 2d ("servername", -
e420: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
e430: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
e440: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
e450: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
e460: 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 SSL_get_serverna
e470: 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e me(ssl, TLSEXT_N
e480: 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d AMETYPE_host_nam
e490: 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 e), -1));.../* G
e4a0: 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 et protocol */..
e4b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e4c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e4d0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
e4e0: 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f StringObj("proto
e4f0: 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c col", -1));..Tcl
e500: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
e510: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
e520: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
e530: 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76 ingObj(SSL_get_v
e540: 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 ersion(ssl), -1)
e550: 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 );.../* Renegoti
e560: 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f ation allowed */
e570: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
e580: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
e590: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
e5a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 6e ewStringObj("ren
e5b0: 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20 2d 31 29 egotiation", -1)
e5c0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
e5d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
e5e0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
e5f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 _NewStringObj(..
e600: 20 20 20 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 SSL_get_secu
e610: 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e re_renegotiation
e620: 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 20 3f 20 _support(ssl) ?
e630: 22 73 75 70 70 6f 72 74 65 64 22 20 3a 20 22 6e "supported" : "n
e640: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 2d ot supported", -
e650: 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 1));.../* Report
e660: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 the selected pr
e670: 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 otocol as a resu
e680: 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e lt of the ALPN n
e690: 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 egotiation */..S
e6a0: 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c SL_get0_alpn_sel
e6b0: 65 63 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 ected(ssl, &prot
e6c0: 6f 2c 20 26 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c o, &len);..Tcl_L
e6d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
e6e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
e6f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
e700: 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 gObj("alpn", -1)
e710: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
e720: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
e730: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
e740: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 _NewStringObj((c
e750: 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e har *)proto, (in
e760: 74 29 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 47 65 t)len));.../* Ge
e770: 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c t security level
e780: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
e790: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
e7a0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
e7b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
e7c0: 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 securitylevel",
e7d0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
e7e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e7f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e800: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 Tcl_NewIntObj(SS
e810: 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c L_get_security_l
e820: 65 76 65 6c 28 73 73 6c 29 29 29 3b 0a 20 20 20 evel(ssl)));.
e830: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 }.. /* Ciphe
e840: 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 r info */. ci
e850: 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 pher = SSL_get_c
e860: 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 urrent_cipher(ss
e870: 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 l);. if (ciph
e880: 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 er != NULL) {..c
e890: 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 har buf[BUFSIZ]
e8a0: 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 = {0};..int bits
e8b0: 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 54 63 , alg_bits;...Tc
e8c0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
e8d0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
e8e0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
e8f0: 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22 ringObj("cipher"
e900: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
e910: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
e920: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
e930: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
e940: 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 bj(SSL_CIPHER_ge
e950: 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 t_name(cipher),
e960: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
e970: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e980: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e990: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e9a0: 28 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 ("standard_name"
e9b0: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
e9c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
e9d0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
e9e0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
e9f0: 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 bj(SSL_CIPHER_st
ea00: 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 andard_name(ciph
ea10: 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 62 69 74 er), -1));...bit
ea20: 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 s = SSL_CIPHER_g
ea30: 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 et_bits(cipher,
ea40: 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 54 63 6c &alg_bits);..Tcl
ea50: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
ea60: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
ea70: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
ea80: 69 6e 67 4f 62 6a 28 22 62 69 74 73 22 2c 20 2d ingObj("bits", -
ea90: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
eaa0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
eab0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
eac0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 62 69 74 cl_NewIntObj(bit
ead0: 73 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 s));..Tcl_ListOb
eae0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
eaf0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
eb00: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
eb10: 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c 20 2d "secret_bits", -
eb20: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
eb30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
eb40: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
eb50: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6c 67 cl_NewIntObj(alg
eb60: 5f 62 69 74 73 29 29 3b 0a 09 2f 2a 20 61 6c 67 _bits));../* alg
eb70: 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 _bits is actual
eb80: 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e key secret bits.
eb90: 20 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 If use bits and
eba0: 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 secret (algorit
ebb0: 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c hm) bits differ,
ebc0: 0a 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 . the
ebd0: 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 rest of the bits
ebe0: 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e are fixed, i.e.
ebf0: 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 for limited exp
ec00: 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 69 74 ort ciphers (bit
ec10: 73 20 3c 20 35 36 29 20 2a 2f 0a 09 54 63 6c 5f s < 56) */..Tcl_
ec20: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
ec30: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
ec40: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
ec50: 6e 67 4f 62 6a 28 22 6d 69 6e 5f 76 65 72 73 69 ngObj("min_versi
ec60: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f on", -1));..Tcl_
ec70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
ec80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
ec90: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
eca0: 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 ngObj(SSL_CIPHER
ecb0: 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 _get_version(cip
ecc0: 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 69 66 her), -1));...if
ecd0: 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 (SSL_CIPHER_des
ece0: 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c cription(cipher,
ecf0: 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 buf, sizeof(buf
ed00: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 )) != NULL) {..
ed10: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
ed20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
ed30: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
ed40: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 64 65 NewStringObj("de
ed50: 73 63 72 69 70 74 69 6f 6e 22 2c 20 2d 31 29 29 scription", -1))
ed60: 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ;.. Tcl_ListO
ed70: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
ed80: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ed90: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
eda0: 28 62 75 66 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 (buf, -1));..}.
edb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 }.. /* Ses
edc0: 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 sion info */.
edd0: 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 session = SSL_g
ede0: 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b et_session(ssl);
edf0: 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e . if (session
ee00: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e != NULL) {..con
ee10: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
ee20: 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f *ticket;..size_
ee30: 74 20 6c 65 6e 32 3b 0a 09 63 6f 6e 73 74 20 75 t len2;..const u
ee40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 nsigned char *se
ee50: 73 73 69 6f 6e 5f 69 64 3b 0a 0a 09 2f 2a 20 53 ssion_id;.../* S
ee60: 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 ession info */..
ee70: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
ee80: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
ee90: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
eea0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 StringObj("sessi
eeb0: 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d 31 29 29 on_reused", -1))
eec0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
eed0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
eee0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
eef0: 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 73 65 NewIntObj(SSL_se
ef00: 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c ssion_reused(ssl
ef10: 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f )));.../* Sessio
ef20: 6e 20 69 64 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 n id */..Tcl_Lis
ef30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
ef40: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
ef50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
ef60: 62 6a 28 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c bj("session_id",
ef70: 20 2d 31 29 29 3b 0a 09 73 65 73 73 69 6f 6e 5f -1));..session_
ef80: 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e id = SSL_SESSION
ef90: 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c _get_id(session,
efa0: 20 26 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 &len);..Tcl_Lis
efb0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
efc0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
efd0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
efe0: 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 bj(session_id, (
eff0: 69 6e 74 29 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 int)len));.../*
f000: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d Session ticket -
f010: 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a client only */.
f020: 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 .SSL_SESSION_get
f030: 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 0_ticket(session
f040: 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 , &ticket, &len2
f050: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
f060: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f070: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f080: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
f090: 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 ession_ticket",
f0a0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
f0b0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f0c0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f0d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
f0e0: 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c (ticket, (int) l
f0f0: 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 52 65 73 75 en2));.../* Resu
f100: 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f mable session */
f110: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
f120: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f130: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f140: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 73 ewStringObj("res
f150: 75 6d 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 09 umable", -1));..
f160: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
f170: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
f180: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
f190: 49 6e 74 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 IntObj(SSL_SESSI
f1a0: 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 ON_is_resumable(
f1b0: 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a session)));.../*
f1c0: 20 53 74 61 72 74 20 74 69 6d 65 20 2a 2f 0a 09 Start time */..
f1d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
f1e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
f1f0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
f200: 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 72 74 StringObj("start
f210: 5f 74 69 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 _time", -1));..T
f220: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
f230: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
f240: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c objPtr, Tcl_NewL
f250: 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 ongObj(SSL_SESSI
f260: 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 ON_get_time(sess
f270: 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d ion)));.../* Tim
f280: 65 6f 75 74 20 76 61 6c 75 65 20 2a 2f 0a 09 54 eout value */..T
f290: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
f2a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
f2b0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
f2c0: 74 72 69 6e 67 4f 62 6a 28 22 74 69 6d 65 6f 75 tringObj("timeou
f2d0: 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c t", -1));..Tcl_L
f2e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f2f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f300: 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f tr, Tcl_NewLongO
f310: 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 bj(SSL_SESSION_g
f320: 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 et_timeout(sessi
f330: 6f 6e 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 on)));. }..
f340: 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e /* Compression
f350: 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 info */. if
f360: 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl != NULL) {.
f370: 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f #ifdef HAVE_SSL_
f380: 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e COMPRESSION..con
f390: 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a st COMP_METHOD *
f3a0: 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f comp, *expn;..co
f3b0: 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 mp = SSL_get_cur
f3c0: 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e rent_compression
f3d0: 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 (ssl);..expn = S
f3e0: 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 SL_get_current_e
f3f0: 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a xpansion(ssl);..
f400: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
f410: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f420: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f430: 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 wStringObj("comp
f440: 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a ression", -1));.
f450: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
f460: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f470: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f480: 77 53 74 72 69 6e 67 4f 62 6a 28 63 6f 6d 70 20 wStringObj(comp
f490: 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e ? SSL_COMP_get_n
f4a0: 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 4e 4f 4e ame(comp) : "NON
f4b0: 45 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c E", -1));..Tcl_L
f4c0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f4d0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f4e0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
f4f0: 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 gObj("expansion"
f500: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
f510: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
f520: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
f530: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
f540: 62 6a 28 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f bj(expn ? SSL_CO
f550: 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e MP_get_name(expn
f560: 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 ) : "NONE", -1))
f570: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 4c 69 73 ;.#else..Tcl_Lis
f580: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
f590: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
f5a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
f5b0: 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 bj("compression"
f5c0: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
f5d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
f5e0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
f5f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
f600: 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b bj("NONE", -1));
f610: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
f620: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f630: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f640: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 ewStringObj("exp
f650: 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 ansion", -1));..
f660: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
f670: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
f680: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
f690: 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 StringObj("NONE"
f6a0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 , -1));.#endif.
f6b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 }.. /* Ser
f6c0: 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ver info */.
f6d0: 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 mode = SSL_CTX_g
f6e0: 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 et_session_cache
f6f0: 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e _mode(statePtr->
f700: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f ctx);. if (mo
f710: 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
f720: 43 48 45 5f 4f 46 46 29 20 7b 0a 09 70 72 6f 74 CHE_OFF) {..prot
f730: 6f 20 3d 20 22 6f 66 66 22 3b 0a 20 20 20 20 7d o = "off";. }
f740: 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 else if (mode &
f750: 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
f760: 43 4c 49 45 4e 54 29 20 7b 0a 09 70 72 6f 74 6f CLIENT) {..proto
f770: 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 20 20 20 = "client";.
f780: 20 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 } else if (mode
f790: 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
f7a0: 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 70 72 6f E_SERVER) {..pro
f7b0: 74 6f 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 20 to = "server";.
f7c0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f } else if (mo
f7d0: 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
f7e0: 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 70 72 6f CHE_BOTH) {..pro
f7f0: 74 6f 20 3d 20 22 62 6f 74 68 22 3b 0a 20 20 20 to = "both";.
f800: 20 7d 20 65 6c 73 65 20 7b 0a 09 70 72 6f 74 6f } else {..proto
f810: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 = "unknown";.
f820: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 }. Tcl_List
f830: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f840: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f850: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
f860: 6a 28 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 j("session_cache
f870: 5f 6d 6f 64 65 22 2c 20 2d 31 29 29 3b 0a 20 20 _mode", -1));.
f880: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
f890: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f8a0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f8b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
f8c0: 6f 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 o, -1));.. Tc
f8d0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
f8e0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
f8f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
f900: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d K;..clientData =
f910: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c clientData;.}..
f920: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
f930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
f970: 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d VersionObjCmd --
f980: 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 return version
f990: 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e string from Open
f9a0: 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c SSL.. *. * Resul
f9b0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
f9c0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
f9d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
f9e0: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
f9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fa00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fa10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fa20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fa30: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
fa40: 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 nt.VersionObjCmd
fa50: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
fa60: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
fa70: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
fa80: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
fa90: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
faa0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
fab0: 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 tr;.. dprintf
fac0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
fad0: 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 objPtr = Tcl_Ne
fae0: 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 wStringObj(OPENS
faf0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c SL_VERSION_TEXT,
fb00: 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 -1);. Tcl_Se
fb10: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
fb20: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 p, objPtr);..
fb30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
fb40: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
fb50: 69 65 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63 20 ientData;..objc
fb60: 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 = objc;..objv =
fb70: 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d objv;.}.../*. *-
fb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fbc0: 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a --. *. * MiscObj
fbd0: 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d Cmd -- misc comm
fbe0: 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ands. *. * Resul
fbf0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
fc00: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
fc10: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
fc20: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
fc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc70: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
fc80: 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c nt.MiscObjCmd(Cl
fc90: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
fca0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
fcb0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
fcc0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
fcd0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
fce0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
fcf0: 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d r *commands [] =
fd00: 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 { "req", "strre
fd10: 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 q", NULL };.
fd20: 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 enum command { C
fd30: 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 _REQ, C_STRREQ,
fd40: 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 C_DUMMY };. i
fd50: 6e 74 20 63 6d 64 2c 20 69 73 53 74 72 3b 0a 20 nt cmd, isStr;.
fd60: 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 char buffer[1
fd70: 36 33 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6384];.. dpri
fd80: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
fd90: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
fda0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
fdb0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
fdc0: 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 objv, "subcomma
fdd0: 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 nd ?args?");..re
fde0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
fdf0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 }. if (Tc
fe00: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 l_GetIndexFromOb
fe10: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 j(interp, objv[1
fe20: 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f ], commands, "co
fe30: 6d 6d 61 6e 64 22 2c 20 30 2c 26 63 6d 64 29 20 mmand", 0,&cmd)
fe40: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 != TCL_OK) {..re
fe50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
fe60: 20 20 20 20 7d 0a 0a 20 20 20 20 69 73 53 74 72 }.. isStr
fe70: 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 = (cmd == C_STR
fe80: 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 REQ);. switch
fe90: 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 ((enum command)
fea0: 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f cmd) {..case C_
feb0: 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 REQ:..case C_STR
fec0: 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f REQ: {.. EVP_
fed0: 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b PKEY *pkey=NULL;
fee0: 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 .. X509 *cert
fef0: 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 =NULL;.. X509
ff00: 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c _NAME *name=NULL
ff10: 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a ;.. Tcl_Obj *
ff20: 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 69 6e 74 *listv;.. int
ff30: 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 listc,i;...
ff40: 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a BIO *out=NULL;..
ff50: 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 . char *k_C="
ff60: 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d ",*k_ST="",*k_L=
ff70: 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 "",*k_O="",*k_OU
ff80: 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f ="",*k_CN="",*k_
ff90: 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 Email="";.. c
ffa0: 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d har *keyout,*pem
ffb0: 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 out,*str;.. i
ffc0: 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 nt keysize,seria
ffd0: 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 l=0,days=365;..#
ffe0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
fff0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
10000 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 000000L.. BIG
10010 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b NUM *bne = NULL;
10020 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d .. RSA *rsa =
10030 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 NULL;.#else..
10040 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a EVP_PKEY_CTX *
10050 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 ctx = NULL;.#end
10060 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 if... if ((ob
10070 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 jc<5) || (objc>6
10080 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 )) {...Tcl_Wrong
10090 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
100a0 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 2, objv, "keysiz
100b0 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 e keyfile certfi
100c0 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 le ?info?");...r
100d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
100e0 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 .. }... if
100f0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
10100 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
10110 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 [2], &keysize) !
10120 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 = TCL_OK) {...re
10130 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
10140 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f . }.. keyo
10150 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ut=Tcl_GetString
10160 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 (objv[3]);..
10170 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 pemout=Tcl_GetSt
10180 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 ring(objv[4]);..
10190 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b if (isStr) {
101a0 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e ...Tcl_SetVar(in
101b0 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 terp,keyout,"",0
101c0 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 );...Tcl_SetVar(
101d0 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 interp,pemout,""
101e0 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ,0);.. }...
101f0 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b if (objc>=6) {
10200 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f ...if (Tcl_ListO
10210 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e bjGetElements(in
10220 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 terp, objv[5],..
10230 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 ..&listc, &listv
10240 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
10250 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
10260 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 ERROR;...}....if
10270 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 ((listc%2) != 0
10280 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 ) {... Tcl_Se
10290 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
102a0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 Information list
102b0 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 must have even
102c0 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 number of argume
102d0 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 nts",NULL);...
102e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
102f0 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 OR;...}...for (i
10300 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d =0; i<listc; i+=
10310 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 2) {... str=T
10320 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
10330 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 tv[i]);... if
10340 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 (strcmp(str,"da
10350 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 ys")==0) {....if
10360 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
10370 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
10380 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 [i+1],&days)!=TC
10390 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 L_OK).... ret
103a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
103b0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
103c0 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 strcmp(str,"seri
103d0 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 al")==0) {....if
103e0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
103f0 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
10400 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d [i+1],&serial)!=
10410 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 TCL_OK).... r
10420 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
10430 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
10440 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 (strcmp(str,"C"
10450 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 )==0) {....k_C=T
10460 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
10470 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
10480 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
10490 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 p(str,"ST")==0)
104a0 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 {....k_ST=Tcl_Ge
104b0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
104c0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
104d0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
104e0 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"L")==0) {....k
104f0 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _L=Tcl_GetString
10500 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
10510 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
10520 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d trcmp(str,"O")==
10530 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 0) {....k_O=Tcl_
10540 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
10550 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
10560 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
10570 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 tr,"OU")==0) {..
10580 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 ..k_OU=Tcl_GetSt
10590 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
105a0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
105b0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 f (strcmp(str,"C
105c0 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 N")==0) {....k_C
105d0 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 N=Tcl_GetString(
105e0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
105f0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
10600 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 rcmp(str,"Email"
10610 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 )==0) {....k_Ema
10620 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 il=Tcl_GetString
10630 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
10640 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 } else {....
10650 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
10660 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 terp,"Unknown pa
10670 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a rameter",NULL);.
10680 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
10690 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d ROR;... }...}
106a0 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 .. }..#if OPE
106b0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
106c0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
106d0 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f L.. bne = BN_
106e0 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 new();.. rsa
106f0 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 = RSA_new();..
10700 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 pkey = EVP_PKE
10710 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 Y_new();.. if
10720 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (bne == NULL ||
10730 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 rsa == NULL ||
10740 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 pkey == NULL ||
10750 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 !BN_set_word(bne
10760 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 ,RSA_F4) ||...!R
10770 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f SA_generate_key_
10780 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c ex(rsa, keysize,
10790 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 bne, NULL) || !
107a0 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f EVP_PKEY_assign_
107b0 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 RSA(pkey, rsa))
107c0 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 {...EVP_PKEY_fre
107d0 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 e(pkey);.../* RS
107e0 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 A_free(rsa); fre
107f0 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 ed by EVP_PKEY_f
10800 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 ree */...BN_free
10810 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 (bne);.#else..
10820 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 pkey = EVP_RSA
10830 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 _gen((unsigned i
10840 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 nt) keysize);..
10850 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 ctx = EVP_PKE
10860 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e Y_CTX_new(pkey,N
10870 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 ULL);.. if (p
10880 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 key == NULL || c
10890 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 tx == NULL || !E
108a0 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 VP_PKEY_keygen_i
108b0 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 nit(ctx) ||...!E
108c0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f VP_PKEY_CTX_set_
108d0 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 rsa_keygen_bits(
108e0 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c ctx, keysize) ||
108f0 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 !EVP_PKEY_keyge
10900 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b n(ctx, &pkey)) {
10910 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
10920 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b (pkey);...EVP_PK
10930 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 EY_CTX_free(ctx)
10940 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 ;.#endif...Tcl_S
10950 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
10960 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e "Error generatin
10970 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e g private key",N
10980 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 ULL);...return T
10990 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
109a0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 else {...if (is
109b0 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 Str) {... out
109c0 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d =BIO_new(BIO_s_m
109d0 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d em());... PEM
109e0 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 _write_bio_Priva
109f0 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e teKey(out,pkey,N
10a00 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c ULL,NULL,0,NULL,
10a10 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 NULL);... i=B
10a20 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 IO_read(out,buff
10a30 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 er,sizeof(buffer
10a40 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 )-1);... i=(i
10a50 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 <0) ? 0 : i;...
10a60 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 buffer[i]='\0
10a70 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 ';... Tcl_Set
10a80 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
10a90 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 t,buffer,0);...
10aa0 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 BIO_flush(out
10ab0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
10ac0 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 e(out);...} else
10ad0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
10ae0 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 _new(BIO_s_file(
10af0 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 ));... BIO_wr
10b00 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 ite_filename(out
10b10 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 ,keyout);...
10b20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 PEM_write_bio_Pr
10b30 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 ivateKey(out,pke
10b40 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 y,NULL,NULL,0,NU
10b50 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 LL,NULL);...
10b60 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f /* PEM_write_bio
10b70 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f _RSAPrivateKey(o
10b80 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e ut, rsa, NULL, N
10b90 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 ULL, 0, NULL, NU
10ba0 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 LL); */... BI
10bb0 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
10bc0 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 .. .}....if ((ce
10bd0 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d rt=X509_new())==
10be0 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 NULL) {... Tc
10bf0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
10c00 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 rp,"Error genera
10c10 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ting certificate
10c20 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b request",NULL);
10c30 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f ... EVP_PKEY_
10c40 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
10c50 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
10c60 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
10c70 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 000L... BN_fr
10c80 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
10c90 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c .. return(TCL
10ca0 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 _ERROR);...}....
10cb0 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e X509_set_version
10cc0 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 (cert,2);...ASN1
10cd0 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 _INTEGER_set(X50
10ce0 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 9_get_serialNumb
10cf0 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 er(cert),serial)
10d00 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f ;...X509_gmtime_
10d10 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f adj(X509_getm_no
10d20 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 tBefore(cert),0)
10d30 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f ;...X509_gmtime_
10d40 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f adj(X509_getm_no
10d50 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f tAfter(cert),(lo
10d60 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 ng)60*60*24*days
10d70 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 );...X509_set_pu
10d80 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b bkey(cert,pkey);
10d90 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 ....name=X509_ge
10da0 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 t_subject_name(c
10db0 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 ert);....X509_NA
10dc0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
10dd0 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 txt(name,"C", MB
10de0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
10df0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
10e00 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c *) k_C, -1, -1,
10e10 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
10e20 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
10e30 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 t(name,"ST", MBS
10e40 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
10e50 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
10e60 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c *) k_ST, -1, -1,
10e70 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
10e80 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
10e90 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 t(name,"L", MBST
10ea0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
10eb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
10ec0 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 ) k_L, -1, -1, 0
10ed0 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
10ee0 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
10ef0 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 name,"O", MBSTRI
10f00 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
10f10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
10f20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b k_O, -1, -1, 0);
10f30 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
10f40 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
10f50 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e me,"OU", MBSTRIN
10f60 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
10f70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
10f80 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _OU, -1, -1, 0);
10f90 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
10fa0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
10fb0 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e me,"CN", MBSTRIN
10fc0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
10fd0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
10fe0 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _CN, -1, -1, 0);
10ff0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
11000 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
11010 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 me,"Email", MBST
11020 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
11030 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
11040 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d ) k_Email, -1, -
11050 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 1, 0);....X509_s
11060 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 et_subject_name(
11070 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 cert,name);....i
11080 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 f (!X509_sign(ce
11090 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 rt,pkey,EVP_sha2
110a0 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 56())) {... X
110b0 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 509_free(cert);.
110c0 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 .. EVP_PKEY_f
110d0 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
110e0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
110f0 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
11100 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 00L... BN_fre
11110 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 e(bne);.#endif..
11120 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
11130 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 lt(interp,"Error
11140 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 signing certifi
11150 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 cate",NULL);...
11160 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
11170 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 ROR;...}....if (
11180 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f isStr) {... o
11190 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
111a0 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 _mem());... P
111b0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 EM_write_bio_X50
111c0 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 9(out,cert);...
111d0 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 i=BIO_read(ou
111e0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 t,buffer,sizeof(
111f0 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 buffer)-1);...
11200 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 i=(i<0) ? 0 :
11210 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b i;... buffer[
11220 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 i]='\0';... T
11230 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
11240 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 ,pemout,buffer,0
11250 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 );... BIO_flu
11260 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 sh(out);... B
11270 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 IO_free(out);...
11280 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f } else {... o
11290 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
112a0 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 _file());...
112b0 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
112c0 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a me(out,pemout);.
112d0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
112e0 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 bio_X509(out,cer
112f0 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 t);... BIO_fr
11300 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d ee_all(out);...}
11310 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 ....X509_free(ce
11320 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f rt);...EVP_PKEY_
11330 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
11340 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
11350 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
11360 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 000L...BN_free(b
11370 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 ne);.#endif..
11380 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 }..}..break;.
11390 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 default:..brea
113a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 k;. }. ret
113b0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
113c0 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
113d0 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a Data;.}.../*****
113e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
113f0 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 ./* Init
11400 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
11410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
11420 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
11430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11460 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
11470 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a ls_Free --. *. *
11480 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
11490 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 cleans up when a
114a0 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
114b0 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 d channel. *.is
114c0 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 closed and its r
114d0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 eference count f
114e0 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a alls below 1. *.
114f0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e * Results:. *.n
11500 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
11510 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 ffects:. *.Frees
11520 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 all the state.
11530 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
11540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11570 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
11580 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a .Tls_Free(char *
11590 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 blockPtr) {.
115a0 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
115b0 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b = (State *)block
115c0 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 Ptr;.. dprint
115d0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
115e0 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 Tls_Clean(stat
115f0 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 ePtr);. ckfre
11600 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c e(blockPtr);.}..
11610 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
11620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11650 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
11660 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a Tls_Clean --. *.
11670 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
11680 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e e cleans up when
11690 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
116a0 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 sed channel. *.i
116b0 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 s closed and its
116c0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
116d0 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 falls below 1.
116e0 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 This should. *.
116f0 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 be called synchr
11700 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 onously by the C
11710 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e loseProc, not in
11720 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c the. *.Eventual
11730 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e lyFree callback.
11740 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
11750 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.none. *. * Si
11760 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 de effects:. *.F
11770 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 rees all the sta
11780 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d te. *. *--------
11790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
117a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
117b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
117c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
117d0 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 void Tls_Clean(S
117e0 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 tate *statePtr)
117f0 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 {. dprintf("C
11800 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
11810 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 . * we're as
11820 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 suming here that
11830 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 we're single-th
11840 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 readed. */.
11850 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
11860 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 >timer != (Tcl_T
11870 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 imerToken) NULL)
11880 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 {..Tcl_DeleteTi
11890 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 merHandler(state
118a0 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 Ptr->timer);..st
118b0 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 atePtr->timer =
118c0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
118d0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
118e0 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 rotos) {..ckfree
118f0 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
11900 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 s);..statePtr->p
11910 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 rotos = NULL;.
11920 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
11930 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a ePtr->bio) {../*
11940 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 This will call
11950 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 SSL_shutdown. Bu
11960 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 g 1414045 */..dp
11970 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f rintf("BIO_free_
11980 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 all(%p)", stateP
11990 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 tr->bio);..BIO_f
119a0 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 ree_all(statePtr
119b0 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 ->bio);..statePt
119c0 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 r->bio = NULL;.
119d0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
119e0 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 tePtr->ssl) {..d
119f0 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 printf("SSL_free
11a00 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d (%p)", statePtr-
11a10 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 >ssl);..SSL_free
11a20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
11a30 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 ..statePtr->ssl
11a40 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
11a50 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
11a60 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f ctx) {..SSL_CTX_
11a70 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 free(statePtr->c
11a80 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e tx);..statePtr->
11a90 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
11aa0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
11ab0 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a tr->callback) {.
11ac0 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
11ad0 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c t(statePtr->call
11ae0 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 back);..statePtr
11af0 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c ->callback = NUL
11b00 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
11b10 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
11b20 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 ord) {..Tcl_Decr
11b30 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
11b40 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 r->password);..s
11b50 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
11b60 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a d = NULL;. }.
11b70 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 . dprintf("Re
11b80 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f turning");.}.../
11b90 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
11ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11bd0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
11be0 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 s_Init --. *. *.
11bf0 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 This is a packag
11c00 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e e initialization
11c10 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 procedure, whic
11c20 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 h is called. *.b
11c30 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 y Tcl when this
11c40 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 package is to be
11c50 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 added to an int
11c60 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 erpreter.. *. *
11c70 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f Results: Ssl co
11c80 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 nfigured and loa
11c90 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ded. *. * Side e
11ca0 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 ffects:. *. crea
11cb0 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 te the ssl comma
11cc0 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 nd, initialize s
11cd0 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a sl context. *. *
11ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d20 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 ---. */.DLLEXPOR
11d30 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 T int Tls_Init(T
11d40 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
11d50 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 p) {. const c
11d60 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 har tlsTclInitSc
11d70 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c ript[] = {.#incl
11d80 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a ude "tls.tcl.h".
11d90 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 .0x00. };..
11da0 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
11db0 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 d");.. /*.
11dc0 20 20 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 * We only supp
11dd0 6f 72 74 20 54 63 6c 20 38 2e 34 20 6f 72 20 6e ort Tcl 8.4 or n
11de0 65 77 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ewer. */.
11df0 20 69 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 if (.#ifdef USE
11e00 5f 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c 5f _TCL_STUBS..Tcl_
11e10 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 InitStubs(interp
11e20 2c 20 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c 73 , "8.4", 0).#els
11e30 65 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 e..Tcl_PkgRequir
11e40 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c e(interp, "Tcl",
11e50 20 22 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e 64 "8.4-", 0).#end
11e60 69 66 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a if.. == NULL) {.
11e70 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
11e80 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 R;. }.. if
11e90 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 (TlsLibInit(0)
11ea0 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 != TCL_OK) {..Tc
11eb0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
11ec0 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f nterp, "could no
11ed0 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c t initialize SSL
11ee0 20 6c 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 library", NULL)
11ef0 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
11f00 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
11f10 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
11f20 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
11f30 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 s::ciphers", Cip
11f40 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 hersObjCmd, (Cli
11f50 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
11f60 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
11f70 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
11f80 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
11f90 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
11fa0 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e connection", Con
11fb0 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d nectionInfoObjCm
11fc0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
11fd0 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
11fe0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
11ff0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
12000 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
12010 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 "tls::handshake
12020 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 ", HandshakeObjC
12030 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
12040 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
12050 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
12060 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
12070 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
12080 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c , "tls::import",
12090 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 ImportObjCmd, (
120a0 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
120b0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
120c0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
120d0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
120e0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
120f0 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e s::unimport", Un
12100 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 importObjCmd, (C
12110 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
12120 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
12130 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
12140 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
12150 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
12160 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 ::status", Statu
12170 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 sObjCmd, (Client
12180 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
12190 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
121a0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
121b0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
121c0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 nterp, "tls::ver
121d0 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 sion", VersionOb
121e0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
121f0 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
12200 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
12210 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
12220 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
12230 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c rp, "tls::misc",
12240 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c MiscObjCmd, (Cl
12250 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
12260 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
12270 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
12280 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
12290 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
122a0 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f :protocols", Pro
122b0 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 tocolsObjCmd, (C
122c0 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
122d0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
122e0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 *) NULL);..
122f0 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 if (interp) {..T
12300 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 cl_Eval(interp,
12310 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 tlsTclInitScript
12320 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 );. }.. re
12330 74 75 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f 76 turn(Tcl_PkgProv
12340 69 64 65 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 ide(interp, "tls
12350 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 ", PACKAGE_VERSI
12360 4f 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d ON));.}../*. *--
12370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
123a0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f ----*. *. *.Tls_
123b0 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 SafeInit --. *.
123c0 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
123d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
123e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
123f0 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 --*. *.Standard
12400 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 procedure requir
12410 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a ed by 'load'.. *
12420 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 .Initializes thi
12430 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 s extension for
12440 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 a safe interpret
12450 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d er.. *.---------
12460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12480 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 -------*. *. *.S
12490 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
124a0 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 .As of 'Tls_Init
124b0 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a '. *. *.Result:.
124c0 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 *..A standard T
124d0 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 cl error code..
124e0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
124f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a ----------*. */.
12520 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c DLLEXPORT int Tl
12530 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 s_SafeInit(Tcl_I
12540 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b nterp *interp) {
12550 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
12560 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 lled");. retu
12570 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 rn(Tls_Init(inte
12580 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d rp));.}../*. *--
12590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
125a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
125b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
125c0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c ----*. *. *.TlsL
125d0 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 ibInit --. *. *.
125e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
125f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12610 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 *. *.Initializes
12620 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 SSL library onc
12630 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f e per applicatio
12640 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d n. *.-----------
12650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12670 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 -----*. *. *.Sid
12680 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 e effects:. *..i
12690 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c nitializes SSL l
126a0 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 ibrary. *. *.Res
126b0 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a ult:. *..none. *
126c0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
126d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
126e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
126f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 ---------*. */.s
12700 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 tatic int TlsLib
12710 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 Init(int uniniti
12720 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 alize) {. sta
12730 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 tic int initiali
12740 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 zed = 0;. int
12750 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b status = TCL_OK
12760 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ;.#if defined(OP
12770 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
12780 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
12790 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f READS). size_
127a0 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e t num_locks;.#en
127b0 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 dif.. if (uni
127c0 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 nitialize) {.
127d0 20 20 20 20 20 69 66 20 28 21 69 6e 69 74 69 61 if (!initia
127e0 6c 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20 lized) {.
127f0 20 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 dprintf("As
12800 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c ked to uninitial
12810 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 ize, but we are
12820 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 not initialized"
12830 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 );..
12840 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a return(TCL_OK);.
12850 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 }..
12860 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 dprintf("Aske
12870 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a d to uninitializ
12880 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 e");..#if define
12890 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
128a0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
128b0 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 20 L_THREADS).
128c0 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b Tcl_MutexLock
128d0 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 20 20 20 (&init_mx);..
128e0 20 20 20 20 20 69 66 20 28 6c 6f 63 6b 73 29 20 if (locks)
128f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 72 {. fr
12900 65 65 28 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 20 ee(locks);.
12910 20 20 20 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e locks = N
12920 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 ULL;.
12930 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b locksCount = 0;
12940 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 . }.#endi
12950 66 0a 20 20 20 20 20 20 20 20 69 6e 69 74 69 61 f. initia
12960 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 lized = 0;..#if
12970 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
12980 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
12990 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
129a0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4d 75 74 . Tcl_Mut
129b0 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d exUnlock(&init_m
129c0 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 x);.#endif..
129d0 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f return(TCL_O
129e0 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 K);. }.. i
129f0 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 f (initialized)
12a00 7b 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e 74 {. dprint
12a10 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 f("Called, but u
12a20 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 sing cached valu
12a30 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 e");. ret
12a40 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 urn(status);.
12a50 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 }.. dprintf(
12a60 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 "Called");..#if
12a70 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
12a80 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
12a90 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
12aa0 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f . Tcl_MutexLo
12ab0 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 ck(&init_mx);.#e
12ac0 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c ndif. initial
12ad0 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 ized = 1;..#if d
12ae0 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
12af0 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
12b00 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
12b10 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 num_locks =
12b20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 1;. locksCoun
12b30 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f t = (int) num_lo
12b40 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d cks;. locks =
12b50 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a malloc(sizeof(*
12b60 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 locks) * num_loc
12b70 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 ks);. memset(
12b80 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 locks, 0, sizeof
12b90 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c (*locks) * num_l
12ba0 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 ocks);.#endif..
12bb0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 /* Initialize
12bc0 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 BOTH libcrypto
12bd0 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 and libssl. */.
12be0 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f OPENSSL_init_
12bf0 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 ssl(OPENSSL_INIT
12c00 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 _LOAD_SSL_STRING
12c10 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 S | OPENSSL_INIT
12c20 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 _LOAD_CRYPTO_STR
12c30 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f INGS..| OPENSSL_
12c40 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 INIT_ADD_ALL_CIP
12c50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 HERS | OPENSSL_I
12c60 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 NIT_ADD_ALL_DIGE
12c70 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 STS, NULL);..
12c80 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c BIO_new_tcl(NUL
12c90 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 L, 0);..#if 0.
12ca0 20 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a /*. * XXX:
12cb0 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 TODO: Remove thi
12cc0 73 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 s code and repla
12cd0 63 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65 ce it with a che
12ce0 63 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e ck. * for en
12cf0 6f 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 ough entropy and
12d00 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 do not try to c
12d10 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 reate our own.
12d20 20 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e * terrible en
12d30 74 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 tropy. */.
12d40 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 /*. * Seed
12d50 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 the random numb
12d60 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 er generator in
12d70 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c the SSL library,
12d80 0a 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 . * using th
12d90 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 e do/while const
12da0 72 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 ruct because of
12db0 74 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 the bug note in
12dc0 74 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 the. * OpenS
12dd0 53 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f SL FAQ at http:/
12de0 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 /www.openssl.org
12df0 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d /support/faq.htm
12e00 6c 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 l#USER1. *.
12e10 20 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f * The crux o
12e20 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 f the problem is
12e30 20 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 that Solaris 7
12e40 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a does not have a.
12e50 20 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 * /dev/rand
12e60 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 om or /dev/urand
12e70 6f 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 om device so it
12e80 63 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e cannot gather en
12e90 6f 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 ough. * entr
12ea0 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e opy from the RAN
12eb0 44 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c D_seed() when TL
12ec0 53 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e S initializes an
12ed0 64 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a d refuses. *
12ee0 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 to go further.
12ef0 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 Earlier versions
12f00 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 of OpenSSL carr
12f10 69 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 ied on regardles
12f20 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 s.. */. s
12f30 72 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 rand((unsigned i
12f40 6e 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 nt) time((time_t
12f50 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 *) NULL));.
12f60 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 do {..for (i = 0
12f70 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b ; i < 16; i++) {
12f80 0a 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 .. rnd_seed[i
12f90 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 ] = 1 + (char) (
12fa0 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 255.0 * rand()/(
12fb0 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a RAND_MAX+1.0));.
12fc0 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e .}..RAND_seed(rn
12fd0 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 d_seed, sizeof(r
12fe0 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d nd_seed));. }
12ff0 20 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 while (RAND_sta
13000 74 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e tus() != 1);.#en
13010 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 dif..#if defined
13020 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
13030 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
13040 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d _THREADS)..Tcl_M
13050 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 utexUnlock(&init
13060 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 _mx);.#endif...r
13070 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d eturn(status);.}
13080 0a .