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: 74 69 63 6b 65 74 20 68 61 73 20 62 65 65 6e 20 ticket has been
2f40: 72 65 63 65 69 76 65 64 2e 20 49 6e 20 54 4c 53 received. In TLS
2f50: 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 1.3. *.this may
2f60: 20 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c be received mul
2f70: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 tiple times afte
2f80: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e r the handshake.
2f90: 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 For. *.earlier
2fa0: 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 versions, this w
2fb0: 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 ill be received
2fc0: 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 during the hands
2fd0: 68 61 6b 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 hake.. *. * Resu
2fe0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
2ff0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
3000: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
3010: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
3020: 20 2a 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 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
3070: 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c int.SessionCall
3080: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a back(const SSL *
3090: 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e ssl, SSL_SESSION
30a0: 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 20 *session) {.
30b0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
30c0: 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 = (State*)SSL_g
30d0: 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c et_app_data((SSL
30e0: 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c *)ssl);. Tcl
30f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
3100: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
3110: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
3120: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e *cmdPtr;. con
3130: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
3140: 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 6f *ticket;. co
3150: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
3160: 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 20 r *session_id;.
3170: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 int len;.
3180: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 73 69 int code;. si
3190: 7a 65 5f 74 20 6c 65 6e 32 3b 0a 0a 20 20 20 20 ze_t len2;..
31a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
31b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
31c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
31d0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
31e0: 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 )..return 0;..
31f0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
3200: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
3210: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
3220: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
3230: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3240: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
3250: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
3260: 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a session", -1));.
3270: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 . /* Session
3280: 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f id */. sessio
3290: 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 n_id = SSL_SESSI
32a0: 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 ON_get0_id_conte
32b0: 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 6c 65 6e xt(session, &len
32c0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
32d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
32e0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
32f0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
3300: 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 6c 65 6e (session_id, len
3310: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 ));.. /* Sess
3320: 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a 20 20 ion ticket */.
3330: 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 SSL_SESSION_ge
3340: 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f t0_ticket(sessio
3350: 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e n, &ticket, &len
3360: 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 2);. Tcl_List
3370: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3380: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3390: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
33a0: 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 6c j(ticket, (int)l
33b0: 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c en2));.. /* L
33c0: 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 ifetime - number
33d0: 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 of seconds */.
33e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
33f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3400: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c rp, cmdPtr,..Tcl
3410: 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e _NewLongObj((lon
3420: 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 g) SSL_SESSION_g
3430: 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 et_ticket_lifeti
3440: 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 me_hint(session)
3450: 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 ));.. Tcl_Pre
3460: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 serve((ClientDat
3470: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 a) interp);.
3480: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c Tcl_Preserve((Cl
3490: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
34a0: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e tr);.. Tcl_In
34b0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
34c0: 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 r);. code = T
34d0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 cl_EvalObjEx(int
34e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c erp, cmdPtr, TCL
34f0: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 _EVAL_GLOBAL);.
3500: 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 if (code != T
3510: 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 CL_OK) {.#if (TC
3520: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
3530: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 == 8) && (TCL_MI
3540: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 NOR_VERSION < 6)
3550: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
3560: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 Error(interp);.#
3570: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 else..Tcl_Backgr
3580: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e oundException(in
3590: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e terp, code);.#en
35a0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 dif. }. Tc
35b0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
35c0: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c mdPtr);.. Tcl
35d0: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
35e0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
35f0: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 . Tcl_Release
3600: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
3610: 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 terp);. retur
3620: 6e 20 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d n 1;.}.../*. *--
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3670: 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c -. *. * ALPN Cal
3680: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 lback for Server
3690: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 53 65 6c 65 63 s --. *. *.Selec
36a0: 74 20 77 68 69 63 68 20 70 72 6f 74 6f 63 6f 6c t which protocol
36b0: 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 (http/1.1, h2,
36c0: 68 33 2c 20 65 74 63 2e 29 20 74 6f 20 75 73 65 h3, etc.) to use
36d0: 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f for the. *.inco
36e0: 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e ming connection.
36f0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
3700: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
3710: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
3720: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
3730: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
3740: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
3750: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
3760: 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 _OK: ALPN protoc
3770: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 ol selected. The
3780: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
3790: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c inues.. *.SSL_TL
37a0: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 SEXT_ERR_ALERT_F
37b0: 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 ATAL: There was
37c0: 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 no overlap betwe
37d0: 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a en the client's.
37e0: 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 *. supplied
37f0: 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 list and the ser
3800: 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f ver configuratio
3810: 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f n. The connectio
3820: 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 n will be aborte
3830: 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 d.. *.SSL_TLSEXT
3840: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e _ERR_NOACK: ALPN
3850: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 protocol not se
3860: 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 lected, e.g., be
3870: 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a cause no ALPN. *
3880: 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 . protocols a
3890: 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f re configured fo
38a0: 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f r this connectio
38b0: 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f n. The connectio
38c0: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a n continues.. *.
38d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3910: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
3920: 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 int.ALPNCallbac
3930: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
3940: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 , const unsigned
3950: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 char **out, uns
3960: 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c igned char *outl
3970: 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 en,..const unsig
3980: 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e ned char *in, un
3990: 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e signed int inlen
39a0: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 , void *arg) {.
39b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
39c0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 tr = (State*)arg
39d0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
39e0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
39f0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
3a00: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
3a10: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a ;. int code;.
3a20: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
3a30: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
3a40: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
3a50: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a ack == (Tcl_Obj*
3a60: 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 53 )NULL)..return S
3a70: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
3a80: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 ;.. /* Select
3a90: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 protocol */.
3aa0: 20 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 SSL_select_next
3ab0: 5f 70 72 6f 74 6f 28 6f 75 74 2c 20 6f 75 74 6c _proto(out, outl
3ac0: 65 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 en, statePtr->pr
3ad0: 6f 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d 3e otos, statePtr->
3ae0: 70 72 6f 74 6f 73 5f 6c 65 6e 2c 20 69 6e 2c 20 protos_len, in,
3af0: 69 6e 6c 65 6e 29 3b 0a 0a 20 20 20 20 63 6d 64 inlen);.. cmd
3b00: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
3b10: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
3b20: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 >callback);.
3b30: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
3b40: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
3b50: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
3b60: 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 StringObj("alpn"
3b70: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
3b80: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3b90: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3ba0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
3bb0: 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 ngObj(*out, -1))
3bc0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 ;.. Tcl_Prese
3bd0: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 rve((ClientData)
3be0: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 interp);. Tc
3bf0: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 l_Preserve((Clie
3c00: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
3c10: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 );.. Tcl_Incr
3c20: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
3c30: 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c ;. code = Tcl
3c40: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 _EvalObjEx(inter
3c50: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 p, cmdPtr, TCL_E
3c60: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 VAL_GLOBAL);.
3c70: 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c if (code != TCL
3c80: 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f _OK) {.#if (TCL_
3c90: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d MAJOR_VERSION ==
3ca0: 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 8) && (TCL_MINO
3cb0: 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 R_VERSION < 6)..
3cc0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 Tcl_BackgroundEr
3cd0: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c ror(interp);.#el
3ce0: 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 se..Tcl_Backgrou
3cf0: 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 ndException(inte
3d00: 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 rp, code);.#endi
3d10: 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f f. }. Tcl_
3d20: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
3d30: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 Ptr);.. Tcl_R
3d40: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
3d50: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 ta) statePtr);.
3d60: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
3d70: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
3d80: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 rp);. return
3d90: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
3da0: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
3db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3df0: 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 *. * SNI Callba
3e00: 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d ck for Servers -
3e10: 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 -. *. *.Perform
3e20: 73 65 72 76 65 72 20 6e 61 6d 65 20 73 65 6c 65 server name sele
3e30: 63 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73 75 ction. *. * Resu
3e40: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
3e50: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
3e60: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
3e70: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
3e80: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
3e90: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
3ea0: 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f T_ERR_OK: SNI ho
3eb0: 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74 stname is accept
3ec0: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
3ed0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
3ee0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
3ef0: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 ALERT_FATAL: SNI
3f00: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 hostname is not
3f10: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 accepted. The c
3f20: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 onnection. *.
3f30: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66 is aborted. Def
3f40: 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69 ault for alert i
3f50: 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 s SSL_AD_UNRECOG
3f60: 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 NIZED_NAME.. *.S
3f70: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
3f80: 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 ERT_WARNING: SNI
3f90: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 hostname is not
3fa0: 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69 accepted, warni
3fb0: 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 ng alert. *.
3fc0: 73 65 6e 74 20 28 6e 6f 74 20 69 6e 20 54 4c 53 sent (not in TLS
3fd0: 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65 v1.3). The conne
3fe0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
3ff0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
4000: 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f RR_NOACK: SNI ho
4010: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
4020: 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 61 cepted and not a
4030: 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09 cknowledged,. *.
4040: 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 20 e.g. if SNI
4050: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e has not been con
4060: 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f 6e figured. The con
4070: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
4080: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d s.. *. *--------
4090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
40d0: 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 61 static int.SNICa
40e0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
40f0: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 *ssl, int *aler
4100: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a t, void *arg) {.
4110: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
4120: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
4130: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 g;. Tcl_Inter
4140: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
4150: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
4160: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
4170: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b r;. int code;
4180: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 . char *serve
4190: 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 rname = NULL;..
41a0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
41b0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
41c0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
41d0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e k == (Tcl_Obj*)N
41e0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
41f0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
4200: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
4210: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl == NULL) {.
4220: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4230: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
4240: 20 20 7d 0a 0a 20 20 20 20 73 65 72 76 65 72 6e }.. servern
4250: 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 ame = SSL_get_se
4260: 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c rvername(ssl, TL
4270: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f SEXT_NAMETYPE_ho
4280: 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 st_name);. if
4290: 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c (!servername ||
42a0: 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d servername[0] =
42b0: 3d 20 27 5c 30 27 29 20 7b 0a 20 20 20 20 20 20 = '\0') {.
42c0: 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 return SSL_TLS
42d0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
42e0: 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 }.. cmdPtr
42f0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
4300: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
4310: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c llback);. Tcl
4320: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4330: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4340: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
4350: 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 ingObj("sni", -1
4360: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
4370: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
4380: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
4390: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
43a0: 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d j(servername , -
43b0: 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 1));.. Tcl_Pr
43c0: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
43d0: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 ta) interp);.
43e0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 Tcl_Preserve((C
43f0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
4400: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 Ptr);.. Tcl_I
4410: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
4420: 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 tr);. code =
4430: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e Tcl_EvalObjEx(in
4440: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 terp, cmdPtr, TC
4450: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a L_EVAL_GLOBAL);.
4460: 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 if (code !=
4470: 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 TCL_OK) {.#if (T
4480: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
4490: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d == 8) && (TCL_M
44a0: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 INOR_VERSION < 6
44b0: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e )..Tcl_Backgroun
44c0: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a dError(interp);.
44d0: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 #else..Tcl_Backg
44e0: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 roundException(i
44f0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 nterp, code);.#e
4500: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 ndif. }. T
4510: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
4520: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 cmdPtr);.. Tc
4530: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
4540: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
4550: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 ;. Tcl_Releas
4560: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
4570: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 nterp);. retu
4580: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
4590: 52 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d R_OK;.}.../*. *-
45a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45e0: 2d 2d 0a 20 2a 0a 20 2a 20 48 65 6c 6c 6f 20 43 --. *. * Hello C
45f0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 allback for Serv
4600: 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 ers --. *. *.Use
4610: 64 20 62 79 20 73 65 72 76 65 72 20 74 6f 20 65 d by server to e
4620: 78 61 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65 xamine the serve
4630: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f r name indicatio
4640: 6e 20 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f n (SNI) extensio
4650: 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79 n. *.provided by
4660: 20 74 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f the client in o
4670: 72 64 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61 rder to select a
4680: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 65 n appropriate ce
4690: 72 74 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 rtificate to. *.
46a0: 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b present, and mak
46b0: 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 e other configur
46c0: 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 ation adjustment
46d0: 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 s relevant to th
46e0: 61 74 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d at server. *.nam
46f0: 65 20 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 e and its config
4700: 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e uration. This in
4710: 63 6c 75 64 65 73 20 73 77 61 70 70 69 6e 67 20 cludes swapping
4720: 6f 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 out the associat
4730: 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f ed. *.SSL_CTX po
4740: 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 inter, modifying
4750: 20 74 68 65 20 73 65 72 76 65 72 27 73 20 6c 69 the server's li
4760: 73 74 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20 st of permitted
4770: 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a 2a 09 TLS versions,.*.
4780: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 changing the ser
4790: 76 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 ver's cipher lis
47a0: 74 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f t in response to
47b0: 20 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 the client's ci
47c0: 70 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a pher list, etc..
47d0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
47e0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
47f0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
4800: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
4810: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
4820: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
4830: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c .SSL_CLIENT_HELL
4840: 4f 5f 52 45 54 52 59 20 3d 20 73 75 73 70 65 6e O_RETRY = suspen
4850: 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c d the handshake,
4860: 20 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 and the handsha
4870: 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c ke function will
4880: 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 return immediat
4890: 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e ely. *.SSL_CLIEN
48a0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 20 3d 20 T_HELLO_ERROR =
48b0: 66 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 failure, termina
48c0: 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 te connection. S
48d0: 65 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f et alert to erro
48e0: 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 r code.. *.SSL_C
48f0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 LIENT_HELLO_SUCC
4900: 45 53 53 20 3d 20 73 75 63 63 65 73 73 0a 20 2a ESS = success. *
4910: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4950: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
4960: 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 c int.HelloCallb
4970: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
4980: 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 sl, int *alert,
4990: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 void *arg) {.
49a0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
49b0: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a = (State*)arg;.
49c0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
49d0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
49e0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
49f0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
4a00: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 int code;.
4a10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 const char *se
4a20: 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f rvername;. co
4a30: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4a40: 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74 r *p;. size_t
4a50: 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b len, remaining;
4a60: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
4a70: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
4a80: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
4a90: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
4aa0: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 *)NULL)..return
4ab0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
4ac0: 5f 53 55 43 43 45 53 53 3b 0a 0a 20 20 20 20 2f _SUCCESS;.. /
4ad0: 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 * Get names */.
4ae0: 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 if (!SSL_clie
4af0: 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 nt_hello_get0_ex
4b00: 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 t(ssl, TLSEXT_TY
4b10: 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 PE_server_name,
4b20: 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 &p, &remaining)
4b30: 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 || remaining <=
4b40: 32 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 2) {. ret
4b50: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
4b60: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
4b70: 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 }.. /* Extrac
4b80: 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 t the length of
4b90: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73 the supplied lis
4ba0: 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 t of names. */.
4bb0: 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 len = (*(p++)
4bc0: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 << 8);. len
4bd0: 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 += *(p++);. i
4be0: 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 f (len + 2 != re
4bf0: 6d 61 69 6e 69 6e 67 29 20 7b 0a 20 20 20 20 20 maining) {.
4c00: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c return SSL_CL
4c10: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
4c20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 ;. }. rema
4c30: 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 ining = len;..
4c40: 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e /* The list in
4c50: 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 practice only h
4c60: 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d as a single elem
4c70: 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 ent, so we only
4c80: 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 consider the fir
4c90: 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 st one. */. i
4ca0: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 f (remaining ==
4cb0: 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 0 || *p++ != TLS
4cc0: 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 EXT_NAMETYPE_hos
4cd0: 74 5f 6e 61 6d 65 29 20 7b 0a 20 20 20 20 20 20 t_name) {.
4ce0: 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 return SSL_CLI
4cf0: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
4d00: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 . }. remai
4d10: 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 ning--;.. /*
4d20: 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c Now we can final
4d30: 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 ly pull out the
4d40: 62 79 74 65 20 61 72 72 61 79 20 77 69 74 68 20 byte array with
4d50: 74 68 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e the actual hostn
4d60: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 ame. */. if (
4d70: 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 remaining <= 2)
4d80: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e {. return
4d90: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
4da0: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 O_ERROR;. }.
4db0: 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 len = (*(p++)
4dc0: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 << 8);. len
4dd0: 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 += *(p++);. i
4de0: 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d f (len + 2 > rem
4df0: 61 69 6e 69 6e 67 29 20 7b 0a 20 20 20 20 20 20 aining) {.
4e00: 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 return SSL_CLI
4e10: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
4e20: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 . }. remai
4e30: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 ning = len;.
4e40: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f servername = (co
4e50: 6e 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 nst char *)p;..
4e60: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
4e70: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
4e80: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
4e90: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
4ea0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
4eb0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
4ec0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
4ed0: 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 "hello", -1));.
4ee0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4ef0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4f00: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
4f10: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 NewStringObj(ser
4f20: 76 65 72 6e 61 6d 65 2c 20 28 69 6e 74 29 6c 65 vername, (int)le
4f30: 6e 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 n));.. Tcl_Pr
4f40: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
4f50: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 ta) interp);.
4f60: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 Tcl_Preserve((C
4f70: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
4f80: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 Ptr);.. Tcl_I
4f90: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
4fa0: 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 tr);. code =
4fb0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e Tcl_EvalObjEx(in
4fc0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 terp, cmdPtr, TC
4fd0: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a L_EVAL_GLOBAL);.
4fe0: 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 if (code !=
4ff0: 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 TCL_OK) {.#if (T
5000: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
5010: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d == 8) && (TCL_M
5020: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 INOR_VERSION < 6
5030: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e )..Tcl_Backgroun
5040: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a dError(interp);.
5050: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 #else..Tcl_Backg
5060: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 roundException(i
5070: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 nterp, code);.#e
5080: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 ndif. }. T
5090: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
50a0: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 cmdPtr);.. Tc
50b0: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
50c0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
50d0: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 ;. Tcl_Releas
50e0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
50f0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 nterp);. retu
5100: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
5110: 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 7d 0a 0c LLO_SUCCESS;.}..
5120: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
5130: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 ******/./* Comma
5140: 6e 64 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f nds */./
5150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5160: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ****/../*. *----
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
51b0: 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a *. * CiphersObj
51c0: 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 Cmd -- list avai
51d0: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a lable ciphers. *
51e0: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
51f0: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f re is invoked to
5200: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c process the "tl
5210: 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d s::ciphers" comm
5220: 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 and. *.to list a
5230: 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 vailable ciphers
5240: 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f , based upon pro
5250: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a tocol selected..
5260: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
5270: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
5280: 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a result list.. *
5290: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
52a0: 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 :. *.constructs
52b0: 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c and destroys SSL
52c0: 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 context (CTX).
52d0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
52e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5310: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
5320: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 ic const char *p
5330: 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 rotocols[] = {..
5340: 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 "ssl2", "ssl3",
5350: 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 "tls1", "tls1.1"
5360: 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 , "tls1.2", "tls
5370: 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 1.3", NULL.};.en
5380: 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 um protocol {.
5390: 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f TLS_SSL2, TLS_
53a0: 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 SSL3, TLS_TLS1,
53b0: 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f TLS_TLS1_1, TLS_
53c0: 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 TLS1_2, TLS_TLS1
53d0: 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a _3, TLS_NONE.};.
53e0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 .static int.Ciph
53f0: 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 ersObjCmd(Client
5400: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
5410: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
5420: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
5430: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
5440: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
5450: 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 Obj *objPtr = NU
5460: 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 LL;. SSL_CTX
5470: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *ctx = NULL;.
5480: 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c SSL *ssl = NULL
5490: 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 ;. STACK_OF(S
54a0: 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a SL_CIPHER) *sk;.
54b0: 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 char *cp, bu
54c0: 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 f[BUFSIZ];. i
54d0: 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 nt index, verbos
54e0: 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f e = 0, use_suppo
54f0: 72 74 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 rted = 0;.. d
5500: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
5510: 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 ;.. if ((objc
5520: 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e < 2) || (objc >
5530: 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 4)) {..Tcl_Wron
5540: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
5550: 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 1, objv, "proto
5560: 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 col ?verbose? ?s
5570: 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 upported?");..re
5580: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
5590: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 }. if (Tc
55a0: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 l_GetIndexFromOb
55b0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 j(interp, objv[1
55c0: 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 ], protocols, "p
55d0: 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e rotocol", 0, &in
55e0: 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 dex) != TCL_OK)
55f0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
5600: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
5610: 66 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 f ((objc > 2) &&
5620: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 Tcl_GetBooleanF
5630: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
5640: 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 bjv[2], &verbose
5650: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
5660: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
5670: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
5680: 28 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 (objc > 3) && Tc
5690: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d l_GetBooleanFrom
56a0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
56b0: 5b 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 [3], &use_suppor
56c0: 74 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ted) != TCL_OK)
56d0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
56e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
56f0: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
5700: 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 );.. switch (
5710: 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 (enum protocol)i
5720: 6e 64 65 78 29 20 7b 0a 09 63 61 73 65 20 54 4c ndex) {..case TL
5730: 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e S_SSL2:.#if OPEN
5740: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
5750: 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 ER >= 0x10100000
5760: 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f L || defined(NO_
5770: 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL2) || defined
5780: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
5790: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
57a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
57b0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
57c0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
57d0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
57e0: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
57f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
5800: 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c e.. ctx = SSL
5810: 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d _CTX_new(SSLv2_m
5820: 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b ethod()); break;
5830: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
5840: 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 S_SSL3:.#if defi
5850: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 ned(NO_SSL3) ||
5860: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
5870: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 NO_SSL3) || defi
5880: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
5890: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 SL3_METHOD)..
58a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
58b0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
58c0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
58d0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
58e0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
58f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
5900: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 RROR;.#else..
5910: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e ctx = SSL_CTX_n
5920: 65 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 ew(SSLv3_method(
5930: 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 )); break;.#endi
5940: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
5950: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f :.#if defined(NO
5960: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 _TLS1) || define
5970: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
5980: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
5990: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 ENSSL_NO_TLS1_ME
59a0: 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 THOD).. Tcl_A
59b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
59c0: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e rp, protocols[in
59d0: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f dex], ": protoco
59e0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
59f0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 , NULL);.. re
5a00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
5a10: 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d #else.. ctx =
5a20: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 SSL_CTX_new(TLS
5a30: 76 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 v1_method()); br
5a40: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 eak;.#endif..cas
5a50: 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 e TLS_TLS1_1:.#i
5a60: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
5a70: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_1) || defined(
5a80: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
5a90: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
5aa0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f ENSSL_NO_TLS1_1_
5ab0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c METHOD).. Tcl
5ac0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
5ad0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
5ae0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
5af0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
5b00: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 d", NULL);..
5b10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
5b20: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 ;.#else.. ctx
5b30: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 = SSL_CTX_new(T
5b40: 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 29 LSv1_1_method())
5b50: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
5b60: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 .case TLS_TLS1_2
5b70: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f :.#if defined(NO
5b80: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
5b90: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
5ba0: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
5bb0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
5bc0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 1_2_METHOD)..
5bd0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
5be0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
5bf0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
5c00: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
5c10: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
5c20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
5c30: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 RROR;.#else..
5c40: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e ctx = SSL_CTX_n
5c50: 65 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f ew(TLSv1_2_metho
5c60: 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e d()); break;.#en
5c70: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c dif..case TLS_TL
5c80: 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 S1_3:.#if define
5c90: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 d(NO_TLS1_3) ||
5ca0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
5cb0: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 NO_TLS1_3)..
5cc0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
5cd0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
5ce0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
5cf0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
5d00: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
5d10: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
5d20: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
5d30: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
5d40: 77 28 54 4c 53 5f 6d 65 74 68 6f 64 28 29 29 3b w(TLS_method());
5d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 53 4c . SSL
5d60: 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f _CTX_set_min_pro
5d70: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 to_version(ctx,
5d80: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b TLS1_3_VERSION);
5d90: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
5da0: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 t_max_proto_vers
5db0: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
5dc0: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 VERSION);.. b
5dd0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 reak;.#endif..de
5de0: 66 61 75 6c 74 3a 0a 09 20 20 20 20 62 72 65 61 fault:.. brea
5df0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 k;. }. if
5e00: 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ctx == NULL) {.
5e10: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
5e20: 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e t(interp, REASON
5e30: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 (), NULL);..retu
5e40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
5e50: 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 }.. ssl = S
5e60: 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 SL_new(ctx);.
5e70: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
5e80: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
5e90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 esult(interp, RE
5ea0: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 ASON(), NULL);..
5eb0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
5ec0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
5ed0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
5ee0: 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 /* Use list and
5ef0: 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 order as would
5f00: 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 be sent in a Cli
5f10: 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 entHello or all
5f20: 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 available cipher
5f30: 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 s */. if (use
5f40: 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 _supported) {..s
5f50: 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 k = SSL_get1_sup
5f60: 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 ported_ciphers(s
5f70: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 sl);. } else
5f80: 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f {..sk = SSL_get_
5f90: 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 ciphers(ssl);.
5fa0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 }.. if (sk
5fb0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 != NULL) {..if (
5fc0: 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 !verbose) {..
5fd0: 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 objPtr = Tcl_Ne
5fe0: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
5ff0: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 );.. for (int
6000: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 i = 0; i < sk_S
6010: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b SL_CIPHER_num(sk
6020: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 ); i++) {...cons
6030: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 t SSL_CIPHER *c
6040: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f = sk_SSL_CIPHER_
6050: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 value(sk, i);...
6060: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 if (c == NULL) c
6070: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 ontinue;..../* c
6080: 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e ipher name or (N
6090: 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 ONE) */...cp = S
60a0: 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 SL_CIPHER_get_na
60b0: 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 me(c);...if (cp
60c0: 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a == NULL) break;.
60d0: 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
60e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
60f0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
6100: 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 ewStringObj(cp,
6110: 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d -1));.. }...}
6120: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a else {.. obj
6130: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 Ptr = Tcl_NewStr
6140: 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 ingObj("",0);..
6150: 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 for (int i =
6160: 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 0; i < sk_SSL_CI
6170: 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b PHER_num(sk); i+
6180: 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c +) {...const SSL
6190: 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f _CIPHER *c = sk_
61a0: 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 SSL_CIPHER_value
61b0: 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 (sk, i);...if (c
61c0: 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e == NULL) contin
61d0: 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 ue;..../* textua
61e0: 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 l description of
61f0: 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 the cipher */..
6200: 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f .if (SSL_CIPHER_
6210: 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 description(c, b
6220: 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 uf, sizeof(buf))
6230: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 != NULL) {...
6240: 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 Tcl_AppendToOb
6250: 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 j(objPtr, buf, (
6260: 69 6e 74 29 20 73 74 72 6c 65 6e 28 62 75 66 29 int) strlen(buf)
6270: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
6280: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f Tcl_AppendTo
6290: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b Obj(objPtr, "UNK
62a0: 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d NOWN\n", 8);...}
62b0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 .. }..}..if (
62c0: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b use_supported) {
62d0: 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 .. sk_SSL_CIP
62e0: 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d HER_free(sk);..}
62f0: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 . }. SSL_f
6300: 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 ree(ssl);. SS
6310: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
6320: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
6330: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
6340: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
6350: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
6360: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
6370: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
63a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
63b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
63c0: 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c -. *. * Protocol
63d0: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 sObjCmd -- list
63e0: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 available protoc
63f0: 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 ols. *. *.This p
6400: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
6410: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 ked to process t
6420: 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f he "tls::protoco
6430: 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 ls" command. *.t
6440: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 o list available
6450: 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 protocols.. *.
6460: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
6470: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
6480: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 ult list.. *. *
6490: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
64a0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .none. *. *-----
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 0a 20 --------------.
64f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 */.static int.Pr
6500: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c otocolsObjCmd(Cl
6510: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
6520: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
6530: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
6540: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
6550: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
6560: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
6570: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
6580: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
6590: 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 (objc != 1) {..
65a0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
65b0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
65c0: 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 , "");..return T
65d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
65e0: 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 . objPtr = Tc
65f0: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
6600: 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e NULL);..#if OPEN
6610: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
6620: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c ER < 0x10100000L
6630: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f && !defined(NO_
6640: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 SSL2) && !define
6650: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
6660: 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 2). Tcl_ListO
6670: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
6680: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
6690: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
66a0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 (protocols[TLS_S
66b0: 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 SL2], -1));.#end
66c0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
66d0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
66e0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
66f0: 53 53 4c 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 SSL3). Tcl_Li
6700: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
6710: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
6720: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
6730: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
6740: 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 S_SSL3], -1));.#
6750: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
6760: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 ed(NO_TLS1) && !
6770: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
6780: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 54 63 6c NO_TLS1). Tcl
6790: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
67a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
67b0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
67c0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
67d0: 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 [TLS_TLS1], -1))
67e0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
67f0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
6800: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
6810: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a NSSL_NO_TLS1_1).
6820: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
6830: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
6840: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
6850: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
6860: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
6870: 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 _1], -1));.#endi
6880: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
6890: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !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 5f 32 29 0a 20 20 20 20 54 63 6c _TLS1_2). Tcl
68c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
68d0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
68e0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
68f0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
6900: 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 [TLS_TLS1_2], -1
6910: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
6920: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
6930: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
6940: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
6950: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
6960: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
6970: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
6980: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
6990: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
69a0: 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e S1_3], -1));.#en
69b0: 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 dif.. Tcl_Set
69c0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
69d0: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 , objPtr);. r
69e0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
69f0: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
6a00: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ntData;.}.../*.
6a10: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
6a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a50: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 ----. *. * Hands
6a60: 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a hakeObjCmd --. *
6a70: 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 . *.This command
6a80: 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 is used to veri
6a90: 66 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 fy whether the h
6aa0: 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 andshake is comp
6ab0: 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a lete. *.or not..
6ac0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
6ad0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
6ae0: 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 result. 1 means
6af0: 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c handshake compl
6b00: 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e ete, 0 means pen
6b10: 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 ding.. *. * Side
6b20: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 effects:. *.May
6b30: 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 force SSL negot
6b40: 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 iation to take p
6b50: 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d lace.. *. *-----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
6ba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 */.static int Ha
6bb0: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c ndshakeObjCmd(Cl
6bc0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
6bd0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
6be0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
6bf0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
6c00: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
6c10: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
6c20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 ; /* The
6c30: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
6c40: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 mode on. */.
6c50: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
6c60: 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 ; /* clie
6c70: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c nt state for ssl
6c80: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 socket */. c
6c90: 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 onst char *errSt
6ca0: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e r = NULL;. in
6cb0: 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 t ret = 1;. i
6cc0: 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 nt err = 0;..
6cd0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
6ce0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
6cf0: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
6d00: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
6d10: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
6d20: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
6d30: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
6d40: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
6d50: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
6d60: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
6d70: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
6d80: 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 1], NULL), NULL)
6d90: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
6da0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
6db0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 NULL) {..return(
6dc0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
6dd0: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 }.. /* Make s
6de0: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f ure to operate o
6df0: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 n the topmost ch
6e00: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 annel */. cha
6e10: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
6e20: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 annel(chan);.
6e30: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
6e40: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
6e50: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
6e60: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e ()) {..Tcl_Appen
6e70: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
6e80: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
6e90: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
6ea0: 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a Name(chan), "\":
6eb0: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
6ec0: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 el", NULL);..ret
6ed0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
6ee0: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 }. stateP
6ef0: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 tr = (State *)Tc
6f00: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
6f10: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
6f20: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
6f30: 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f lling Tls_WaitFo
6f40: 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 rConnect");.
6f50: 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f ret = Tls_WaitFo
6f60: 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 rConnect(statePt
6f70: 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 r, &err, 1);.
6f80: 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 dprintf("Tls_Wa
6f90: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 itForConnect ret
6fa0: 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 urned: %i", ret)
6fb0: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c ;.. if (ret <
6fc0: 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 0 && ((statePtr
6fd0: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 ->flags & TLS_TC
6fe0: 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 L_ASYNC) && (err
6ff0: 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a == EAGAIN))) {.
7000: 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 .dprintf("Async
7010: 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 set and err = EA
7020: 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 GAIN");..ret = 0
7030: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
7040: 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 65 72 72 (ret < 0) {..err
7050: 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e Str = statePtr->
7060: 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 err;..Tcl_ResetR
7070: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 esult(interp);..
7080: 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 Tcl_SetErrno(err
7090: 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 );...if (!errStr
70a0: 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 || (*errStr ==
70b0: 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 0)) {.. errSt
70c0: 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 r = Tcl_PosixErr
70d0: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a or(interp);..}..
70e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
70f0: 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 t(interp, "hands
7100: 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 hake failed: ",
7110: 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 errStr, (char *)
7120: 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 NULL);..dprintf
7130: 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f ("Returning TCL_
7140: 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 ERROR with hands
7150: 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 hake failed: %s"
7160: 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 , errStr);..retu
7170: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
7180: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
7190: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 (err != 0) {..
71a0: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 dprintf("Got a
71b0: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 n error with a c
71c0: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 ompleted handsha
71d0: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 ke: err = %i", e
71e0: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 rr);..}..ret = 1
71f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
7200: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 intf("Returning
7210: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 TCL_OK with data
7220: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a \"%i\"", ret);.
7230: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
7240: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
7250: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 _NewIntObj(ret))
7260: 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c ;. return(TCL
7270: 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 _OK);..clientDat
7280: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a a = clientData;.
7290: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
72a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
72b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
72c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
72d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
72e0: 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d * ImportObjCmd -
72f0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
7300: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
7310: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 d to process the
7320: 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 "ssl" command.
7330: 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d *. *.The ssl com
7340: 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 mand pushes SSL
7350: 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f over a (newly co
7360: 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 nnected) tcp soc
7370: 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ket. *. * Result
7380: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
7390: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
73a0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
73b0: 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 . *.May modify t
73c0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 he behavior of a
73d0: 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a n IO channel.. *
73e0: 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d ----------------
7410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7420: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
7430: 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 c int.ImportObjC
7440: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
7450: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
7460: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
7470: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
7480: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
7490: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
74a0: 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 chan;../* The c
74b0: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 hannel to set a
74c0: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 mode on. */.
74d0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
74e0: 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 ../* client stat
74f0: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 e for ssl socket
7500: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 */. SSL_CTX
7510: 2a 63 74 78 09 20 20 20 20 20 20 20 20 3d 20 4e *ctx. = N
7520: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
7530: 20 2a 73 63 72 69 70 74 09 20 20 20 20 20 20 20 *script.
7540: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
7550: 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 _Obj *password.
7560: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
7570: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 Tcl_DString u
7580: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
7590: 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 lation, upperCha
75a0: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 nnelBlocking, up
75b0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
75c0: 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c ng, upperChannel
75d0: 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 EOFChar;. int
75e0: 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 idx, len;. i
75f0: 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20 20 20 nt flags..
7600: 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 = TLS_TCL_INIT
7610: 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 72 ;. int server
7620: 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b 09 2f .. = 0;./
7630: 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 * is connection
7640: 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 incoming or outg
7650: 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 oing? */. cha
7660: 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 20 20 r *keyfile.
7670: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 = NULL;. c
7680: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 20 20 har *certfile.
7690: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
76a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
76b0: 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 *key .= NULL;.
76c0: 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 int key_len
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d =
76e0: 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 0;. unsigned
76f0: 20 63 68 61 72 20 2a 63 65 72 74 20 20 20 20 20 char *cert
7700: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
7710: 69 6e 74 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 int cert_len
7720: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b = 0;
7730: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 . char *ciphe
7740: 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c rs. = NUL
7750: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 L;. char *cip
7760: 68 65 72 73 75 69 74 65 73 09 20 20 20 20 20 20 hersuites.
7770: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 = NULL;. ch
7780: 61 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20 20 ar *CAfile.
7790: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 = NULL;. c
77a0: 68 61 72 20 2a 43 41 64 69 72 09 09 20 20 20 20 har *CAdir..
77b0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
77c0: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 20 char *DHparams.
77d0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
77e0: 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 char *model..
77f0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
7800: 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 char *server
7810: 6e 61 6d 65 09 20 20 20 20 20 20 20 20 3d 20 4e name. = N
7820: 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 ULL;./* hostname
7830: 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 for Server Name
7840: 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 Indication */.
7850: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 const unsigne
7860: 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f d char *session_
7870: 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 id = NULL;. T
7880: 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 cl_Obj *alpn..=
7890: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 NULL;. int ss
78a0: 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 l2 = 0, ssl3 = 0
78b0: 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d ;. int tls1 =
78c0: 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 1, tls1_1 = 1,
78d0: 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 tls1_2 = 1, tls1
78e0: 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 _3 = 1;. int
78f0: 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c proto = 0, level
7900: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 = -1;. int v
7910: 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 erify = 0, requi
7920: 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 re = 0, request
7930: 3d 20 31 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 = 1;.. dprint
7940: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 f("Called");..#i
7950: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
7960: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
7970: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 00000L && !defin
7980: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
7990: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L2) && !defined(
79a0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 NO_SSL2) && defi
79b0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 ned(NO_SSL3) &&
79c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
79d0: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 && defined(NO_T
79e0: 4c 53 31 5f 31 29 20 26 26 20 64 65 66 69 6e 65 LS1_1) && define
79f0: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 d(NO_TLS1_2) &&
7a00: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
7a10: 33 29 0a 20 20 20 20 73 73 6c 32 20 3d 20 31 3b 3). ssl2 = 1;
7a20: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
7a30: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
7a40: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
7a50: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 d(NO_SSL3) && de
7a60: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 fined(NO_SSL2) &
7a70: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 & defined(NO_TLS
7a80: 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 1) && defined(NO
7a90: 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66 69 _TLS1_1) && defi
7aa0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 ned(NO_TLS1_2) &
7ab0: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 & defined(NO_TLS
7ac0: 31 5f 33 29 0a 20 20 20 20 73 73 6c 33 20 3d 20 1_3). ssl3 =
7ad0: 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 1;.#endif.#if de
7ae0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c fined(NO_TLS1) |
7af0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
7b00: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 L_NO_TLS1). t
7b10: 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a ls1 = 0;.#endif.
7b20: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
7b30: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_1) || define
7b40: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
7b50: 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 1_1). tls1_1
7b60: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 0;.#endif.#if
7b70: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
7b80: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
7b90: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
7ba0: 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b . tls1_2 = 0;
7bb0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
7bc0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c ned(NO_TLS1_3) |
7bd0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
7be0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
7bf0: 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e tls1_3 = 0;.#en
7c00: 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a dif.. if (obj
7c10: 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 c < 2) {..Tcl_Wr
7c20: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
7c30: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
7c40: 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 nnel ?options?")
7c50: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
7c60: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
7c70: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
7c80: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 annel(interp, Tc
7c90: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
7ca0: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c bj(objv[1], NULL
7cb0: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 ), NULL);. if
7cc0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
7cd0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
7ce0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7cf0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
7d00: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
7d10: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
7d20: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a most channel */.
7d30: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
7d40: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
7d50: 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 n);.. for (id
7d60: 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a x = 2; idx < obj
7d70: 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 c; idx++) {..cha
7d80: 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 r *opt = Tcl_Get
7d90: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 StringFromObj(ob
7da0: 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a jv[idx], NULL);.
7db0: 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 ..if (opt[0] !=
7dc0: 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b '-').. break;
7dd0: 0a 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69 ...OPTSTR("-cadi
7de0: 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 r", CAdir);..OPT
7df0: 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 STR("-cafile", C
7e00: 41 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 Afile);..OPTSTR(
7e10: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 "-certfile", cer
7e20: 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 tfile);..OPTSTR(
7e30: 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 "-cipher", ciphe
7e40: 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 rs);..OPTSTR("-c
7e50: 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 iphers", ciphers
7e60: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 );..OPTSTR("-cip
7e70: 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 hersuites", ciph
7e80: 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f ersuites);..OPTO
7e90: 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 BJ("-command", s
7ea0: 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 cript);..OPTSTR(
7eb0: 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 "-dhparams", DHp
7ec0: 61 72 61 6d 73 29 3b 0a 09 4f 50 54 53 54 52 28 arams);..OPTSTR(
7ed0: 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 "-keyfile", keyf
7ee0: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
7ef0: 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a model", model);.
7f00: 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f .OPTOBJ("-passwo
7f10: 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a rd", password);.
7f20: 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 .OPTBOOL("-requi
7f30: 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 re", require);..
7f40: 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 OPTBOOL("-reques
7f50: 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f t", request);..O
7f60: 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 PTINT("-security
7f70: 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a level", level);.
7f80: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 .OPTBOOL("-serve
7f90: 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 r", server);..OP
7fa0: 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d TSTR("-servernam
7fb0: 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b e", servername);
7fc0: 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 ..OPTSTR("-sessi
7fd0: 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f on_id", session_
7fe0: 69 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 id);..OPTOBJ("-a
7ff0: 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 lpn", alpn);..OP
8000: 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 TBOOL("-ssl2", s
8010: 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 sl2);..OPTBOOL("
8020: 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 -ssl3", ssl3);..
8030: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c OPTBOOL("-tls1",
8040: 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c tls1);..OPTBOOL
8050: 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 ("-tls1.1", tls1
8060: 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d _1);..OPTBOOL("-
8070: 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 tls1.2", tls1_2)
8080: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
8090: 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 1.3", tls1_3);..
80a0: 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c OPTBYTE("-cert",
80b0: 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 cert, cert_len)
80c0: 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 ;..OPTBYTE("-key
80d0: 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 ", key, key_len)
80e0: 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 ;...OPTBAD("opti
80f0: 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 on", "-alpn, -ca
8100: 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 dir, -cafile, -c
8110: 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 ert, -certfile,
8120: 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 -cipher, -cipher
8130: 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 suites, -command
8140: 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 , -dhparams, -ke
8150: 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f y, -keyfile, -mo
8160: 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 del, -password,
8170: 2d 72 65 71 75 69 72 65 2c 20 2d 72 65 71 75 65 -require, -reque
8180: 73 74 2c 20 2d 73 65 63 75 72 69 74 79 6c 65 76 st, -securitylev
8190: 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 el, -server, -se
81a0: 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 rvername, -sessi
81b0: 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 on_id, -ssl2, -s
81c0: 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 sl3, -tls1, -tls
81d0: 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 6f 72 1.1, -tls1.2, or
81e0: 20 2d 74 6c 73 31 2e 33 22 29 3b 0a 0a 09 72 65 -tls1.3");...re
81f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
8200: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 }. if (re
8210: 71 75 65 73 74 29 09 20 20 20 20 76 65 72 69 66 quest). verif
8220: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
8230: 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 CLIENT_ONCE | SS
8240: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 L_VERIFY_PEER;.
8250: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 if (request &
8260: 26 20 72 65 71 75 69 72 65 29 20 76 65 72 69 66 & require) verif
8270: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
8280: 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f FAIL_IF_NO_PEER_
8290: 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 76 65 CERT;. if (ve
82a0: 72 69 66 79 20 3d 3d 20 30 29 09 76 65 72 69 66 rify == 0).verif
82b0: 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e y = SSL_VERIFY_N
82c0: 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 ONE;.. proto
82d0: 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 |= (ssl2 ? TLS_P
82e0: 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a ROTO_SSL2 : 0);.
82f0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 proto |= (ss
8300: 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 l3 ? TLS_PROTO_S
8310: 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 SL3 : 0);. pr
8320: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 oto |= (tls1 ? T
8330: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 LS_PROTO_TLS1 :
8340: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
8350: 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 (tls1_1 ? TLS_P
8360: 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 ROTO_TLS1_1 : 0)
8370: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
8380: 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f tls1_2 ? TLS_PRO
8390: 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a TO_TLS1_2 : 0);.
83a0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
83b0: 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f s1_3 ? TLS_PROTO
83c0: 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 _TLS1_3 : 0);..
83d0: 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e /* reset to N
83e0: 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 ULL if blank str
83f0: 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a ing provided */.
8400: 20 20 20 20 69 66 20 28 63 65 72 74 20 26 26 20 if (cert &&
8410: 21 2a 63 65 72 74 29 09 09 20 20 20 20 20 20 20 !*cert)..
8420: 20 63 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 cert. =
8430: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 NULL;. if (ke
8440: 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 y && !*key)..
8450: 20 20 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 key.
8460: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
8470: 28 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 (certfile && !*c
8480: 65 72 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 ertfile)
8490: 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c certfile.= NULL
84a0: 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c ;. if (keyfil
84b0: 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 e && !*keyfile).
84c0: 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 .keyfile.
84d0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
84e0: 28 63 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 (ciphers && !*ci
84f0: 70 68 65 72 73 29 09 20 20 20 20 20 20 20 20 63 phers). c
8500: 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d iphers. =
8510: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
8520: 69 70 68 65 72 73 75 69 74 65 73 20 26 26 20 21 iphersuites && !
8530: 2a 63 69 70 68 65 72 73 75 69 74 65 73 29 20 63 *ciphersuites) c
8540: 69 70 68 65 72 73 75 69 74 65 73 20 20 20 20 3d iphersuites =
8550: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 NULL;. if (C
8560: 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c Afile && !*CAfil
8570: 65 29 09 20 20 20 20 20 20 20 20 43 41 66 69 6c e). CAfil
8580: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
8590: 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69 72 20 ;. if (CAdir
85a0: 26 26 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 && !*CAdir).
85b0: 20 20 20 20 43 41 64 69 72 09 20 20 20 20 20 20 CAdir.
85c0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
85d0: 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a (DHparams && !*
85e0: 44 48 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 DHparams).
85f0: 20 20 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 DHparams
8600: 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f = NULL;.. /
8610: 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 * new SSL state
8620: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 */. statePtr.
8630: 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 .= (State *) cka
8640: 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 lloc((unsigned)
8650: 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a sizeof(State));.
8660: 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 memset(state
8670: 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 Ptr, 0, sizeof(S
8680: 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 tate));.. sta
8690: 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 tePtr->flags.= f
86a0: 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 lags;. stateP
86b0: 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 tr->interp.= int
86c0: 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 erp;. statePt
86d0: 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 r->vflags.= veri
86e0: 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 fy;. statePtr
86f0: 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 ->err.= "";..
8700: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 /* allocate scr
8710: 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 ipt */. if (s
8720: 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 cript) {..(void)
8730: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
8740: 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c omObj(script, &l
8750: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b en);..if (len) {
8760: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
8770: 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 callback = scrip
8780: 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 t;.. Tcl_Incr
8790: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
87a0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d r->callback);..}
87b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 . }.. /* a
87c0: 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 llocate password
87d0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 */. if (pass
87e0: 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 word) {..(void)
87f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
8800: 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 mObj(password, &
8810: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 len);..if (len)
8820: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d {.. statePtr-
8830: 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 >password = pass
8840: 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 word;.. Tcl_I
8850: 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ncrRefCount(stat
8860: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b ePtr->password);
8870: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 ..}. }.. i
8880: 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c f (model != NULL
8890: 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 ) {..int mode;..
88a0: 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 /* Get the "mode
88b0: 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 l" context */..c
88c0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
88d0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 nnel(interp, mod
88e0: 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 el, &mode);..if
88f0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
8900: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
8910: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
8920: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
8930: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
8940: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a _ERROR;..}.../*.
8950: 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f . * Make sure to
8960: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
8970: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a topmost channel.
8980: 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c . */..chan = Tcl
8990: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
89a0: 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 han);..if (Tcl_G
89b0: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
89c0: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
89d0: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 elType()) {..
89e0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
89f0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
8a00: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
8a10: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
8a20: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 han),..."\": not
8a30: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
8a40: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 NULL);.. Tls
8a50: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
8a60: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
8a70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8a80: 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 ..}..ctx = ((Sta
8a90: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
8aa0: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
8ab0: 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 chan))->ctx;.
8ac0: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 } else {..if ((
8ad0: 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 ctx = CTX_Init(s
8ae0: 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c tatePtr, server,
8af0: 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c proto, keyfile,
8b00: 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 certfile, key,
8b10: 63 65 72 74 2c 0a 09 20 20 20 20 6b 65 79 5f 6c cert,.. key_l
8b20: 65 6e 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 en, cert_len, CA
8b30: 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 dir, CAfile, cip
8b40: 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 hers, ciphersuit
8b50: 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 es, level, DHpar
8b60: 61 6d 73 29 29 20 3d 3d 20 28 53 53 4c 5f 43 54 ams)) == (SSL_CT
8b70: 58 2a 29 30 29 20 7b 0a 09 20 20 20 20 54 6c 73 X*)0) {.. Tls
8b80: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
8b90: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
8ba0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8bb0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 ..}. }.. s
8bc0: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 tatePtr->ctx = c
8bd0: 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 tx;.. /*.
8be0: 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 * We need to ma
8bf0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 ke sure that the
8c00: 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 channel works i
8c10: 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 n binary (for th
8c20: 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 e. * encrypt
8c30: 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 ion not to get g
8c40: 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 oofed up)..
8c50: 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 * We only want t
8c60: 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 o adjust the buf
8c70: 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 fering in pre-v2
8c80: 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 channels, where
8c90: 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 . * each cha
8ca0: 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 nnel in the stac
8cb0: 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 k maintained its
8cc0: 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 own buffers..
8cd0: 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 */. Tcl_DS
8ce0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
8cf0: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
8d00: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 on);. Tcl_DSt
8d10: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
8d20: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b hannelBlocking);
8d30: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
8d40: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
8d50: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 elEOFChar);.
8d60: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
8d70: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
8d80: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f oding);. Tcl_
8d90: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
8da0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
8db0: 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 -eofchar", &uppe
8dc0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
8dd0: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
8de0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
8df0: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 p, chan, "-encod
8e00: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e ing", &upperChan
8e10: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 nelEncoding);.
8e20: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
8e30: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
8e40: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 han, "-translati
8e50: 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e on", &upperChann
8e60: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
8e70: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e Tcl_GetChann
8e80: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
8e90: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e chan, "-blockin
8ea0: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 g", &upperChanne
8eb0: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 lBlocking);.
8ec0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
8ed0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
8ee0: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
8ef0: 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 ", "binary");.
8f00: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
8f10: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
8f20: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 han, "-blocking"
8f30: 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 , "true");. d
8f40: 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e printf("Consumin
8f50: 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 g Tcl channel %s
8f60: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
8f70: 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 lName(chan));.
8f80: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 statePtr->self
8f90: 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e = Tcl_StackChan
8fa0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f nel(interp, Tls_
8fb0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 ChannelType(), (
8fc0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
8fd0: 65 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 ePtr, (TCL_READA
8fe0: 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 BLE | TCL_WRITAB
8ff0: 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 LE), chan);.
9000: 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 dprintf("Created
9010: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 channel named %
9020: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e s", Tcl_GetChann
9030: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
9040: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 >self));. if
9050: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 (statePtr->self
9060: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
9070: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a NULL) {../*.. *
9080: 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 No use of Tcl_E
9090: 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 ventuallyFree be
90a0: 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c cause no possibl
90b0: 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a e Tcl_Preserve..
90c0: 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 . */..Tls_Free((
90d0: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
90e0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
90f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
9100: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
9110: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 ption(interp, st
9120: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d atePtr->self, "-
9130: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 translation", Tc
9140: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
9150: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
9160: 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 slation));. T
9170: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
9180: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
9190: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e ePtr->self, "-en
91a0: 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 coding", Tcl_DSt
91b0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
91c0: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
91d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
91e0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
91f0: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
9200: 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 lf, "-eofchar",
9210: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
9220: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f (&upperChannelEO
9230: 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c FChar));. Tcl
9240: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
9250: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
9260: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 tr->self, "-bloc
9270: 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 king", Tcl_DStri
9280: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
9290: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b annelBlocking));
92a0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
92b0: 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 SSL Initializati
92c0: 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 on. */. s
92d0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 tatePtr->ssl = S
92e0: 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d SL_new(statePtr-
92f0: 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 >ctx);. if (!
9300: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b statePtr->ssl) {
9310: 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 ../* SSL library
9320: 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 error */..Tcl_A
9330: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
9340: 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f rp, "couldn't co
9350: 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 nstruct ssl sess
9360: 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 ion: ", REASON()
9370: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9380: 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 ;..Tls_Free((cha
9390: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
93a0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
93b0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
93c0: 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 Set host server
93d0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 name */. if
93e0: 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 (servername) {..
93f0: 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76 /* Sets the serv
9400: 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 er name indicati
9410: 6f 6e 20 28 53 4e 49 29 20 43 6c 69 65 6e 74 48 on (SNI) ClientH
9420: 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a ello extension *
9430: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f /..if (!SSL_set_
9440: 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 tlsext_host_name
9450: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
9460: 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 servername) && r
9470: 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 equire) {.. T
9480: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
9490: 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 interp, "setting
94a0: 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 TLS host name e
94b0: 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 xtension failed"
94c0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
94d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6c ;. Tl
94e0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
94f0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 statePtr);.
9500: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 return TC
9510: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 L_ERROR;.
9520: 20 7d 0a 0a 09 2f 2a 20 43 6f 6e 66 69 67 75 72 }.../* Configur
9530: 65 20 73 65 72 76 65 72 20 68 6f 73 74 20 6e 61 e server host na
9540: 6d 65 20 63 68 65 63 6b 73 20 69 6e 20 74 68 65 me checks in the
9550: 20 53 53 4c 20 63 6c 69 65 6e 74 2e 20 53 65 74 SSL client. Set
9560: 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 74 6f DNS hostname to
9570: 0a 09 20 20 20 6e 61 6d 65 20 66 6f 72 20 70 65 .. name for pe
9580: 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20 63 er certificate c
9590: 68 65 63 6b 73 2e 20 53 53 4c 5f 73 65 74 31 5f hecks. SSL_set1_
95a0: 68 6f 73 74 20 68 61 73 20 6c 69 6d 69 74 61 74 host has limitat
95b0: 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 ions. */..if (!S
95c0: 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 SL_add1_host(sta
95d0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 tePtr->ssl, serv
95e0: 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 ername)) {..
95f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
9600: 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e (interp, "settin
9610: 67 20 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 g DNS host name
9620: 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a failed", (char *
9630: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 ) NULL);.
9640: 20 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 Tls_Free((c
9650: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
9660: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 ;. re
9670: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9680: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
9690: 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 Resume session
96a0: 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 id */. if (se
96b0: 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c ssion_id && strl
96c0: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c en(session_id) <
96d0: 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 = SSL_MAX_SID_CT
96e0: 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 X_LENGTH) {../*
96f0: 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_set_session(
9700: 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 ) */..if (!SSL_S
9710: 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 ESSION_set1_id_c
9720: 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 ontext(SSL_get_s
9730: 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d ession(statePtr-
9740: 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 >ssl), session_i
9750: 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 d, (unsigned int
9760: 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e ) strlen(session
9770: 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 _id))) {.. Tc
9780: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
9790: 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 nterp, "Resume s
97a0: 65 73 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 ession id ", ses
97b0: 73 69 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 sion_id, " faile
97c0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
97d0: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 L);.
97e0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
97f0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 ) statePtr);.
9800: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 return
9810: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
9820: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 61 6c 70 }.. if (alp
9830: 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 n) {../* Convert
9840: 20 61 20 54 63 6c 20 6c 69 73 74 20 69 6e 74 6f a Tcl list into
9850: 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 a protocol-list
9860: 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 in wire-format
9870: 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 */..unsigned cha
9880: 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 r *protos, *p;..
9890: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f unsigned int pro
98a0: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e tos_len = 0;..in
98b0: 74 20 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 t i, len, cnt;..
98c0: 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a Tcl_Obj **list;.
98d0: 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 ..if (Tcl_ListOb
98e0: 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 jGetElements(int
98f0: 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c erp, alpn, &cnt,
9900: 20 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f &list) != TCL_O
9910: 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 K) {.. Tls_Fr
9920: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
9930: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
9940: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
9950: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 .../* Determine
9960: 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 the memory requi
9970: 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 red for the prot
9980: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f ocol-list */..fo
9990: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e r (i = 0; i < cn
99a0: 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 t; i++) {.. T
99b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
99c0: 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 Obj(list[i], &le
99d0: 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e n);.. if (len
99e0: 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f > 255) {...Tcl_
99f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
9a00: 65 72 70 2c 20 22 61 6c 70 6e 20 70 72 6f 74 6f erp, "alpn proto
9a10: 63 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e col name too lon
9a20: 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c g", (char *) NUL
9a30: 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 L);...Tls_Free((
9a40: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
9a50: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
9a60: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 ERROR;.. }..
9a70: 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d protos_len +=
9a80: 20 31 20 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 1 + len;..}.../
9a90: 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 * Build the comp
9aa0: 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 lete protocol-li
9ab0: 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 st */..protos =
9ac0: 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c ckalloc(protos_l
9ad0: 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f en);../* protoco
9ae0: 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 l-lists consist
9af0: 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d of 8-bit length-
9b00: 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 prefixed, byte s
9b10: 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 trings */..for (
9b20: 69 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f i = 0, p = proto
9b30: 73 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 s; i < cnt; i++)
9b40: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 {.. char *st
9b50: 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e r = Tcl_GetStrin
9b60: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d gFromObj(list[i]
9b70: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 , &len);.. *p
9b80: 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 6d ++ = len;.. m
9b90: 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 6c 65 emcpy(p, str, le
9ba0: 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 n);.. p += le
9bb0: 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 n;..}.../* SSL_s
9bc0: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d et_alpn_protos m
9bd0: 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 akes a copy of t
9be0: 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 he protocol-list
9bf0: 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 */../* Note: Th
9c00: 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 is functions rev
9c10: 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72 6e erses the return
9c20: 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f value conventio
9c30: 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 n */..if (SSL_se
9c40: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 t_alpn_protos(st
9c50: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f atePtr->ssl, pro
9c60: 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 tos, protos_len)
9c70: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
9c80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
9c90: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73 65 74 , "failed to set
9ca0: 20 61 6c 70 6e 20 70 72 6f 74 6f 63 6f 6c 73 22 alpn protocols"
9cb0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9cc0: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
9cd0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
9ce0: 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 r);.. ckfree(
9cf0: 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 protos);.. re
9d00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9d10: 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 .}.../* Store pr
9d20: 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a otocols list */.
9d30: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
9d40: 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 s = protos;..sta
9d50: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 tePtr->protos_le
9d60: 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a n = protos_len;.
9d70: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 } else {..st
9d80: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d atePtr->protos =
9d90: 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 NULL;..statePtr
9da0: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 ->protos_len = 0
9db0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a ;. }.. /*.
9dc0: 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 * SSL Callb
9dd0: 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 acks. */.
9de0: 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 SSL_set_app_dat
9df0: 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c a(statePtr->ssl,
9e00: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
9e10: 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 r);./* point bac
9e20: 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 k to us */. S
9e30: 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 SL_set_verify(st
9e40: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 atePtr->ssl, ver
9e50: 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 ify, VerifyCallb
9e60: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 ack);. SSL_CT
9e70: 58 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 X_set_info_callb
9e80: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ack(statePtr->ct
9e90: 78 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 x, InfoCallback)
9ea0: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 ;. SSL_CTX_se
9eb0: 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 ss_set_new_cb(st
9ec0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 atePtr->ctx, Ses
9ed0: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a sionCallback);..
9ee0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 /* Create Tc
9ef0: 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 l_Channel BIO Ha
9f00: 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 ndler */. sta
9f10: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 tePtr->p_bio.= B
9f20: 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 IO_new_tcl(state
9f30: 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 Ptr, BIO_NOCLOSE
9f40: 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d );. statePtr-
9f50: 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 >bio.= BIO_new(B
9f60: 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 IO_f_ssl());..
9f70: 20 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a if (server) {.
9f80: 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 ./* Server callb
9f90: 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 acks */..SSL_CTX
9fa0: 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 _set_alpn_select
9fb0: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
9fc0: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c x, ALPNCallback,
9fd0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
9fe0: 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 r);..SSL_CTX_set
9ff0: 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 _tlsext_serverna
a000: 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d me_arg(statePtr-
a010: 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 >ctx, (void *)st
a020: 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 atePtr);..SSL_CT
a030: 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 X_set_tlsext_ser
a040: 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b vername_callback
a050: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
a060: 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 SNICallback);..S
a070: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
a080: 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 t_hello_cb(state
a090: 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 Ptr->ctx, HelloC
a0a0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
a0b0: 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 09 73 74 )statePtr);...st
a0c0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d atePtr->flags |=
a0d0: 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b TLS_TCL_SERVER;
a0e0: 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 ..SSL_set_accept
a0f0: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d _state(statePtr-
a100: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 >ssl);. } els
a110: 65 20 7b 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e e {..SSL_set_con
a120: 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 nect_state(state
a130: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
a140: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f . SSL_set_bio
a150: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
a160: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c statePtr->p_bio,
a170: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
a180: 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 );. BIO_set_s
a190: 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f sl(statePtr->bio
a1a0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c , statePtr->ssl,
a1b0: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a BIO_NOCLOSE);..
a1c0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e /*. * En
a1d0: 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 d of SSL Init.
a1e0: 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 */. dprint
a1f0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 f("Returning %s"
a200: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
a210: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
a220: 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 elf));. Tcl_S
a230: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
a240: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 (char *) Tcl_Ge
a250: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
a260: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 tePtr->self), TC
a270: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 L_VOLATILE);..
a280: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
a290: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
a2a0: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
a2b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
a2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a2f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e -------. *. * Un
a300: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a importObjCmd --.
a310: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
a320: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
a330: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f to remove the to
a340: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 pmost channel fi
a350: 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 lter.. *. * Resu
a360: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
a370: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
a380: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
a390: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 s:. *.May modify
a3a0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 the behavior of
a3b0: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a an IO channel..
a3c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
a3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a400: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
a410: 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 tic int.Unimport
a420: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
a430: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
a440: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
a450: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
a460: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
a470: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
a480: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 nnel chan;../* T
a490: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 he channel to se
a4a0: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a t a mode on. */.
a4b0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
a4c0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
a4d0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
a4e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
a4f0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
a500: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
a510: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
a520: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 }.. chan
a530: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
a540: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 (interp, Tcl_Get
a550: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c String(objv[1]),
a560: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
a570: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
a580: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
a590: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
a5a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
a5b0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
a5c0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
a5d0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
a5e0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
a5f0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
a600: 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 ;.. if (Tcl_G
a610: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
a620: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
a630: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
a640: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
a650: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
a660: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
a670: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
a680: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 ,..."\": not a T
a690: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
a6a0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
a6b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
a6c0: 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 if (Tcl_Unstac
a6d0: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c kChannel(interp,
a6e0: 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 chan) == TCL_ER
a6f0: 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ROR) {..return T
a700: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
a710: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
a720: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 OK;..clientData
a730: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a = clientData;.}.
a740: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
a750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
a790: 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e CTX_Init -- con
a7a0: 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 struct a SSL_CTX
a7b0: 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 instance. *. *
a7c0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 Results:. *.A va
a7d0: 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 lid SSL_CTX inst
a7e0: 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a ance or NULL.. *
a7f0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
a800: 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 :. *.constructs
a810: 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 SSL context (CTX
a820: 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ). *. *---------
a830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
a870: 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a tatic SSL_CTX *.
a880: 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a CTX_Init(State *
a890: 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 statePtr, int is
a8a0: 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 Server, int prot
a8b0: 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 o, char *keyfile
a8c0: 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 , char *certfile
a8d0: 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ,. unsigned c
a8e0: 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e har *key, unsign
a8f0: 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69 ed char *cert, i
a900: 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 nt key_len, int
a910: 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a cert_len, char *
a920: 43 41 64 69 72 2c 0a 20 20 20 20 63 68 61 72 20 CAdir,. char
a930: 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 *CAfile, char *c
a940: 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 iphers, char *ci
a950: 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 phersuites, int
a960: 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 level, char *DHp
a970: 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c arams) {. Tcl
a980: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 _Interp *interp
a990: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
a9a0: 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 rp;. SSL_CTX
a9b0: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *ctx = NULL;.
a9c0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b Tcl_DString ds;
a9d0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
a9e0: 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 ds1;. int of
a9f0: 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c f = 0;. int l
aa00: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b oad_private_key;
aa10: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d . const SSL_M
aa20: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a ETHOD *method;..
aa30: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
aa40: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
aa50: 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 !proto) {..Tcl_A
aa60: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
aa70: 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 rp, "no valid pr
aa80: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 otocol selected"
aa90: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
aaa0: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 (SSL_CTX *)0;.
aab0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 }.. /* cre
aac0: 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 ate SSL context
aad0: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 */.#if OPENSSL_V
aae0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d ERSION_NUMBER >=
aaf0: 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 0x10100000L ||
ab00: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
ab10: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
ab20: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
ab30: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
ab40: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 to, TLS_PROTO_SS
ab50: 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 L2)) {..Tcl_Appe
ab60: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ab70: 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 "SSL2 protocol
ab80: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
ab90: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 NULL);..return (
aba0: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 SSL_CTX *)0;.
abb0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
abc0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c fined(NO_SSL3) |
abd0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
abe0: 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 L_NO_SSL3). i
abf0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
ac00: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 , TLS_PROTO_SSL3
ac10: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
ac20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
ac30: 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f SSL3 protocol no
ac40: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
ac50: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 LL);..return (SS
ac60: 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d L_CTX *)0;. }
ac70: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
ac80: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 ned(NO_TLS1) ||
ac90: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
aca0: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 NO_TLS1). if
acb0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
acc0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 TLS_PROTO_TLS1))
acd0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
ace0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
acf0: 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.0 protocol n
ad00: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
ad10: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 ULL);..return (S
ad20: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 SL_CTX *)0;.
ad30: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 }.#endif.#if def
ad40: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
ad50: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
ad60: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 SL_NO_TLS1_1).
ad70: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
ad80: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
ad90: 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 LS1_1)) {..Tcl_A
ada0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
adb0: 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f rp, "TLS 1.1 pro
adc0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
add0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ted", NULL);..re
ade0: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 turn (SSL_CTX *)
adf0: 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0;. }.#endif.
ae00: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
ae10: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
ae20: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
ae30: 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 1_2). if (ENA
ae40: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
ae50: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b PROTO_TLS1_2)) {
ae60: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
ae70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 lt(interp, "TLS
ae80: 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 1.2 protocol not
ae90: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
aea0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c L);..return (SSL
aeb0: 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a _CTX *)0;. }.
aec0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
aed0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
aee0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
aef0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
af00: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
af10: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
af20: 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 1_3)) {..Tcl_App
af30: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
af40: 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f , "TLS 1.3 proto
af50: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
af60: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 d", NULL);..retu
af70: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b rn (SSL_CTX *)0;
af80: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 . }.#endif..
af90: 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f switch (proto
afa0: 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f ) {.#if OPENSSL_
afb0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
afc0: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 0x10100000L &&
afd0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 !defined(NO_SSL2
afe0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
aff0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 ENSSL_NO_SSL2).
b000: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
b010: 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 O_SSL2:..method
b020: 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 = SSLv2_method()
b030: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
b040: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
b050: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
b060: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
b070: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
b080: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f OPENSSL_NO_SSL3_
b090: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 METHOD). case
b0a0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a TLS_PROTO_SSL3:
b0b0: 0a 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 ..method = SSLv3
b0c0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
b0d0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
b0e0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
b0f0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
b100: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 SSL_NO_TLS1) &&
b110: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
b120: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 _NO_TLS1_METHOD)
b130: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
b140: 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f OTO_TLS1:..metho
b150: 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 d = TLSv1_method
b160: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
b170: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
b180: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
b190: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
b1a0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
b1b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
b1c0: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a _TLS1_1_METHOD).
b1d0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
b1e0: 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 TO_TLS1_1:..meth
b1f0: 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 od = TLSv1_1_met
b200: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 hod();..break;.#
b210: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
b220: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 ed(NO_TLS1_2) &&
b230: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
b240: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 L_NO_TLS1_2) &&
b250: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
b260: 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f _NO_TLS1_2_METHO
b270: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
b280: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d PROTO_TLS1_2:..m
b290: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f ethod = TLSv1_2_
b2a0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
b2b0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
b2c0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
b2d0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
b2e0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
b2f0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
b300: 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 0a 09 TO_TLS1_3:../*..
b310: 20 2a 20 54 68 65 20 76 65 72 73 69 6f 6e 20 72 * The version r
b320: 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 ange is constrai
b330: 6e 65 64 20 62 65 6c 6f 77 2c 0a 09 20 2a 20 61 ned below,.. * a
b340: 66 74 65 72 20 74 68 65 20 63 6f 6e 74 65 78 74 fter the context
b350: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 55 73 is created. Us
b360: 65 20 74 68 65 0a 09 20 2a 20 67 65 6e 65 72 69 e the.. * generi
b370: 63 20 6d 65 74 68 6f 64 20 68 65 72 65 2e 0a 09 c method here...
b380: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c */..method = TL
b390: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 S_method();..bre
b3a0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 ak;.#endif. d
b3b0: 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f efault:../* Nego
b3c0: 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 tiate highest av
b3d0: 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 ailable SSL/TLS
b3e0: 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 version */..meth
b3f0: 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 od = TLS_method(
b400: 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 );.#if OPENSSL_V
b410: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
b420: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 0x10100000L && !
b430: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
b440: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
b450: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f NSSL_NO_SSL2)..o
b460: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
b470: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
b480: 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53 SSL2) ? 0 : SS
b490: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a L_OP_NO_SSLv2);.
b4a0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
b4b0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 ned(NO_SSL3) &&
b4c0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
b4d0: 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c _NO_SSL3)..off |
b4e0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
b4f0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 , TLS_PROTO_SSL3
b500: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 ) ? 0 : SSL_OP
b510: 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 _NO_SSLv3);.#end
b520: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
b530: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 NO_TLS1) && !def
b540: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
b550: 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 TLS1)..off |= (E
b560: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
b570: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 S_PROTO_TLS1)
b580: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
b590: 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 TLSv1);.#endif.#
b5a0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
b5b0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
b5c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
b5d0: 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 S1_1)..off |= (E
b5e0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
b5f0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 S_PROTO_TLS1_1)
b600: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
b610: 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 TLSv1_1);.#endif
b620: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
b630: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
b640: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
b650: 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 TLS1_2)..off |=
b660: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
b670: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 TLS_PROTO_TLS1_2
b680: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ) ? 0 : SSL_OP_N
b690: 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 O_TLSv1_2);.#end
b6a0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
b6b0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
b6c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
b6d0: 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c O_TLS1_3)..off |
b6e0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
b6f0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
b700: 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 _3) ? 0 : SSL_OP
b710: 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 _NO_TLSv1_3);.#e
b720: 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 ndif..break;.
b730: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 }.. ERR_clea
b740: 72 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 63 r_error();. c
b750: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
b760: 28 6d 65 74 68 6f 64 29 3b 0a 0a 20 20 20 20 69 (method);.. i
b770: 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75 f (!ctx) {..retu
b780: 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a rn(NULL);. }.
b790: 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28 . if (getenv(
b7a0: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 SSLKEYLOGFILE))
b7b0: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b {..SSL_CTX_set_k
b7c0: 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 eylog_callback(c
b7d0: 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 tx, KeyLogCallba
b7e0: 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 ck);. }..#if
b7f0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
b800: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
b810: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
b820: 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 3). if (proto
b830: 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c == TLS_PROTO_TL
b840: 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 S1_3) {..SSL_CTX
b850: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 _set_min_proto_v
b860: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
b870: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 _3_VERSION);..SS
b880: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 L_CTX_set_max_pr
b890: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
b8a0: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 TLS1_3_VERSION)
b8b0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a ;. }.#endif..
b8c0: 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 /* Force cip
b8d0: 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 her selection or
b8e0: 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f der by server */
b8f0: 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72 76 . if (!isServ
b900: 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 er) {..SSL_CTX_s
b910: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
b920: 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 SSL_OP_CIPHER_SE
b930: 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29 RVER_PREFERENCE)
b940: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53 53 4c ;. }.. SSL
b950: 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 _CTX_set_app_dat
b960: 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e a(ctx, (void*)in
b970: 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 terp);./* rememb
b980: 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 er the interpret
b990: 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 er */. SSL_CT
b9a0: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
b9b0: 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 x, SSL_OP_ALL);.
b9c0: 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 /* all SSL bug w
b9d0: 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 orkarounds */.
b9e0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 SSL_CTX_set_op
b9f0: 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b tions(ctx, off);
ba00: 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f ../* disable pro
ba10: 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a tocol versions *
ba20: 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 /.#if OPENSSL_VE
ba30: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
ba40: 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 x10101000L. S
ba50: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 SL_CTX_set_mode(
ba60: 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 ctx, SSL_MODE_AU
ba70: 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 TO_RETRY);./* ha
ba80: 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 ndle new handsha
ba90: 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e kes in backgroun
baa0: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 d */.#endif.
bab0: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 SSL_CTX_sess_set
bac0: 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c _cache_size(ctx,
bad0: 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 128);.. /* S
bae0: 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 et user defined
baf0: 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 ciphers, cipher
bb00: 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 suites, and secu
bb10: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 rity level */.
bb20: 20 20 69 66 20 28 28 28 63 69 70 68 65 72 73 20 if (((ciphers
bb30: 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c != NULL) && !SSL
bb40: 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f _CTX_set_cipher_
bb50: 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 list(ctx, cipher
bb60: 73 29 29 20 7c 7c 20 5c 0a 09 28 28 63 69 70 68 s)) || \..((ciph
bb70: 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c ersuites != NULL
bb80: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 ) && !SSL_CTX_se
bb90: 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63 t_ciphersuites(c
bba0: 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 tx, ciphersuites
bbb0: 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 ))) {.. Tcl_A
bbc0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
bbd0: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73 rp, "Set ciphers
bbe0: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 failed", (char
bbf0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
bc00: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
bc10: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 ;.. return (S
bc20: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 SL_CTX *)0;.
bc30: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 }.. /* Set se
bc40: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a curity level */.
bc50: 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 if (level >
bc60: 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 -1 && level < 6)
bc70: 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 {../* SSL_set_s
bc80: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f ecurity_level */
bc90: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 ..SSL_CTX_set_se
bca0: 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 curity_level(ctx
bcb0: 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a , level);. }.
bcc0: 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 . /* set some
bcd0: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 callbacks */.
bce0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 SSL_CTX_set_de
bcf0: 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 fault_passwd_cb(
bd00: 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c ctx, PasswordCal
bd10: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f lback);. SSL_
bd20: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
bd30: 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 passwd_cb_userda
bd40: 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 ta(ctx, (void *)
bd50: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
bd60: 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 65 /* read a Diffie
bd70: 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 -Hellman paramet
bd80: 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 ers file, or use
bd90: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e the built-in on
bda0: 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e e */.#ifdef OPEN
bdb0: 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 SSL_NO_DH. if
bdc0: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 (DHparams != NU
bdd0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
bde0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
bdf0: 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 "DH parameter su
be00: 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 pport not availa
be10: 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ble", (char *) N
be20: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
be30: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
be40: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
be50: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 }.#else.
be60: 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 {..DH* dh;..if (
be70: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c DHparams != NULL
be80: 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 ) {.. BIO *bi
be90: 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 o;.. Tcl_DStr
bea0: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 ingInit(&ds);..
beb0: 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 bio = BIO_new
bec0: 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 _file(F2N(DHpara
bed0: 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a ms, &ds), "r");.
bee0: 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b . if (!bio) {
bef0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ...Tcl_DStringFr
bf00: 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 ee(&ds);...Tcl_A
bf10: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
bf20: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 rp, "Could not f
bf30: 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 ind DH parameter
bf40: 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a s file", (char *
bf50: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
bf60: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
bf70: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
bf80: 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 *)0;.. }...
bf90: 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f dh = PEM_read_
bfa0: 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f bio_DHparams(bio
bfb0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 , NULL, NULL, NU
bfc0: 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 LL);.. BIO_fr
bfd0: 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 ee(bio);.. Tc
bfe0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
bff0: 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 s);.. if (!dh
c000: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
c010: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
c020: 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 Could not read D
c030: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f H parameters fro
c040: 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a m file", (char *
c050: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
c060: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
c070: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
c080: 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 *)0;.. }..} e
c090: 6c 73 65 20 7b 0a 09 20 20 20 20 64 68 20 3d 20 lse {.. dh =
c0a0: 67 65 74 5f 64 68 50 61 72 61 6d 73 28 29 3b 0a get_dhParams();.
c0b0: 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f .}..SSL_CTX_set_
c0c0: 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b tmp_dh(ctx, dh);
c0d0: 0a 09 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 20 ..DH_free(dh);.
c0e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 }.#endif..
c0f0: 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 /* set our cert
c100: 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c ificate */. l
c110: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 oad_private_key
c120: 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72 = 0;. if (cer
c130: 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b tfile != NULL) {
c140: 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b ..load_private_k
c150: 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53 ey = 1;...Tcl_DS
c160: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a tringInit(&ds);.
c170: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 ..if (SSL_CTX_us
c180: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 e_certificate_fi
c190: 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 le(ctx, F2N(cert
c1a0: 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f file, &ds), SSL_
c1b0: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d FILETYPE_PEM) <=
c1c0: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 0) {.. Tcl_D
c1d0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
c1e0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
c1f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
c200: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 unable to set ce
c210: 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 rtificate file "
c220: 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 , certfile, ": "
c230: 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e ,.... REASON
c240: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
c250: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
c260: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
c270: 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 return (SSL_CTX
c280: 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 *)0;..}. } e
c290: 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 lse if (cert !=
c2a0: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 NULL) {..load_pr
c2b0: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 ivate_key = 1;..
c2c0: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
c2d0: 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 certificate_ASN1
c2e0: 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 (ctx, cert_len,
c2f0: 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 cert) <= 0) {..
c300: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
c310: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 ee(&ds);.. Tc
c320: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
c330: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
c340: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 o set certificat
c350: 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 e: ",.... RE
c360: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
c370: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
c380: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
c390: 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c . return (SSL
c3a0: 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 _CTX *)0;..}.
c3b0: 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 } else {..certf
c3c0: 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 ile = (char*)X50
c3d0: 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 9_get_default_ce
c3e0: 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 rt_file();...if
c3f0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 (SSL_CTX_use_cer
c400: 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 tificate_file(ct
c410: 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c x, certfile, SSL
c420: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c _FILETYPE_PEM) <
c430: 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 = 0) {.#if 0..
c440: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
c450: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c e(&ds);.. Tcl
c460: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
c470: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
c480: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 use default cer
c490: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c tificate file ",
c4a0: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c certfile, ": ",
c4b0: 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 .... REASON(
c4c0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
c4d0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
c4e0: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 free(ctx);..
c4f0: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
c500: 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 *)0;.#endif..}.
c510: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 }.. /* set
c520: 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 our private key
c530: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 */. if (load
c540: 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a _private_key) {.
c550: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 .if (keyfile ==
c560: 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e NULL && key == N
c570: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 ULL) {.. keyf
c580: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a ile = certfile;.
c590: 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 .}...if (keyfile
c5a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
c5b0: 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 /* get the priv
c5c0: 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 ate key associat
c5d0: 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 ed with this cer
c5e0: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 tificate */..
c5f0: 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 if (keyfile ==
c600: 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c NULL) {...keyfil
c610: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 e = certfile;..
c620: 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 }... if (S
c630: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 SL_CTX_use_Priva
c640: 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 teKey_file(ctx,
c650: 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 F2N(keyfile, &ds
c660: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ), SSL_FILETYPE_
c670: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 PEM) <= 0) {...T
c680: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
c690: 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 ds);.../* flush
c6a0: 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 the passphrase w
c6b0: 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 hich might be le
c6c0: 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 ft in the result
c6d0: 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 */...Tcl_SetRes
c6e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c ult(interp, NULL
c6f0: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 , TCL_STATIC);..
c700: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
c710: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
c720: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 e to set public
c730: 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 key file ", keyf
c740: 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 ile, " ",....
c750: 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 REASON(),
c760: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
c770: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
c780: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 53 tx);...return (S
c790: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 20 SL_CTX *)0;..
c7a0: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 }.. Tcl_DStr
c7b0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 ingFree(&ds);...
c7c0: 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 } else if (key !
c7d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 = NULL) {.. i
c7e0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 f (SSL_CTX_use_P
c7f0: 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 rivateKey_ASN1(E
c800: 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 VP_PKEY_RSA, ctx
c810: 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c , key,key_len) <
c820: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 = 0) {...Tcl_DSt
c830: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
c840: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 ./* flush the pa
c850: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d ssphrase which m
c860: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 ight be left in
c870: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 the result */...
c880: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
c890: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f terp, NULL, TCL_
c8a0: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 STATIC);...Tcl_A
c8b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
c8c0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
c8d0: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 et public key: "
c8e0: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 , REASON(), (cha
c8f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
c900: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
c910: 0a 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 ...return (SSL_C
c920: 54 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 TX *)0;.. }..
c930: 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f }../* Now we kno
c940: 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 w that a key and
c950: 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 cert have been
c960: 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 set against.. *
c970: 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 the SSL context
c980: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 */..if (!SSL_CTX
c990: 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b _check_private_k
c9a0: 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 ey(ctx)) {..
c9b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
c9c0: 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 (interp, "privat
c9d0: 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d e key does not m
c9e0: 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69 atch the certifi
c9f0: 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 cate public key"
ca00: 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20 ,.... (char
ca10: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
ca20: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
ca30: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 ;.. return (S
ca40: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 SL_CTX *)0;..}.
ca50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 }.. /* Set
ca60: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 43 41 verification CA
ca70: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 s */. Tcl_DSt
ca80: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 ringInit(&ds);.
ca90: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
caa0: 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20 69 66 it(&ds1);. if
cab0: 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f (!SSL_CTX_load_
cac0: 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 verify_locations
cad0: 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 (ctx, F2N(CAfile
cae0: 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 64 69 , &ds), F2N(CAdi
caf0: 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 r, &ds1)) ||..!S
cb00: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 SL_CTX_set_defau
cb10: 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 lt_verify_paths(
cb20: 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 ctx)) {.#if 0..T
cb30: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
cb40: 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e ds);..Tcl_DStrin
cb50: 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a gFree(&ds1);../*
cb60: 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 Don't currently
cb70: 20 63 61 72 65 20 69 66 20 74 68 69 73 20 66 61 care if this fa
cb80: 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 ils */..Tcl_Appe
cb90: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
cba0: 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76 65 "SSL default ve
cbb0: 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c 20 52 rify paths: ", R
cbc0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
cbd0: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
cbe0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
cbf0: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 turn (SSL_CTX *)
cc00: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0;.#endif. }.
cc10: 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f . /* https://
cc20: 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f sourceforge.net/
cc30: 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a p/tls/bugs/57/ *
cc40: 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 /. /* XXX:TOD
cc50: 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 O: Let the user
cc60: 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 supply values he
cc70: 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f re instead of so
cc80: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 mething that exi
cc90: 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 sts on the files
cca0: 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 ystem */. if
ccb0: 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 (CAfile != NULL)
ccc0: 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 {..STACK_OF(X50
ccd0: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 9_NAME) *certNam
cce0: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c es = SSL_load_cl
ccf0: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e ient_CA_file(F2N
cd00: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a (CAfile, &ds));.
cd10: 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 .if (certNames !
cd20: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 = NULL) {.. S
cd30: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
cd40: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 t_CA_list(ctx, c
cd50: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 ertNames);..}.
cd60: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
cd70: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 ringFree(&ds);.
cd80: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
cd90: 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 ee(&ds1);. re
cda0: 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a turn ctx;.}.../*
cdb0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
cdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cdf0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 ------. *. * Sta
ce00: 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 tusObjCmd -- ret
ce10: 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 urn certificate
ce20: 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 for connected pe
ce30: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
ce40: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
ce50: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
ce60: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
ce70: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
ce80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cec0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
ced0: 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 t.StatusObjCmd(C
cee0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
cef0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
cf00: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
cf10: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
cf20: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
cf30: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
cf40: 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 ;. X509 *peer
cf50: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f ;. Tcl_Obj *o
cf60: 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 bjPtr;. Tcl_C
cf70: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 hannel chan;.
cf80: 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 char *channelNa
cf90: 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 me, *ciphers;.
cfa0: 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 int mode;.
cfb0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
cfc0: 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 har *proto;.
cfd0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e unsigned int len
cfe0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 65 65 72 ;. char *peer
cff0: 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 name = NULL;..
d000: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
d010: 64 22 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 d");.. switch
d020: 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73 65 20 (objc) {..case
d030: 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65 6c 4e 2:.. channelN
d040: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 ame = Tcl_GetStr
d050: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
d060: 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 1], NULL);..
d070: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 33 3a break;...case 3:
d080: 0a 09 20 20 20 20 69 66 20 28 21 73 74 72 63 6d .. if (!strcm
d090: 70 20 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p (Tcl_GetString
d0a0: 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f (objv[1]), "-lo
d0b0: 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 61 6e 6e cal")) {...chann
d0c0: 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 elName = Tcl_Get
d0d0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 StringFromObj(ob
d0e0: 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 09 jv[2], NULL);...
d0f0: 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 break;.. }..
d100: 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 2d /* else fall-
d110: 74 68 72 6f 75 67 68 20 2e 2e 2e 20 2a 2f 0a 23 through ... */.#
d120: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 if defined(__GNU
d130: 43 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 74 74 72 C__).. __attr
d140: 69 62 75 74 65 5f 5f 28 28 66 61 6c 6c 74 68 72 ibute__((fallthr
d150: 6f 75 67 68 29 29 3b 0a 23 65 6e 64 69 66 0a 09 ough));.#endif..
d160: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 54 63 default:.. Tc
d170: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
d180: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
d190: 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 "?-local? channe
d1a0: 6c 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e l");.. return
d1b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
d1c0: 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 }.. chan = Tc
d1d0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
d1e0: 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 erp, channelName
d1f0: 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 , &mode);. if
d200: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
d210: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
d220: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
d230: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 R;. }. /*
d240: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
d250: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
d260: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
d270: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
d280: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
d290: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 );. if (Tcl_G
d2a0: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
d2b0: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
d2c0: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
d2d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d2e0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
d2f0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
d300: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
d310: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 ,..."\": not a T
d320: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
d330: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
d340: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
d350: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
d360: 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 te *) Tcl_GetCha
d370: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
d380: 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 (chan);. if (
d390: 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 objc == 2) {..pe
d3a0: 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 er = SSL_get_pee
d3b0: 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 r_certificate(st
d3c0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
d3d0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 } else {..peer
d3e0: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 = SSL_get_certi
d3f0: 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d ficate(statePtr-
d400: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 >ssl);. }.
d410: 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 if (peer) {..ob
d420: 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 jPtr = Tls_NewX5
d430: 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 09Obj(interp, pe
d440: 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d er);..if (objc =
d450: 3d 20 32 29 20 7b 20 58 35 30 39 5f 66 72 65 65 = 2) { X509_free
d460: 28 70 65 65 72 29 3b 20 7d 0a 20 20 20 20 7d 20 (peer); }. }
d470: 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d else {..objPtr =
d480: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
d490: 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0, NULL);. }.
d4a0: 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 63 65 72 . /* Peer cer
d4b0: 74 20 63 68 61 69 6e 20 28 63 6c 69 65 6e 74 20 t chain (client
d4c0: 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20 53 54 41 only) */. STA
d4d0: 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20 73 73 6c CK_OF(X509)* ssl
d4e0: 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f 67 65 74 _certs = SSL_get
d4f0: 5f 70 65 65 72 5f 63 65 72 74 5f 63 68 61 69 6e _peer_cert_chain
d500: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
d510: 0a 20 20 20 20 69 66 20 28 21 70 65 65 72 20 26 . if (!peer &
d520: 26 20 28 73 73 6c 5f 63 65 72 74 73 20 3d 3d 20 & (ssl_certs ==
d530: 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35 30 39 5f NULL || sk_X509_
d540: 6e 75 6d 28 73 73 6c 5f 63 65 72 74 73 29 20 3d num(ssl_certs) =
d550: 3d 20 30 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 = 0)) {..return
d560: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
d570: 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 .. /* Peer na
d580: 6d 65 20 66 72 6f 6d 20 63 65 72 74 20 2a 2f 0a me from cert */.
d590: 20 20 20 20 69 66 20 28 53 53 4c 5f 67 65 74 5f if (SSL_get_
d5a0: 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 verify_result(st
d5b0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 3d 3d 20 atePtr->ssl) ==
d5c0: 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 70 65 X509_V_OK) {..pe
d5d0: 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 ername = SSL_get
d5e0: 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 0_peername(state
d5f0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
d600: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
d610: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
d620: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
d630: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
d640: 70 65 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29 3b peername", -1));
d650: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
d660: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
d670: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
d680: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
d690: 65 65 72 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a 0a eername, -1));..
d6a0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
d6b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
d6c0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
d6d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
d6e0: 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20 bits", -1));.
d6f0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
d700: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
d710: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
d720: 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f wIntObj(SSL_get_
d730: 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 cipher_bits(stat
d740: 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 ePtr->ssl, NULL)
d750: 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 ));.. ciphers
d760: 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 = (char*)SSL_ge
d770: 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 t_cipher(statePt
d780: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 r->ssl);. if
d790: 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c ((ciphers != NUL
d7a0: 4c 29 20 26 26 20 28 73 74 72 63 6d 70 28 63 69 L) && (strcmp(ci
d7b0: 70 68 65 72 73 2c 20 22 28 4e 4f 4e 45 29 22 29 phers, "(NONE)")
d7c0: 20 21 3d 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4c != 0)) {..Tcl_L
d7d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
d7e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
d7f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
d800: 67 4f 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d gObj("cipher", -
d810: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
d820: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
d830: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
d840: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
d850: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 SSL_get_cipher(s
d860: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d tatePtr->ssl), -
d870: 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 1));. }..
d880: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 /* Verify the X5
d890: 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 09 certificate p
d8a0: 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 resented by the
d8b0: 70 65 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f peer */. Tcl_
d8c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
d8d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
d8e0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
d8f0: 6e 67 4f 62 6a 28 22 76 61 6c 69 64 61 74 69 6f ngObj("validatio
d900: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 n", -1));. if
d910: 20 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 (SSL_get_verify
d920: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 _result(statePtr
d930: 2d 3e 73 73 6c 29 20 21 3d 20 58 35 30 39 5f 56 ->ssl) != X509_V
d940: 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 70 72 6f 74 6f _OK) {../* proto
d950: 20 3d 20 22 66 61 69 6c 65 64 22 3b 20 2a 2f 0a = "failed"; */.
d960: 09 70 72 6f 74 6f 20 3d 20 52 45 41 53 4f 4e 28 .proto = REASON(
d970: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
d980: 09 70 72 6f 74 6f 20 3d 20 22 6f 6b 22 3b 0a 20 .proto = "ok";.
d990: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 }. Tcl_Lis
d9a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
d9b0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
d9c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
d9d0: 62 6a 28 70 72 6f 74 6f 2c 20 2d 31 29 29 3b 0a bj(proto, -1));.
d9e0: 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 . /* Report t
d9f0: 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 he selected prot
da00: 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 ocol as a result
da10: 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 of the negotiat
da20: 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 ion */. SSL_g
da30: 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 et0_alpn_selecte
da40: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c d(statePtr->ssl,
da50: 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a &proto, &len);.
da60: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
da70: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
da80: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
da90: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 _NewStringObj("a
daa0: 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 lpn", -1));.
dab0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
dac0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
dad0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
dae0: 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 StringObj((char
daf0: 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 6c 65 *)proto, (int)le
db00: 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 n));. Tcl_Lis
db10: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
db20: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
db30: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
db40: 62 6a 28 22 76 65 72 73 69 6f 6e 22 2c 20 2d 31 bj("version", -1
db50: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
db60: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
db70: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
db80: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
db90: 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f j(SSL_get_versio
dba0: 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 n(statePtr->ssl)
dbb0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c , -1));.. Tcl
dbc0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
dbd0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 terp, objPtr);.
dbe0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
dbf0: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
dc00: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
dc10: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
dc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
dc60: 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a onnectionInfoObj
dc70: 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f Cmd -- return co
dc80: 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 nnection info fr
dc90: 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 om OpenSSL.. *.
dca0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
dcb0: 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 list of connecti
dcc0: 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d on info. *. *--
dcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dcf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd10: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e -. */..static in
dd20: 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f t ConnectionInfo
dd30: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
dd40: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
dd50: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
dd60: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
dd70: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
dd80: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
dd90: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 nnel chan;../* T
dda0: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 he channel to se
ddb0: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a t a mode on. */.
ddc0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
ddd0: 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 Ptr;../* client
dde0: 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f state for ssl so
ddf0: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f cket */. Tcl_
de00: 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 Obj *objPtr;.
de10: 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b const SSL *ssl;
de20: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 . const SSL_C
de30: 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 IPHER *cipher;.
de40: 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 const SSL_SES
de50: 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 SION *session;.
de60: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 const unsigne
de70: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 d char *proto;.
de80: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 unsigned int
de90: 6c 65 6e 3b 0a 20 20 20 20 6c 6f 6e 67 20 6d 6f len;. long mo
dea0: 64 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a de;.. if (obj
deb0: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
dec0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
ded0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
dee0: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
def0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
df00: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
df10: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
df20: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
df30: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
df40: 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 1], NULL), NULL)
df50: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
df60: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
df70: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 NULL) {..return(
df80: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
df90: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 }.. /* Make s
dfa0: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f ure to operate o
dfb0: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 n the topmost ch
dfc0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 annel */. cha
dfd0: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
dfe0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 annel(chan);.
dff0: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
e000: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
e010: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
e020: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e ()) {..Tcl_Appen
e030: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
e040: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
e050: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
e060: 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a Name(chan), "\":
e070: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
e080: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 el", NULL);..ret
e090: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
e0a0: 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 }.. objPt
e0b0: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
e0c0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 bj(0, NULL);..
e0d0: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 /* Connection
e0e0: 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 info */. stat
e0f0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
e100: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e Tcl_GetChannelIn
e110: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 stanceData(chan)
e120: 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 ;. ssl = stat
e130: 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 ePtr->ssl;. i
e140: 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 f (ssl != NULL)
e150: 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e {../* connection
e160: 20 73 74 61 74 65 20 2a 2f 0a 09 54 63 6c 5f 4c state */..Tcl_L
e170: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
e180: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
e190: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
e1a0: 67 4f 62 6a 28 22 73 74 61 74 65 22 2c 20 2d 31 gObj("state", -1
e1b0: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
e1c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
e1d0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
e1e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 l_NewStringObj(S
e1f0: 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f SL_state_string_
e200: 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b long(ssl), -1));
e210: 0a 0a 09 2f 2a 20 47 65 74 20 73 65 72 76 65 72 .../* Get server
e220: 20 6e 61 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 name */..Tcl_Li
e230: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
e240: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
e250: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
e260: 4f 62 6a 28 22 73 65 72 76 65 72 6e 61 6d 65 22 Obj("servername"
e270: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
e280: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
e290: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
e2a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
e2b0: 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 bj(SSL_get_serve
e2c0: 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 rname(ssl, TLSEX
e2d0: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f T_NAMETYPE_host_
e2e0: 6e 61 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f name), -1));.../
e2f0: 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a * Get protocol *
e300: 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
e310: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
e320: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
e330: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 NewStringObj("pr
e340: 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 09 otocol", -1));..
e350: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e360: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e370: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
e380: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 StringObj(SSL_ge
e390: 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 t_version(ssl),
e3a0: 2d 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 -1));.../* Reneg
e3b0: 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 otiation allowed
e3c0: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
e3d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
e3e0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
e3f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
e400: 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20 renegotiation",
e410: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
e420: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e430: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e440: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e450: 28 0a 09 20 20 20 20 53 53 4c 5f 67 65 74 5f 73 (.. SSL_get_s
e460: 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 ecure_renegotiat
e470: 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 ion_support(ssl)
e480: 20 3f 20 22 73 75 70 70 6f 72 74 65 64 22 20 3a ? "supported" :
e490: 20 22 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 "not supported"
e4a0: 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 70 , -1));.../* Rep
e4b0: 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 ort the selected
e4c0: 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 protocol as a r
e4d0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 esult of the ALP
e4e0: 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f N negotiation */
e4f0: 0a 09 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f ..SSL_get0_alpn_
e500: 73 65 6c 65 63 74 65 64 28 73 73 6c 2c 20 26 70 selected(ssl, &p
e510: 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 09 54 63 roto, &len);..Tc
e520: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
e530: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
e540: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
e550: 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 ringObj("alpn",
e560: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
e570: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e580: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e590: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e5a0: 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 ((char *)proto,
e5b0: 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 0a 09 2f 2a (int)len));.../*
e5c0: 20 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 Get security le
e5d0: 76 65 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 vel */..Tcl_List
e5e0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
e5f0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
e600: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
e610: 6a 28 22 73 65 63 75 72 69 74 79 6c 65 76 65 6c j("securitylevel
e620: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
e630: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
e640: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
e650: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a r, Tcl_NewIntObj
e660: 28 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 (SSL_get_securit
e670: 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 29 3b 0a y_level(ssl)));.
e680: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 }.. /* Ci
e690: 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 pher info */.
e6a0: 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 cipher = SSL_ge
e6b0: 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 t_current_cipher
e6c0: 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 (ssl);. if (c
e6d0: 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b ipher != NULL) {
e6e0: 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 ..char buf[BUFSI
e6f0: 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 Z] = {0};..int b
e700: 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a its, alg_bits;..
e710: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
e720: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
e730: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
e740: 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 wStringObj("ciph
e750: 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f er", -1));..Tcl_
e760: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
e770: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
e780: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
e790: 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 ngObj(SSL_CIPHER
e7a0: 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 _get_name(cipher
e7b0: 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ), -1));..Tcl_Li
e7c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
e7d0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
e7e0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
e7f0: 4f 62 6a 28 22 73 74 61 6e 64 61 72 64 5f 6e 61 Obj("standard_na
e800: 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f me", -1));..Tcl_
e810: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
e820: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
e830: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
e840: 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 ngObj(SSL_CIPHER
e850: 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 _standard_name(c
e860: 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 ipher), -1));...
e870: 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 bits = SSL_CIPHE
e880: 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 R_get_bits(ciphe
e890: 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 r, &alg_bits);..
e8a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e8b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e8c0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
e8d0: 53 74 72 69 6e 67 4f 62 6a 28 22 62 69 74 73 22 StringObj("bits"
e8e0: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
e8f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
e900: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
e910: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
e920: 62 69 74 73 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 bits));..Tcl_Lis
e930: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
e940: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
e950: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
e960: 62 6a 28 22 73 65 63 72 65 74 5f 62 69 74 73 22 bj("secret_bits"
e970: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
e980: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
e990: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
e9a0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
e9b0: 61 6c 67 5f 62 69 74 73 29 29 3b 0a 09 2f 2a 20 alg_bits));../*
e9c0: 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 alg_bits is actu
e9d0: 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 al key secret bi
e9e0: 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 ts. If use bits
e9f0: 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f and secret (algo
ea00: 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 rithm) bits diff
ea10: 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 74 er,. t
ea20: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 he rest of the b
ea30: 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 its are fixed, i
ea40: 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 .e. for limited
ea50: 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 export ciphers (
ea60: 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 09 54 bits < 56) */..T
ea70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
ea80: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
ea90: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
eaa0: 74 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 5f 76 65 tringObj("min_ve
eab0: 72 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 rsion", -1));..T
eac0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
ead0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
eae0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
eaf0: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 tringObj(SSL_CIP
eb00: 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 HER_get_version(
eb10: 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a cipher), -1));..
eb20: 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f .if (SSL_CIPHER_
eb30: 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 description(ciph
eb40: 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 er, buf, sizeof(
eb50: 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b buf)) != NULL) {
eb60: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
eb70: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
eb80: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
eb90: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
eba0: 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 2d "description", -
ebb0: 31 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 1));.. Tcl_Li
ebc0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
ebd0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
ebe0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
ebf0: 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a 09 Obj(buf, -1));..
ec00: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
ec10: 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a Session info */.
ec20: 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 session = SS
ec30: 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 L_get_session(ss
ec40: 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 l);. if (sess
ec50: 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ion != NULL) {..
ec60: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
ec70: 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 har *ticket;..si
ec80: 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 63 6f 6e 73 ze_t len2;..cons
ec90: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
eca0: 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 0a 09 2f *session_id;.../
ecb0: 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a * Session info *
ecc0: 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
ecd0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
ece0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
ecf0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 NewStringObj("se
ed00: 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d ssion_reused", -
ed10: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
ed20: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
ed30: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
ed40: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c cl_NewIntObj(SSL
ed50: 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 _session_reused(
ed60: 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 ssl)));.../* Ses
ed70: 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 54 63 6c 5f sion id */..Tcl_
ed80: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
ed90: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
eda0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
edb0: 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 69 ngObj("session_i
edc0: 64 22 2c 20 2d 31 29 29 3b 0a 09 73 65 73 73 69 d", -1));..sessi
edd0: 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 on_id = SSL_SESS
ede0: 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 ION_get_id(sessi
edf0: 6f 6e 2c 20 26 6c 65 6e 29 3b 0a 09 54 63 6c 5f on, &len);..Tcl_
ee00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
ee10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
ee20: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
ee30: 6e 67 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 ngObj(session_id
ee40: 2c 20 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 0a 09 , (int)len));...
ee50: 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 /* Session ticke
ee60: 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 t - client only
ee70: 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f */..SSL_SESSION_
ee80: 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 get0_ticket(sess
ee90: 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
eea0: 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f en2);..Tcl_ListO
eeb0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
eec0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
eed0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
eee0: 28 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 ("session_ticket
eef0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
ef00: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
ef10: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
ef20: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
ef30: 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 Obj(ticket, (int
ef40: 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 52 ) len2));.../* R
ef50: 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e esumable session
ef60: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
ef70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
ef80: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
ef90: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
efa0: 72 65 73 75 6d 61 62 6c 65 22 2c 20 2d 31 29 29 resumable", -1))
efb0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
efc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
efd0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
efe0: 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 53 45 NewIntObj(SSL_SE
eff0: 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 SSION_is_resumab
f000: 6c 65 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a le(session)));..
f010: 09 2f 2a 20 53 74 61 72 74 20 74 69 6d 65 20 2a ./* Start time *
f020: 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
f030: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
f040: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
f050: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 NewStringObj("st
f060: 61 72 74 5f 74 69 6d 65 22 2c 20 2d 31 29 29 3b art_time", -1));
f070: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
f080: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f090: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f0a0: 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 ewLongObj(SSL_SE
f0b0: 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 SSION_get_time(s
f0c0: 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 ession)));.../*
f0d0: 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2a 2f Timeout value */
f0e0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
f0f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f100: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f110: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 6d ewStringObj("tim
f120: 65 6f 75 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 eout", -1));..Tc
f130: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
f140: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
f150: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f bjPtr, Tcl_NewLo
f160: 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f ngObj(SSL_SESSIO
f170: 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 N_get_timeout(se
f180: 73 73 69 6f 6e 29 29 29 3b 0a 20 20 20 20 7d 0a ssion)));. }.
f190: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 . /* Compress
f1a0: 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ion info */.
f1b0: 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 if (ssl != NULL)
f1c0: 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 {.#ifdef HAVE_S
f1d0: 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 SL_COMPRESSION..
f1e0: 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f const COMP_METHO
f1f0: 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a D *comp, *expn;.
f200: 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f .comp = SSL_get_
f210: 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 current_compress
f220: 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 ion(ssl);..expn
f230: 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e = SSL_get_curren
f240: 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 t_expansion(ssl)
f250: 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
f260: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f270: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f280: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 _NewStringObj("c
f290: 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 ompression", -1)
f2a0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
f2b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f2c0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f2d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 6f _NewStringObj(co
f2e0: 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 mp ? SSL_COMP_ge
f2f0: 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 t_name(comp) : "
f300: 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 54 63 NONE", -1));..Tc
f310: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
f320: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
f330: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
f340: 72 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 ringObj("expansi
f350: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f on", -1));..Tcl_
f360: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
f370: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
f380: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
f390: 6e 67 4f 62 6a 28 65 78 70 6e 20 3f 20 53 53 4c ngObj(expn ? SSL
f3a0: 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 _COMP_get_name(e
f3b0: 78 70 6e 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d xpn) : "NONE", -
f3c0: 31 29 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 1));.#else..Tcl_
f3d0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
f3e0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
f3f0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
f400: 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 ngObj("compressi
f410: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f on", -1));..Tcl_
f420: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
f430: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
f440: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
f450: 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 ngObj("NONE", -1
f460: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
f470: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
f480: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
f490: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
f4a0: 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 expansion", -1))
f4b0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
f4c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
f4d0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
f4e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f NewStringObj("NO
f4f0: 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 NE", -1));.#endi
f500: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 f. }.. /*
f510: 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 Server info */.
f520: 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 mode = SSL_CT
f530: 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 X_get_session_ca
f540: 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 che_mode(statePt
f550: 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 r->ctx);. if
f560: 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 (mode & SSL_SESS
f570: 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 70 _CACHE_OFF) {..p
f580: 72 6f 74 6f 20 3d 20 22 6f 66 66 22 3b 0a 20 20 roto = "off";.
f590: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 } else if (mod
f5a0: 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 e & SSL_SESS_CAC
f5b0: 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 70 72 HE_CLIENT) {..pr
f5c0: 6f 74 6f 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a oto = "client";.
f5d0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6d } else if (m
f5e0: 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 ode & SSL_SESS_C
f5f0: 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 ACHE_SERVER) {..
f600: 70 72 6f 74 6f 20 3d 20 22 73 65 72 76 65 72 22 proto = "server"
f610: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
f620: 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 (mode & SSL_SESS
f630: 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 _CACHE_BOTH) {..
f640: 70 72 6f 74 6f 20 3d 20 22 62 6f 74 68 22 3b 0a proto = "both";.
f650: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 72 } else {..pr
f660: 6f 74 6f 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b oto = "unknown";
f670: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c . }. Tcl_L
f680: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f690: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f6a0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
f6b0: 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 63 61 gObj("session_ca
f6c0: 63 68 65 5f 6d 6f 64 65 22 2c 20 2d 31 29 29 3b che_mode", -1));
f6d0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
f6e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
f6f0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
f700: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
f710: 72 6f 74 6f 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 roto, -1));..
f720: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
f730: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
f740: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
f750: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 L_OK;..clientDat
f760: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a a = clientData;.
f770: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
f780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
f7c0: 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 * VersionObjCmd
f7d0: 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 -- return versi
f7e0: 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f on string from O
f7f0: 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 penSSL.. *. * Re
f800: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
f810: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
f820: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
f830: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
f840: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
f850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f880: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
f890: 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a c int.VersionObj
f8a0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
f8b0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
f8c0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
f8d0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
f8e0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
f8f0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f {. Tcl_Obj *o
f900: 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 bjPtr;.. dpri
f910: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
f920: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
f930: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 _NewStringObj(OP
f940: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 ENSSL_VERSION_TE
f950: 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c XT, -1);. Tcl
f960: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
f970: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a terp, objPtr);..
f980: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
f990: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d K;..clientData =
f9a0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 09 6f 62 clientData;..ob
f9b0: 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a 76 jc = objc;..objv
f9c0: 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a = objv;.}.../*.
f9d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
f9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 4d 69 73 63 -----. *. * Misc
fa20: 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 ObjCmd -- misc c
fa30: 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 ommands. *. * Re
fa40: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
fa50: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
fa60: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
fa70: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
fa80: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
fa90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
faa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fac0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
fad0: 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 c int.MiscObjCmd
fae0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
faf0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
fb00: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
fb10: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
fb20: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
fb30: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 static const
fb40: 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b char *commands [
fb50: 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 ] = { "req", "st
fb60: 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 rreq", NULL };.
fb70: 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 enum command
fb80: 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 { C_REQ, C_STRRE
fb90: 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 Q, C_DUMMY };.
fba0: 20 20 69 6e 74 20 63 6d 64 2c 20 69 73 53 74 72 int cmd, isStr
fbb0: 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 65 ;. char buffe
fbc0: 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20 64 r[16384];.. d
fbd0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
fbe0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
fbf0: 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e < 2) {..Tcl_Wron
fc00: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
fc10: 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 1, objv, "subco
fc20: 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a mmand ?args?");.
fc30: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
fc40: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
fc50: 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f (Tcl_GetIndexFro
fc60: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
fc70: 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 v[1], commands,
fc80: 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 63 6d "command", 0,&cm
fc90: 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a d) != TCL_OK) {.
fca0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
fcb0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73 R;. }.. is
fcc0: 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f Str = (cmd == C_
fcd0: 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 STRREQ);. swi
fce0: 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 tch ((enum comma
fcf0: 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 nd) cmd) {..case
fd00: 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f C_REQ:..case C_
fd10: 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 STRREQ: {.. E
fd20: 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 VP_PKEY *pkey=NU
fd30: 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 LL;.. X509 *c
fd40: 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 ert=NULL;.. X
fd50: 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 509_NAME *name=N
fd60: 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 ULL;.. Tcl_Ob
fd70: 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 j **listv;..
fd80: 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 int listc,i;...
fd90: 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c BIO *out=NULL
fda0: 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f ;... char *k_
fdb0: 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b C="",*k_ST="",*k
fdc0: 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b _L="",*k_O="",*k
fdd0: 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c _OU="",*k_CN="",
fde0: 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 *k_Email="";..
fdf0: 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a char *keyout,*
fe00: 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 pemout,*str;..
fe10: 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 int keysize,se
fe20: 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b rial=0,days=365;
fe30: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
fe40: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
fe50: 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 x30000000L..
fe60: 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 BIGNUM *bne = NU
fe70: 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 LL;.. RSA *rs
fe80: 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a a = NULL;.#else.
fe90: 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 . EVP_PKEY_CT
fea0: 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 X *ctx = NULL;.#
feb0: 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 endif... if (
fec0: 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a (objc<5) || (obj
fed0: 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 c>6)) {...Tcl_Wr
fee0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
fef0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 p, 2, objv, "key
ff00: 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 size keyfile cer
ff10: 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a tfile ?info?");.
ff20: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
ff30: 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 OR;.. }...
ff40: 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 if (Tcl_GetIntF
ff50: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
ff60: 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 bjv[2], &keysize
ff70: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
ff80: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
ff90: 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b R;.. }.. k
ffa0: 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 eyout=Tcl_GetStr
ffb0: 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 ing(objv[3]);..
ffc0: 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 pemout=Tcl_Ge
ffd0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 tString(objv[4])
ffe0: 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72 ;.. if (isStr
fff0: 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 ) {...Tcl_SetVar
10000 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 (interp,keyout,"
10010 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 ",0);...Tcl_SetV
10020 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 ar(interp,pemout
10030 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a ,"",0);.. }..
10040 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 . if (objc>=6
10050 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 ) {...if (Tcl_Li
10060 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 stObjGetElements
10070 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d (interp, objv[5]
10080 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 ,....&listc, &li
10090 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 stv) != TCL_OK)
100a0 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 {... return T
100b0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 CL_ERROR;...}...
100c0 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 .if ((listc%2) !
100d0 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c = 0) {... Tcl
100e0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
100f0 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c p,"Information l
10100 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 ist must have ev
10110 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 en number of arg
10120 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 uments",NULL);..
10130 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
10140 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 ERROR;...}...for
10150 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 (i=0; i<listc;
10160 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 i+=2) {... st
10170 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 r=Tcl_GetString(
10180 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 listv[i]);...
10190 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
101a0 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 "days")==0) {...
101b0 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 .if (Tcl_GetIntF
101c0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 romObj(interp,li
101d0 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 stv[i+1],&days)!
101e0 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 =TCL_OK)....
101f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
10200 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
10210 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 f (strcmp(str,"s
10220 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 erial")==0) {...
10230 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 .if (Tcl_GetIntF
10240 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 romObj(interp,li
10250 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c stv[i+1],&serial
10260 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 )!=TCL_OK)....
10270 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
10280 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 OR;... } else
10290 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
102a0 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "C")==0) {....k_
102b0 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 C=Tcl_GetString(
102c0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
102d0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
102e0 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d rcmp(str,"ST")==
102f0 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 0) {....k_ST=Tcl
10300 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
10310 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
10320 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
10330 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 str,"L")==0) {..
10340 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 ..k_L=Tcl_GetStr
10350 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
10360 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
10370 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 (strcmp(str,"O"
10380 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 )==0) {....k_O=T
10390 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
103a0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
103b0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
103c0 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 p(str,"OU")==0)
103d0 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 {....k_OU=Tcl_Ge
103e0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
103f0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
10400 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
10410 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 ,"CN")==0) {....
10420 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 k_CN=Tcl_GetStri
10430 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
10440 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
10450 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 (strcmp(str,"Ema
10460 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f il")==0) {....k_
10470 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 Email=Tcl_GetStr
10480 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
10490 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ... } else {.
104a0 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
104b0 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e (interp,"Unknown
104c0 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c parameter",NULL
104d0 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c );....return TCL
104e0 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a _ERROR;... }.
104f0 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 ..}.. }..#if
10500 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
10510 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
10520 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 000L.. bne =
10530 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 BN_new();.. r
10540 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a sa = RSA_new();.
10550 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f . pkey = EVP_
10560 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 PKEY_new();..
10570 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c if (bne == NULL
10580 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 || rsa == NULL
10590 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 || pkey == NULL
105a0 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 || !BN_set_word(
105b0 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 bne,RSA_F4) ||..
105c0 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b .!RSA_generate_k
105d0 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 ey_ex(rsa, keysi
105e0 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c ze, bne, NULL) |
105f0 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 | !EVP_PKEY_assi
10600 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 gn_RSA(pkey, rsa
10610 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f )) {...EVP_PKEY_
10620 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a free(pkey);.../*
10630 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 RSA_free(rsa);
10640 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 freed by EVP_PKE
10650 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 Y_free */...BN_f
10660 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a ree(bne);.#else.
10670 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f . pkey = EVP_
10680 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 RSA_gen((unsigne
10690 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b d int) keysize);
106a0 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f .. ctx = EVP_
106b0 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 PKEY_CTX_new(pke
106c0 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 y,NULL);.. if
106d0 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c (pkey == NULL |
106e0 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c | ctx == NULL ||
106f0 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 !EVP_PKEY_keyge
10700 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 n_init(ctx) ||..
10710 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 .!EVP_PKEY_CTX_s
10720 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 et_rsa_keygen_bi
10730 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 ts(ctx, keysize)
10740 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 || !EVP_PKEY_ke
10750 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 ygen(ctx, &pkey)
10760 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 ) {...EVP_PKEY_f
10770 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 ree(pkey);...EVP
10780 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 _PKEY_CTX_free(c
10790 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 tx);.#endif...Tc
107a0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
107b0 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 rp,"Error genera
107c0 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 ting private key
107d0 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 ",NULL);...retur
107e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
107f0 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 } else {...if
10800 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 (isStr) {...
10810 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f out=BIO_new(BIO_
10820 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 s_mem());...
10830 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 PEM_write_bio_Pr
10840 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 ivateKey(out,pke
10850 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 y,NULL,NULL,0,NU
10860 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 LL,NULL);...
10870 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 i=BIO_read(out,b
10880 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 uffer,sizeof(buf
10890 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 fer)-1);... i
108a0 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a =(i<0) ? 0 : i;.
108b0 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d .. buffer[i]=
108c0 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f '\0';... Tcl_
108d0 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 SetVar(interp,ke
108e0 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a yout,buffer,0);.
108f0 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 .. BIO_flush(
10900 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f out);... BIO_
10910 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 free(out);...} e
10920 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d lse {... out=
10930 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 BIO_new(BIO_s_fi
10940 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f le());... BIO
10950 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 _write_filename(
10960 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 out,keyout);...
10970 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
10980 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c _PrivateKey(out,
10990 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 pkey,NULL,NULL,0
109a0 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ,NULL,NULL);...
109b0 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f /* PEM_write_
109c0 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 bio_RSAPrivateKe
109d0 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c y(out, rsa, NULL
109e0 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c , NULL, 0, NULL,
109f0 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 NULL); */...
10a00 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 BIO_free_all(ou
10a10 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 t);.. .}....if (
10a20 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 (cert=X509_new()
10a30 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 )==NULL) {...
10a40 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
10a50 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e nterp,"Error gen
10a60 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 erating certific
10a70 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c ate request",NUL
10a80 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b L);... EVP_PK
10a90 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 EY_free(pkey);.#
10aa0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
10ab0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
10ac0 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 000000L... BN
10ad0 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 _free(bne);.#end
10ae0 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e 28 if... return(
10af0 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a TCL_ERROR);...}.
10b00 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73 ...X509_set_vers
10b10 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 ion(cert,2);...A
10b20 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 SN1_INTEGER_set(
10b30 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e X509_get_serialN
10b40 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 69 umber(cert),seri
10b50 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 al);...X509_gmti
10b60 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d me_adj(X509_getm
10b70 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 _notBefore(cert)
10b80 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 ,0);...X509_gmti
10b90 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d me_adj(X509_getm
10ba0 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c _notAfter(cert),
10bb0 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 (long)60*60*24*d
10bc0 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 ays);...X509_set
10bd0 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 _pubkey(cert,pke
10be0 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 y);....name=X509
10bf0 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d _get_subject_nam
10c00 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 e(cert);....X509
10c10 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
10c20 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c by_txt(name,"C",
10c30 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
10c40 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
10c50 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 har *) k_C, -1,
10c60 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
10c70 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
10c80 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 _txt(name,"ST",
10c90 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
10ca0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
10cb0 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 ar *) k_ST, -1,
10cc0 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
10cd0 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
10ce0 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d _txt(name,"L", M
10cf0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
10d00 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
10d10 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 r *) k_L, -1, -1
10d20 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
10d30 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
10d40 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 xt(name,"O", MBS
10d50 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
10d60 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
10d70 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 *) k_O, -1, -1,
10d80 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
10d90 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
10da0 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 (name,"OU", MBST
10db0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
10dc0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
10dd0 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 ) k_OU, -1, -1,
10de0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
10df0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
10e00 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 (name,"CN", MBST
10e10 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
10e20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
10e30 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 ) k_CN, -1, -1,
10e40 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
10e50 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
10e60 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d (name,"Email", M
10e70 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
10e80 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
10e90 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 r *) k_Email, -1
10ea0 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 , -1, 0);....X50
10eb0 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 9_set_subject_na
10ec0 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a me(cert,name);..
10ed0 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e ..if (!X509_sign
10ee0 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 (cert,pkey,EVP_s
10ef0 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20 ha256())) {...
10f00 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 X509_free(cert
10f10 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 );... EVP_PKE
10f20 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 Y_free(pkey);.#i
10f30 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
10f40 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
10f50 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 00000L... BN_
10f60 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 free(bne);.#endi
10f70 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 f... Tcl_SetR
10f80 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 esult(interp,"Er
10f90 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74 ror signing cert
10fa0 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a ificate",NULL);.
10fb0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
10fc0 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 _ERROR;...}....i
10fd0 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 f (isStr) {...
10fe0 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
10ff0 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 O_s_mem());...
11000 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
11010 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a X509(out,cert);.
11020 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 .. i=BIO_read
11030 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 (out,buffer,size
11040 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 of(buffer)-1);..
11050 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 . i=(i<0) ? 0
11060 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 : i;... buff
11070 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 er[i]='\0';...
11080 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 Tcl_SetVar(int
11090 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 erp,pemout,buffe
110a0 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f r,0);... BIO_
110b0 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 flush(out);...
110c0 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b BIO_free(out);
110d0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 ...} else {...
110e0 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
110f0 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 O_s_file());...
11100 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c BIO_write_fil
11110 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 ename(out,pemout
11120 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 );... PEM_wri
11130 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c te_bio_X509(out,
11140 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f cert);... BIO
11150 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a _free_all(out);.
11160 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 ..}....X509_free
11170 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b (cert);...EVP_PK
11180 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 EY_free(pkey);.#
11190 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
111a0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
111b0 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 000000L...BN_fre
111c0 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 e(bne);.#endif..
111d0 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b }..}..break;
111e0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 . default:..b
111f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
11200 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
11210 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
11220 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a entData;.}.../**
11230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11240 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 **/./* Init
11250 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a */./****
11260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11270 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d /../*. *--------
11280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
112a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
112b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
112c0 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a * Tls_Free --. *
112d0 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
112e0 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 re cleans up whe
112f0 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 n a SSL socket b
11300 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 ased channel. *.
11310 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 is closed and it
11320 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e s reference coun
11330 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a t falls below 1.
11340 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
11350 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.none. *. * Sid
11360 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 e effects:. *.Fr
11370 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 ees all the stat
11380 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
11390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
113a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
113b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
113c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 ----------. */.v
113d0 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 oid.Tls_Free(cha
113e0 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 r *blockPtr) {.
113f0 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
11400 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c tr = (State *)bl
11410 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 ockPtr;.. dpr
11420 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
11430 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 . Tls_Clean(s
11440 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b tatePtr);. ck
11450 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a free(blockPtr);.
11460 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
11470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
114b0 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a * Tls_Clean --.
114c0 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
114d0 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 dure cleans up w
114e0 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 hen a SSL socket
114f0 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 based channel.
11500 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 *.is closed and
11510 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f its reference co
11520 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 unt falls below
11530 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 1. This should.
11540 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e *.be called syn
11550 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 chronously by th
11560 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 e CloseProc, not
11570 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 in the. *.Event
11580 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 uallyFree callba
11590 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ck.. *. * Result
115a0 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.none. *. *
115b0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
115c0 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 *.Frees all the
115d0 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d state. *. *-----
115e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
115f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
11620 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 */.void Tls_Clea
11630 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 n(State *statePt
11640 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 r) {. dprintf
11650 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
11660 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 /*. * we're
11670 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 assuming here t
11680 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 hat we're single
11690 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a -threaded. *
116a0 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
116b0 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 tr->timer != (Tc
116c0 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 l_TimerToken) NU
116d0 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 LL) {..Tcl_Delet
116e0 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 eTimerHandler(st
116f0 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a atePtr->timer);.
11700 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 .statePtr->timer
11710 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a = NULL;. }..
11720 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
11730 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 ->protos) {..ckf
11740 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 ree(statePtr->pr
11750 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 otos);..statePtr
11760 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b ->protos = NULL;
11770 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
11780 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a tatePtr->bio) {.
11790 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 ./* This will ca
117a0 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e ll SSL_shutdown.
117b0 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a Bug 1414045 */.
117c0 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 .dprintf("BIO_fr
117d0 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 ee_all(%p)", sta
117e0 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 tePtr->bio);..BI
117f0 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 O_free_all(state
11800 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 Ptr->bio);..stat
11810 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c ePtr->bio = NULL
11820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
11830 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b statePtr->ssl) {
11840 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 ..dprintf("SSL_f
11850 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 ree(%p)", stateP
11860 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 tr->ssl);..SSL_f
11870 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ree(statePtr->ss
11880 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 l);..statePtr->s
11890 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d sl = NULL;. }
118a0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
118b0 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 r->ctx) {..SSL_C
118c0 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 TX_free(statePtr
118d0 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 ->ctx);..statePt
118e0 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 r->ctx = NULL;.
118f0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
11900 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
11910 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {..Tcl_DecrRefC
11920 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 ount(statePtr->c
11930 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 allback);..state
11940 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 Ptr->callback =
11950 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
11960 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 if (statePtr->pa
11970 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 ssword) {..Tcl_D
11980 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ecrRefCount(stat
11990 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b ePtr->password);
119a0 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 ..statePtr->pass
119b0 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 word = NULL;.
119c0 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 }.. dprintf(
119d0 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a "Returning");.}.
119e0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
119f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
11a30 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a Tls_Init --. *.
11a40 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63 *.This is a pac
11a50 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 kage initializat
11a60 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 ion procedure, w
11a70 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 hich is called.
11a80 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 *.by Tcl when th
11a90 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f is package is to
11aa0 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 be added to an
11ab0 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a interpreter.. *.
11ac0 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c * Results: Ssl
11ad0 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 configured and
11ae0 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 loaded. *. * Sid
11af0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 e effects:. *. c
11b00 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f reate the ssl co
11b10 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a mmand, initializ
11b20 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a e ssl context. *
11b30 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
11b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b70 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 ------. */.DLLEX
11b80 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 PORT int Tls_Ini
11b90 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e t(Tcl_Interp *in
11ba0 74 65 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73 terp) {. cons
11bb0 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 t char tlsTclIni
11bc0 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 tScript[] = {.#i
11bd0 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e nclude "tls.tcl.
11be0 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a h"..0x00. };.
11bf0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
11c00 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a lled");.. /*.
11c10 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 73 * We only s
11c20 75 70 70 6f 72 74 20 54 63 6c 20 38 2e 34 20 6f upport Tcl 8.4 o
11c30 72 20 6e 65 77 65 72 0a 20 20 20 20 20 2a 2f 0a r newer. */.
11c40 20 20 20 20 69 66 20 28 0a 23 69 66 64 65 66 20 if (.#ifdef
11c50 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 09 54 USE_TCL_STUBS..T
11c60 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 cl_InitStubs(int
11c70 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 0a 23 erp, "8.4", 0).#
11c80 65 6c 73 65 0a 09 54 63 6c 5f 50 6b 67 52 65 71 else..Tcl_PkgReq
11c90 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 uire(interp, "Tc
11ca0 6c 22 2c 20 22 38 2e 34 2d 22 2c 20 30 29 0a 23 l", "8.4-", 0).#
11cb0 65 6e 64 69 66 0a 09 20 3d 3d 20 4e 55 4c 4c 29 endif.. == NULL)
11cc0 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
11cd0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
11ce0 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 if (TlsLibInit(
11cf0 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 0) != TCL_OK) {.
11d00 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
11d10 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 t(interp, "could
11d20 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 not initialize
11d30 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 4e 55 SSL library", NU
11d40 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
11d50 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
11d60 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
11d70 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
11d80 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 "tls::ciphers",
11d90 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 CiphersObjCmd, (
11da0 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
11db0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
11dc0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
11dd0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
11de0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
11df0 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 s::connection",
11e00 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 ConnectionInfoOb
11e10 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
11e20 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
11e30 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
11e40 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
11e50 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
11e60 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 rp, "tls::handsh
11e70 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f ake", HandshakeO
11e80 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
11e90 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
11ea0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
11eb0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
11ec0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
11ed0 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 erp, "tls::impor
11ee0 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 t", ImportObjCmd
11ef0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
11f00 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
11f10 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
11f20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
11f30 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
11f40 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c "tls::unimport",
11f50 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c UnimportObjCmd,
11f60 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
11f70 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
11f80 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
11f90 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
11fa0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
11fb0 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 tls::status", St
11fc0 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 atusObjCmd, (Cli
11fd0 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
11fe0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
11ff0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
12000 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
12010 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
12020 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f version", Versio
12030 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 nObjCmd, (Client
12040 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
12050 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
12060 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
12070 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
12080 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 nterp, "tls::mis
12090 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 c", MiscObjCmd,
120a0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
120b0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
120c0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
120d0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
120e0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
120f0 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 ls::protocols",
12100 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c ProtocolsObjCmd,
12110 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
12120 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
12130 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 roc *) NULL);..
12140 20 20 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b if (interp) {
12150 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 ..Tcl_Eval(inter
12160 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 p, tlsTclInitScr
12170 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ipt);. }..
12180 20 72 65 74 75 72 6e 28 54 63 6c 5f 50 6b 67 50 return(Tcl_PkgP
12190 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 rovide(interp, "
121a0 74 6c 73 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 tls", PACKAGE_VE
121b0 52 53 49 4f 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 RSION));.}../*.
121c0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
121d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
121e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
121f0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 -------*. *. *.T
12200 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 ls_SafeInit --.
12210 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.-----------
12220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12240 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 -----*. *.Standa
12250 72 64 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 rd procedure req
12260 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e uired by 'load'.
12270 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 . *.Initializes
12280 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 this extension f
12290 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 72 70 or a safe interp
122a0 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d reter.. *.------
122b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
122c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
122d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
122e0 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a *.Side effects:.
122f0 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 *..As of 'Tls_I
12300 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c nit'. *. *.Resul
12310 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 t:. *..A standar
12320 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 d Tcl error code
12330 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
12340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
12370 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 */.DLLEXPORT int
12380 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 Tls_SafeInit(Tc
12390 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
123a0 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ) {. dprintf(
123b0 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 "Called");. r
123c0 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 eturn(Tls_Init(i
123d0 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 nterp));.}../*.
123e0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
123f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12410 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 -------*. *. *.T
12420 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a lsLibInit --. *.
12430 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.-------------
12440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12460 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 ---*. *.Initiali
12470 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 zes SSL library
12480 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 once per applica
12490 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d tion. *.--------
124a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
124b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
124c0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
124d0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
124e0 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 ..initializes SS
124f0 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 L library. *. *.
12500 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 Result:. *..none
12510 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
12520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
12550 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 /.static int Tls
12560 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e LibInit(int unin
12570 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 itialize) {.
12580 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 static int initi
12590 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 alized = 0;.
125a0 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c int status = TCL
125b0 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 _OK;.#if defined
125c0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
125d0 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
125e0 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 73 69 _THREADS). si
125f0 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a ze_t num_locks;.
12600 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 #endif.. if (
12610 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a uninitialize) {.
12620 20 20 20 20 20 20 20 20 69 66 20 28 21 69 6e 69 if (!ini
12630 74 69 61 6c 69 7a 65 64 29 20 7b 0a 20 20 20 20 tialized) {.
12640 20 20 20 20 20 20 20 20 64 70 72 69 6e 74 66 28 dprintf(
12650 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 "Asked to uninit
12660 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 ialize, but we a
12670 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a re not initializ
12680 65 64 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 ed");..
12690 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b return(TCL_OK
126a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 );. }..
126b0 20 20 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 dprintf("A
126c0 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 sked to uninitia
126d0 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 lize");..#if def
126e0 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
126f0 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
12700 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 (TCL_THREADS).
12710 20 20 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c Tcl_MutexL
12720 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a ock(&init_mx);..
12730 20 20 20 20 20 20 20 20 69 66 20 28 6c 6f 63 6b if (lock
12740 73 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 s) {.
12750 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 20 20 free(locks);.
12760 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 73 20 locks
12770 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 = NULL;.
12780 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d locksCount =
12790 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 0;. }.#e
127a0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 69 ndif. ini
127b0 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 tialized = 0;..#
127c0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
127d0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
127e0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
127f0 44 53 29 0a 20 20 20 20 20 20 20 20 54 63 6c 5f DS). Tcl_
12800 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 MutexUnlock(&ini
12810 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 t_mx);.#endif..
12820 20 20 20 20 20 20 20 72 65 74 75 72 6e 28 54 43 return(TC
12830 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 L_OK);. }..
12840 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 if (initialize
12850 64 29 20 7b 0a 20 20 20 20 20 20 20 20 64 70 72 d) {. dpr
12860 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 intf("Called, bu
12870 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 t using cached v
12880 61 6c 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 alue");.
12890 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a return(status);.
128a0 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
128b0 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 tf("Called");..#
128c0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
128d0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
128e0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
128f0 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 DS). Tcl_Mute
12900 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b xLock(&init_mx);
12910 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 .#endif. init
12920 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 ialized = 1;..#i
12930 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
12940 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
12950 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
12960 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 S). num_locks
12970 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 = 1;. locksC
12980 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d ount = (int) num
12990 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b _locks;. lock
129a0 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f s = malloc(sizeo
129b0 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f f(*locks) * num_
129c0 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 locks);. mems
129d0 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a et(locks, 0, siz
129e0 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 eof(*locks) * nu
129f0 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 m_locks);.#endif
12a00 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c .. /* Initial
12a10 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 ize BOTH libcryp
12a20 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a to and libssl. *
12a30 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e /. OPENSSL_in
12a40 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 it_ssl(OPENSSL_I
12a50 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 NIT_LOAD_SSL_STR
12a60 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 INGS | OPENSSL_I
12a70 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f NIT_LOAD_CRYPTO_
12a80 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 STRINGS..| OPENS
12a90 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f SL_INIT_ADD_ALL_
12aa0 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 CIPHERS | OPENSS
12ab0 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 L_INIT_ADD_ALL_D
12ac0 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a IGESTS, NULL);..
12ad0 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 BIO_new_tcl(
12ae0 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30 NULL, 0);..#if 0
12af0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 58 . /*. * X
12b00 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 XX:TODO: Remove
12b10 74 68 69 73 20 63 6f 64 65 20 61 6e 64 20 72 65 this code and re
12b20 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20 place it with a
12b30 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f 72 check. * for
12b40 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79 20 enough entropy
12b50 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 and do not try t
12b60 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e o create our own
12b70 0a 20 20 20 20 20 2a 20 74 65 72 72 69 62 6c 65 . * terrible
12b80 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a 2f entropy. */
12b90 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 . /*. * S
12ba0 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e eed the random n
12bb0 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 umber generator
12bc0 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 in the SSL libra
12bd0 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e 67 ry,. * using
12be0 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f the do/while co
12bf0 6e 73 74 72 75 63 74 20 62 65 63 61 75 73 65 20 nstruct because
12c00 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74 65 20 of the bug note
12c10 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 4f 70 in the. * Op
12c20 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68 74 74 enSSL FAQ at htt
12c30 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e p://www.openssl.
12c40 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e org/support/faq.
12c50 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20 20 20 html#USER1.
12c60 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63 72 75 *. * The cru
12c70 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c 65 6d x of the problem
12c80 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72 69 73 is that Solaris
12c90 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 7 does not have
12ca0 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f 72 a. * /dev/r
12cb0 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72 andom or /dev/ur
12cc0 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 73 6f 20 andom device so
12cd0 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 68 65 72 it cannot gather
12ce0 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20 65 enough. * e
12cf0 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 ntropy from the
12d00 52 41 4e 44 5f 73 65 65 64 28 29 20 77 68 65 6e RAND_seed() when
12d10 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65 73 TLS initializes
12d20 20 61 6e 64 20 72 65 66 75 73 65 73 0a 20 20 20 and refuses.
12d30 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 * to go furthe
12d40 72 2e 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 r. Earlier versi
12d50 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63 ons of OpenSSL c
12d60 61 72 72 69 65 64 20 6f 6e 20 72 65 67 61 72 64 arried on regard
12d70 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 less.. */.
12d80 20 20 73 72 61 6e 64 28 28 75 6e 73 69 67 6e 65 srand((unsigne
12d90 64 20 69 6e 74 29 20 74 69 6d 65 28 28 74 69 6d d int) time((tim
12da0 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 e_t *) NULL));.
12db0 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20 do {..for (i
12dc0 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b = 0; i < 16; i++
12dd0 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65 65 ) {.. rnd_see
12de0 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 d[i] = 1 + (char
12df0 29 20 28 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 ) (255.0 * rand(
12e00 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 )/(RAND_MAX+1.0)
12e10 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64 );..}..RAND_seed
12e20 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f (rnd_seed, sizeo
12e30 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20 f(rnd_seed));.
12e40 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e 44 5f } while (RAND_
12e50 73 74 61 74 75 73 28 29 20 21 3d 20 31 29 3b 0a status() != 1);.
12e60 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 #endif..#if defi
12e70 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
12e80 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
12e90 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 TCL_THREADS)..Tc
12ea0 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 l_MutexUnlock(&i
12eb0 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a nit_mx);.#endif.
12ec0 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 ..return(status)
12ed0 3b 0a 7d 0a ;.}.