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 20 20 20 rp, cmdPtr,..
19d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
19e0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
19f0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
1a00: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
1a10: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1a20: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1a30: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
1a40: 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a IntObj(depth));.
1a50: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
1a60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
1a70: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 erp, cmdPtr, Tls
1a80: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 _NewX509Obj(inte
1a90: 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 rp, cert));.
1aa0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1ab0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1ac0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
1ad0: 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 IntObj(ok));.
1ae0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
1af0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
1b00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
1b10: 77 53 74 72 69 6e 67 4f 62 6a 28 65 72 72 53 74 wStringObj(errSt
1b20: 72 20 3f 20 65 72 72 53 74 72 20 3a 20 22 22 2c r ? errStr : "",
1b30: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f -1));.. Tcl_
1b40: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
1b50: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
1b60: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
1b70: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
1b80: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 73 74 61 tePtr);.. sta
1b90: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 tePtr->flags |=
1ba0: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b TLS_TCL_CALLBACK
1bb0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 ;.. Tcl_IncrR
1bc0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
1bd0: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f . code = Tcl_
1be0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 EvalObjEx(interp
1bf0: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 , cmdPtr, TCL_EV
1c00: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 AL_GLOBAL);.
1c10: 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f if (code != TCL_
1c20: 4f 4b 29 20 7b 0a 09 2f 2a 20 49 74 20 67 6f 74 OK) {../* It got
1c30: 20 61 6e 20 65 72 72 6f 72 20 2d 20 72 65 6a 65 an error - reje
1c40: 63 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61 ct the certifica
1c50: 74 65 2e 09 09 2a 2f 0a 23 69 66 20 28 54 43 4c te...*/.#if (TCL
1c60: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d _MAJOR_VERSION =
1c70: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e = 8) && (TCL_MIN
1c80: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a OR_VERSION < 6).
1c90: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
1ca0: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 rror(interp);.#e
1cb0: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f lse..Tcl_Backgro
1cc0: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 undException(int
1cd0: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 erp, code);.#end
1ce0: 69 66 0a 09 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 if..ok = 0;.
1cf0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 75 6c 74 } else {..result
1d00: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 = Tcl_GetObjRes
1d10: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 73 74 ult(interp);..st
1d20: 72 69 6e 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 ring = Tcl_GetSt
1d30: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75 ringFromObj(resu
1d40: 6c 74 2c 20 26 6c 65 6e 67 74 68 29 3b 0a 09 2f lt, &length);../
1d50: 2a 20 41 6e 20 65 6d 70 74 79 20 72 65 73 75 6c * An empty resul
1d60: 74 20 6c 65 61 76 65 73 20 76 65 72 69 66 69 63 t leaves verific
1d70: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e ation unchanged.
1d80: 09 2a 2f 0a 09 69 66 20 28 73 74 72 69 6e 67 20 .*/..if (string
1d90: 21 3d 20 4e 55 4c 4c 20 26 26 20 6c 65 6e 67 74 != NULL && lengt
1da0: 68 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 63 6f h > 0) {.. co
1db0: 64 65 20 3d 20 54 63 6c 5f 47 65 74 49 6e 74 46 de = Tcl_GetIntF
1dc0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 romObj(interp, r
1dd0: 65 73 75 6c 74 2c 20 26 6f 6b 29 3b 0a 09 20 20 esult, &ok);..
1de0: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 if (code != TC
1df0: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c L_OK) {.#if (TCL
1e00: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d _MAJOR_VERSION =
1e10: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e = 8) && (TCL_MIN
1e20: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a OR_VERSION < 6).
1e30: 09 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
1e40: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 Error(interp);.#
1e50: 65 6c 73 65 0a 09 09 54 63 6c 5f 42 61 63 6b 67 else...Tcl_Backg
1e60: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 roundException(i
1e70: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 nterp, code);.#e
1e80: 6e 64 69 66 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 ndif...ok = 0;..
1e90: 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 }..}. }.
1ea0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
1eb0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 unt(cmdPtr);..
1ec0: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 statePtr->flag
1ed0: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 s &= ~(TLS_TCL_C
1ee0: 41 4c 4c 42 41 43 4b 29 3b 0a 0a 20 20 20 20 54 ALLBACK);.. T
1ef0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
1f00: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
1f10: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 );. Tcl_Relea
1f20: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
1f30: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 interp);. ret
1f40: 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 urn(ok);./* By d
1f50: 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 efault, leave ve
1f60: 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 rification uncha
1f70: 6e 67 65 64 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a nged..*/.}.../*.
1f80: 20 2a 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 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
1fd0: 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 Error --. *. *.C
1fe0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 alls callback wi
1ff0: 74 68 20 24 66 64 20 61 6e 64 20 24 6d 73 67 20 th $fd and $msg
2000: 2d 20 73 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 - so the callbac
2010: 6b 20 63 61 6e 20 64 65 63 69 64 65 0a 20 2a 09 k can decide. *.
2020: 77 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 what to do with
2030: 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 errors.. *. * Si
2040: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 de effects:. *.T
2050: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 he err field of
2060: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 the currently op
2070: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73 erative State is
2080: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 set. *. to a s
2090: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 tring describing
20a0: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 the SSL negotia
20b0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 tion failure rea
20c0: 73 6f 6e 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d son. *----------
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 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
2110: 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 id.Tls_Error(Sta
2120: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 te *statePtr, ch
2130: 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 ar *msg) {. T
2140: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
2150: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
2160: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
2170: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
2180: 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 nt code;.. dp
2190: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
21a0: 0a 0a 20 20 20 20 69 66 20 28 6d 73 67 20 26 26 .. if (msg &&
21b0: 20 2a 6d 73 67 29 20 7b 0a 09 54 63 6c 5f 53 65 *msg) {..Tcl_Se
21c0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
21d0: 70 2c 20 22 53 53 4c 22 2c 20 6d 73 67 2c 20 28 p, "SSL", msg, (
21e0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 char *)NULL);.
21f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6d 73 67 20 } else {..msg
2200: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
2210: 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 romObj(Tcl_GetOb
2220: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c jResult(interp),
2230: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 NULL);. }.
2240: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 statePtr->err
2250: 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 69 66 20 28 = msg;.. if (
2260: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
2270: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 ck == (Tcl_Obj*)
2280: 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 NULL) {..char bu
2290: 66 5b 42 55 46 53 49 5a 5d 3b 0a 09 73 70 72 69 f[BUFSIZ];..spri
22a0: 6e 74 66 28 62 75 66 2c 20 22 53 53 4c 20 63 68 ntf(buf, "SSL ch
22b0: 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 3a 20 65 72 annel \"%s\": er
22c0: 72 6f 72 3a 20 25 73 22 2c 0a 09 20 20 20 20 54 ror: %s",.. T
22d0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
22e0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
22f0: 29 2c 20 6d 73 67 29 3b 0a 09 54 63 6c 5f 53 65 ), msg);..Tcl_Se
2300: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
2310: 62 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c buf, TCL_VOLATIL
2320: 45 29 3b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a E);.#if (TCL_MAJ
2330: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
2340: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
2350: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
2360: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
2370: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
2380: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
2390: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
23a0: 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 23 65 6e TCL_ERROR);.#en
23b0: 64 69 66 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 dif..return;.
23c0: 20 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 }. cmdPtr =
23d0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
23e0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
23f0: 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c ack);.. Tcl_L
2400: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2410: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2420: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
2430: 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 gObj("error", -1
2440: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2450: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2460: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2470: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
2480: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
2490: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
24a0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b tr->self), -1));
24b0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
24c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
24d0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
24e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
24f0: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 sg, -1));.. T
2500: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
2510: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
2520: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 ;. Tcl_Preser
2530: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
2540: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
2550: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
2560: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
2570: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
2580: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
2590: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
25a0: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
25b0: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
25c0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
25d0: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
25e0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
25f0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
2600: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
2610: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
2620: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
2630: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
2640: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
2650: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
2660: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
2670: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 Tcl_Release((C
2680: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
2690: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 Ptr);. Tcl_Re
26a0: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
26b0: 61 29 20 69 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a a) interp);.}...
26c0: 2f 2a 0a 20 2a 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 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b --------. *. * K
2710: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d eyLogCallback --
2720: 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 63 . *. *.Write rec
2730: 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 20 74 eived key data t
2740: 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 o log file.. *.
2750: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
2760: 20 2a 09 6e 6f 6e 65 0a 20 2a 2d 2d 2d 2d 2d 2d *.none. *------
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 2d 2d 2d 2d 0a 20 2a -------------. *
27b0: 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c /.void KeyLogCal
27c0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
27d0: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 *ssl, const char
27e0: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 *line) {. ch
27f0: 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 ar *str = getenv
2800: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b (SSLKEYLOGFILE);
2810: 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 20 . FILE *fd;.
2820: 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66 if (str) {..f
2830: 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 d = fopen(str, "
2840: 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 a");..fprintf(fd
2850: 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a , "%s\n",line);.
2860: 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 .fclose(fd);.
2870: 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 0a ---------------.
28c0: 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 43 61 *. * PasswordCa
28d0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 llback --. *. *.
28e0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 Called when a pa
28f0: 73 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 ssword is needed
2900: 20 74 6f 20 75 6e 70 61 63 6b 20 52 53 41 20 61 to unpack RSA a
2910: 6e 64 20 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 nd PEM keys.. *.
2920: 45 76 61 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 Evals any bound
2930: 70 61 73 73 77 6f 72 64 20 73 63 72 69 70 74 20 password script
2940: 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 and returns the
2950: 72 65 73 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 result as. *.the
2960: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 password string
2970: 2e 0a 20 2a 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 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
29c0: 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 ic int.PasswordC
29d0: 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 allback(char *bu
29e0: 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 f, int size, int
29f0: 20 76 65 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 verify, void *u
2a00: 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 data) {. Stat
2a10: 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 e *statePtr.= (S
2a20: 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 tate *) udata;.
2a30: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
2a40: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
2a50: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
2a60: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
2a70: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 int code;..
2a80: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
2a90: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
2aa0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
2ab0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 == NULL) {..if
2ac0: 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 (Tcl_EvalEx(inte
2ad0: 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f rp, "tls::passwo
2ae0: 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 rd", -1, TCL_EVA
2af0: 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c L_GLOBAL) == TCL
2b00: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 _OK) {.. char
2b10: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 *ret = (char *)
2b20: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 Tcl_GetStringRe
2b30: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 sult(interp);..
2b40: 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 strncpy(buf,
2b50: 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 ret, (size_t) si
2b60: 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e ze);.. return
2b70: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 (int)strlen(ret
2b80: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 );..} else {..
2b90: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a return -1;..}.
2ba0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 }.. cmdPt
2bb0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
2bc0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 eObj(statePtr->p
2bd0: 61 73 73 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54 assword);.. T
2be0: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
2bf0: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
2c00: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 ;. Tcl_Preser
2c10: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
2c20: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
2c30: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
2c40: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
2c50: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
2c60: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
2c70: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
2c80: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
2c90: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
2ca0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
2cb0: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
2cc0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
2cd0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
2ce0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
2cf0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
2d00: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
2d10: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
2d20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
2d30: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
2d40: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
2d50: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
2d60: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
2d70: 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 ePtr);.. if (
2d80: 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 code == TCL_OK)
2d90: 7b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 {..char *ret = (
2da0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 char *) Tcl_GetS
2db0: 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 tringResult(inte
2dc0: 72 70 29 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e rp);..if (strlen
2dd0: 28 72 65 74 29 20 3c 20 73 69 7a 65 20 2d 20 31 (ret) < size - 1
2de0: 29 20 7b 0a 09 20 20 20 20 73 74 72 6e 63 70 79 ) {.. strncpy
2df0: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 (buf, ret, (size
2e00: 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 _t) size);..
2e10: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
2e20: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
2e30: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 ;.. return (i
2e40: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a nt)strlen(ret);.
2e50: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c .}. }. Tcl
2e60: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
2e70: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
2e80: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76 return -1;..v
2e90: 65 72 69 66 79 20 3d 20 76 65 72 69 66 79 3b 0a erify = verify;.
2ea0: 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 0a 20 2a 0a ------------. *.
2ef0: 20 2a 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 * SessionCallba
2f00: 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d ck for Clients -
2f10: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 -. *. *.Called w
2f20: 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f hen a new sessio
2f30: 6e 20 74 69 63 6b 65 74 20 68 61 73 20 62 65 65 n ticket has bee
2f40: 6e 20 72 65 63 65 69 76 65 64 2e 20 49 6e 20 54 n received. In T
2f50: 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d LS 1.3. *.this m
2f60: 61 79 20 62 65 20 72 65 63 65 69 76 65 64 20 6d ay be received m
2f70: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 ultiple times af
2f80: 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b ter the handshak
2f90: 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 e. For. *.earlie
2fa0: 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 r versions, this
2fb0: 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 will be receive
2fc0: 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e d during the han
2fd0: 64 73 68 61 6b 65 2e 0a 20 2a 0a 20 2a 20 52 65 dshake.. *. * Re
2fe0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
2ff0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
3000: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
3010: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
3020: 29 0a 20 2a 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 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
3070: 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 ic int.SessionCa
3080: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
3090: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 *ssl, SSL_SESSI
30a0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 ON *session) {.
30b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
30c0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr = (State*)SSL
30d0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 _get_app_data((S
30e0: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 SL *)ssl);. T
30f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
3100: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
3110: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
3120: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 j *cmdPtr;. c
3130: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
3140: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 ar *ticket;.
3150: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
3160: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b har *session_id;
3170: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 . int len;.
3180: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 int code;.
3190: 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 0a 20 20 size_t len2;..
31a0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
31b0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
31c0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
31d0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
31e0: 4c 4c 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 0a LL)..return 0;..
31f0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
3200: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
3210: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
3220: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
3230: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3240: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3250: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3260: 6a 28 20 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 j( "session", -1
3270: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 ));.. /* Sess
3280: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 ion id */. se
3290: 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 ssion_id = SSL_S
32a0: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 ESSION_get0_id_c
32b0: 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 ontext(session,
32c0: 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c &len);. Tcl_L
32d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
32e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
32f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
3300: 67 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c gObj(session_id,
3310: 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 len));.. /*
3320: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a Session ticket *
3330: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f /. SSL_SESSIO
3340: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 N_get0_ticket(se
3350: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
3360: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f &len2);. Tcl_
3370: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3380: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3390: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
33a0: 6e 67 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 ngObj(ticket, (i
33b0: 6e 74 29 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 nt)len2));..
33c0: 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 /* Lifetime - nu
33d0: 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 mber of seconds
33e0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f */. Tcl_ListO
33f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3400: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
3410: 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 .Tcl_NewLongObj(
3420: 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 (long) SSL_SESSI
3430: 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 ON_get_ticket_li
3440: 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 fetime_hint(sess
3450: 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 54 63 6c ion)));.. Tcl
3460: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
3470: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
3480: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
3490: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
34a0: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 atePtr);.. Tc
34b0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
34c0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 mdPtr);. code
34d0: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 = Tcl_EvalObjEx
34e0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
34f0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
3500: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 );. if (code
3510: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 != TCL_OK) {.#if
3520: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 (TCL_MAJOR_VERS
3530: 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 ION == 8) && (TC
3540: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MINOR_VERSION
3550: 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 < 6)..Tcl_Backgr
3560: 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 oundError(interp
3570: 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 );.#else..Tcl_Ba
3580: 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f ckgroundExceptio
3590: 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b n(interp, code);
35a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 .#endif. }.
35b0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
35c0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 nt(cmdPtr);..
35d0: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c Tcl_Release((Cl
35e0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
35f0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c tr);. Tcl_Rel
3600: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 ease((ClientData
3610: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 ) interp);. r
3620: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0c 0a 2f 2a 2a eturn 1;.}.../**
3630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
3640: 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 **/./* Commands
3650: 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a */./****
3660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
3670: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d /../*. *--------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
36c0: 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 * CiphersObjCmd
36d0: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c -- list availabl
36e0: 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 e ciphers. *. *.
36f0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
3700: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
3710: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 cess the "tls::c
3720: 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a iphers" command.
3730: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c *.to list avail
3740: 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 able ciphers, ba
3750: 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f sed upon protoco
3760: 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 l selected.. *.
3770: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
3780: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
3790: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 ult list.. *. *
37a0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
37b0: 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 .constructs and
37c0: 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e destroys SSL con
37d0: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a text (CTX). *. *
37e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3820: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 ---. */.static c
3830: 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f onst char *proto
3840: 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c cols[] = {.."ssl
3850: 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 2", "ssl3", "tls
3860: 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 1", "tls1.1", "t
3870: 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 ls1.2", "tls1.3"
3880: 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 , NULL.};.enum p
3890: 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c rotocol {. TL
38a0: 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 S_SSL2, TLS_SSL3
38b0: 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f , TLS_TLS1, TLS_
38c0: 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 TLS1_1, TLS_TLS1
38d0: 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 _2, TLS_TLS1_3,
38e0: 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 TLS_NONE.};..sta
38f0: 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f tic int.CiphersO
3900: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
3910: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
3920: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
3930: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
3940: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
3950: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ) {. Tcl_Obj
3960: 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a *objPtr = NULL;.
3970: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 SSL_CTX *ctx
3980: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c = NULL;. SSL
3990: 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *ssl = NULL;.
39a0: 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 STACK_OF(SSL_C
39b0: 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 IPHER) *sk;.
39c0: 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 char *cp, buf[BU
39d0: 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 FSIZ];. int i
39e0: 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 ndex, verbose =
39f0: 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 65 64 0, use_supported
3a00: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e = 0;.. dprin
3a10: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
3a20: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 if ((objc < 2
3a30: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 ) || (objc > 4))
3a40: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
3a50: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
3a60: 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 objv, "protocol
3a70: 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f ?verbose? ?suppo
3a80: 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e rted?");..return
3a90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
3aa0: 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 }. if (Tcl_Ge
3ab0: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e tIndexFromObj(in
3ac0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 terp, objv[1], p
3ad0: 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f rotocols, "proto
3ae0: 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 col", 0, &index)
3af0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
3b00: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
3b10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
3b20: 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c objc > 2) && Tcl
3b30: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f _GetBooleanFromO
3b40: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
3b50: 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d 2], &verbose) !=
3b60: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
3b70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
3b80: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a }. if ((obj
3b90: 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65 c > 3) && Tcl_Ge
3ba0: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 tBooleanFromObj(
3bb0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c interp, objv[3],
3bc0: 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 &use_supported)
3bd0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
3be0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
3bf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 . }.. swit
3c00: 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 ch ((enum protoc
3c10: 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 ol)index) {..cas
3c20: 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 e TLS_SSL2:.#if
3c30: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
3c40: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 NUMBER >= 0x1010
3c50: 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 0000L || defined
3c60: 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 (NO_SSL2) || def
3c70: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
3c80: 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 SSL2).. Tcl_A
3c90: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
3ca0: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e rp, protocols[in
3cb0: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f dex], ": protoco
3cc0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
3cd0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 , NULL);.. re
3ce0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
3cf0: 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d #else.. ctx =
3d00: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c SSL_CTX_new(SSL
3d10: 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 v2_method()); br
3d20: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 eak;.#endif..cas
3d30: 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 e TLS_SSL3:.#if
3d40: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
3d50: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
3d60: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 SSL_NO_SSL3) ||
3d70: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
3d80: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a NO_SSL3_METHOD).
3d90: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
3da0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
3db0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
3dc0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
3dd0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
3de0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
3df0: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
3e00: 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 . ctx = SSL_C
3e10: 54 58 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65 74 TX_new(SSLv3_met
3e20: 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 hod()); break;.#
3e30: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
3e40: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 TLS1:.#if define
3e50: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 d(NO_TLS1) || de
3e60: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
3e70: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 _TLS1) || define
3e80: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
3e90: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 1_METHOD).. T
3ea0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
3eb0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
3ec0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
3ed0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
3ee0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
3ef0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
3f00: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 OR;.#else.. c
3f10: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
3f20: 28 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 29 (TLSv1_method())
3f30: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
3f40: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 .case TLS_TLS1_1
3f50: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f :.#if defined(NO
3f60: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
3f70: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
3f80: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_1) || define
3f90: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
3fa0: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 1_1_METHOD)..
3fb0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
3fc0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
3fd0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
3fe0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
3ff0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
4000: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
4010: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 RROR;.#else..
4020: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e ctx = SSL_CTX_n
4030: 65 77 28 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f ew(TLSv1_1_metho
4040: 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e d()); break;.#en
4050: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c dif..case TLS_TL
4060: 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 S1_2:.#if define
4070: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 d(NO_TLS1_2) ||
4080: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
4090: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 NO_TLS1_2) || de
40a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
40b0: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a _TLS1_2_METHOD).
40c0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
40d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
40e0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
40f0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
4100: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
4110: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
4120: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
4130: 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 . ctx = SSL_C
4140: 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 32 5f 6d TX_new(TLSv1_2_m
4150: 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b ethod()); break;
4160: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
4170: 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 S_TLS1_3:.#if de
4180: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
4190: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
41a0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 SSL_NO_TLS1_3)..
41b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
41c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
41d0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
41e0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
41f0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
4200: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
4210: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
4220: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 ctx = SSL_CT
4230: 58 5f 6e 65 77 28 54 4c 53 5f 6d 65 74 68 6f 64 X_new(TLS_method
4240: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 ());.
4250: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e SSL_CTX_set_min
4260: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
4270: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
4280: 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 ON);.. SSL_CT
4290: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f X_set_max_proto_
42a0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 version(ctx, TLS
42b0: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 1_3_VERSION);..
42c0: 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 break;.#endif
42d0: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 ..default:..
42e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 break;. }.
42f0: 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c if (ctx == NULL
4300: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
4310: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 esult(interp, RE
4320: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 ASON(), NULL);..
4330: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
4340: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c ;. }.. ssl
4350: 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b = SSL_new(ctx);
4360: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 . if (ssl ==
4370: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
4380: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
4390: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c , REASON(), NULL
43a0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
43b0: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 (ctx);..return T
43c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
43d0: 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 . /* Use list
43e0: 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f and order as wo
43f0: 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61 uld be sent in a
4400: 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 ClientHello or
4410: 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69 all available ci
4420: 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 phers */. if
4430: 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 (use_supported)
4440: 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 {..sk = SSL_get1
4450: 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65 _supported_ciphe
4460: 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 rs(ssl);. } e
4470: 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f lse {..sk = SSL_
4480: 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29 get_ciphers(ssl)
4490: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
44a0: 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 (sk != NULL) {..
44b0: 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a if (!verbose) {.
44c0: 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 . objPtr = Tc
44d0: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
44e0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 NULL);.. for
44f0: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 (int i = 0; i <
4500: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 sk_SSL_CIPHER_nu
4510: 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 m(sk); i++) {...
4520: 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 const SSL_CIPHER
4530: 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 *c = sk_SSL_CIP
4540: 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 HER_value(sk, i)
4550: 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c ;...if (c == NUL
4560: 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 L) continue;....
4570: 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f /* cipher name o
4580: 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 r (NONE) */...cp
4590: 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 = SSL_CIPHER_ge
45a0: 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 t_name(c);...if
45b0: 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 (cp == NULL) bre
45c0: 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 ak;...Tcl_ListOb
45d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
45e0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
45f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
4600: 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d cp, -1));.. }
4610: 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ...} else {..
4620: 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 objPtr = Tcl_Ne
4630: 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 wStringObj("",0)
4640: 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 ;.. for (int
4650: 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 i = 0; i < sk_SS
4660: 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 L_CIPHER_num(sk)
4670: 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 ; i++) {...const
4680: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d SSL_CIPHER *c =
4690: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 sk_SSL_CIPHER_v
46a0: 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 alue(sk, i);...i
46b0: 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f f (c == NULL) co
46c0: 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 ntinue;..../* te
46d0: 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f xtual descriptio
46e0: 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 n of the cipher
46f0: 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 */...if (SSL_CIP
4700: 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 HER_description(
4710: 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 c, buf, sizeof(b
4720: 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a uf)) != NULL) {.
4730: 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
4740: 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 ToObj(objPtr, bu
4750: 66 2c 20 28 69 6e 74 29 20 73 74 72 6c 65 6e 28 f, (int) strlen(
4760: 62 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 buf));...} else
4770: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {... Tcl_Appe
4780: 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 ndToObj(objPtr,
4790: 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b "UNKNOWN\n", 8);
47a0: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 ...}.. }..}..
47b0: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 if (use_supporte
47c0: 64 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c d) {.. sk_SSL
47d0: 5f 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 _CIPHER_free(sk)
47e0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 ;..}. }. S
47f0: 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 SL_free(ssl);.
4800: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
4810: 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 tx);.. Tcl_Se
4820: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
4830: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
4840: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
4850: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
4860: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
4870: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48b0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 -----. *. * Prot
48c0: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c ocolsObjCmd -- l
48d0: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 ist available pr
48e0: 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 otocols. *. *.Th
48f0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
4900: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
4910: 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f ss the "tls::pro
4920: 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a tocols" command.
4930: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c *.to list avail
4940: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a able protocols..
4950: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
4960: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
4970: 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a result list.. *
4980: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
4990: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d :. *.none. *. *-
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49e0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
49f0: 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d t.ProtocolsObjCm
4a00: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
4a10: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
4a20: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
4a30: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
4a40: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
4a50: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
4a60: 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 Ptr;.. dprint
4a70: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
4a80: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 if (objc != 1)
4a90: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
4aa0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
4ab0: 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 objv, "");..retu
4ac0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
4ad0: 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 }.. objPtr
4ae0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
4af0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 (0, NULL);..#if
4b00: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
4b10: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
4b20: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 000L && !defined
4b30: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 (NO_SSL2) && !de
4b40: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
4b50: 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c _SSL2). Tcl_L
4b60: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4b70: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
4b80: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
4b90: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
4ba0: 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a LS_SSL2], -1));.
4bb0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
4bc0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 ned(NO_SSL3) &&
4bd0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
4be0: 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 54 63 _NO_SSL3). Tc
4bf0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4c00: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
4c10: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
4c20: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
4c30: 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 s[TLS_SSL3], -1)
4c40: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
4c50: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
4c60: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
4c70: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 SSL_NO_TLS1).
4c80: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4c90: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4ca0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
4cb0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
4cc0: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 cols[TLS_TLS1],
4cd0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 -1));.#endif.#if
4ce0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
4cf0: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
4d00: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
4d10: 5f 31 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 _1). Tcl_List
4d20: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
4d30: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
4d40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
4d50: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
4d60: 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 TLS1_1], -1));.#
4d70: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
4d80: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 ed(NO_TLS1_2) &&
4d90: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
4da0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 L_NO_TLS1_2).
4db0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4dc0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4dd0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
4de0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
4df0: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d cols[TLS_TLS1_2]
4e00: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
4e10: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
4e20: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
4e30: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
4e40: 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 S1_3). Tcl_Li
4e50: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4e60: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
4e70: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4e80: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
4e90: 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b S_TLS1_3], -1));
4ea0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c .#endif.. Tcl
4eb0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
4ec0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 terp, objPtr);.
4ed0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
4ee0: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
4ef0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
4f00: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
4f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 --------. *. * H
4f50: 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d andshakeObjCmd -
4f60: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d -. *. *.This com
4f70: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 mand is used to
4f80: 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20 74 verify whether t
4f90: 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 he handshake is
4fa0: 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e complete. *.or n
4fb0: 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ot.. *. * Result
4fc0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
4fd0: 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d Tcl result. 1 m
4fe0: 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 eans handshake c
4ff0: 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 omplete, 0 means
5000: 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 pending.. *. *
5010: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
5020: 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e .May force SSL n
5030: 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 egotiation to ta
5040: 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d ke place.. *. *-
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5090: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
50a0: 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d t HandshakeObjCm
50b0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
50c0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
50d0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
50e0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
50f0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
5100: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
5110: 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 chan; /*
5120: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
5130: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f et a mode on. */
5140: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
5150: 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 ePtr; /*
5160: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 client state for
5170: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 ssl socket */.
5180: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 const char *e
5190: 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 rrStr = NULL;.
51a0: 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 int ret = 1;.
51b0: 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a int err = 0;.
51c0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
51d0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
51e0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
51f0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
5200: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
5210: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
5220: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
5230: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e . }.. chan
5240: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
5250: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
5260: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
5270: 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e bjv[1], NULL), N
5280: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 ULL);. if (ch
5290: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
52a0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
52b0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
52c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
52d0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
52e0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
52f0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
5300: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
5310: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
5320: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
5330: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
5340: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
5350: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
5360: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
5370: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
5380: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
5390: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 nnelName(chan),
53a0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
53b0: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a hannel", NULL);.
53c0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
53d0: 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 R);. }. st
53e0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
53f0: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c *)Tcl_GetChannel
5400: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
5410: 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 n);.. dprintf
5420: 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 ("Calling Tls_Wa
5430: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a itForConnect");.
5440: 20 20 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 ret = Tls_Wa
5450: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 itForConnect(sta
5460: 74 65 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b tePtr, &err, 1);
5470: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c . dprintf("Tl
5480: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
5490: 20 72 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 returned: %i",
54a0: 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 ret);.. if (r
54b0: 65 74 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 et < 0 && ((stat
54c0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c ePtr->flags & TL
54d0: 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 S_TCL_ASYNC) &&
54e0: 28 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 (err == EAGAIN))
54f0: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 ) {..dprintf("As
5500: 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 ync set and err
5510: 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 = EAGAIN");..ret
5520: 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 = 0;. } else
5530: 20 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a if (ret < 0) {.
5540: 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 .errStr = stateP
5550: 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 tr->err;..Tcl_Re
5560: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 setResult(interp
5570: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f );..Tcl_SetErrno
5580: 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 (err);...if (!er
5590: 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 rStr || (*errStr
55a0: 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 65 == 0)) {.. e
55b0: 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 rrStr = Tcl_Posi
55c0: 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a xError(interp);.
55d0: 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 .}...Tcl_AppendR
55e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 esult(interp, "h
55f0: 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a andshake failed:
5600: 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68 61 ", errStr, (cha
5610: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 r *) NULL);..dpr
5620: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 intf("Returning
5630: 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 TCL_ERROR with h
5640: 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a andshake failed:
5650: 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 %s", errStr);..
5660: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
5670: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
5680: 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b .if (err != 0) {
5690: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 .. dprintf("G
56a0: 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 ot an error with
56b0: 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e a completed han
56c0: 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 dshake: err = %i
56d0: 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 ", err);..}..ret
56e0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 = 1;. }..
56f0: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e dprintf("Return
5700: 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 ing TCL_OK with
5710: 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 data \"%i\"", re
5720: 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f t);. Tcl_SetO
5730: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
5740: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 Tcl_NewIntObj(r
5750: 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e et));. return
5760: 28 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e (TCL_OK);..clien
5770: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
5780: 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ta;.}../*. *----
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
57d0: 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 *. * ImportObjC
57e0: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 md --. *. *.This
57f0: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
5800: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 voked to process
5810: 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 the "ssl" comma
5820: 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c nd. *. *.The ssl
5830: 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 command pushes
5840: 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c SSL over a (newl
5850: 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 y connected) tcp
5860: 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 socket. *. * Re
5870: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
5880: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
5890: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
58a0: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 cts:. *.May modi
58b0: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 fy the behavior
58c0: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c of an IO channel
58d0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
58e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
5920: 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 tatic int.Import
5930: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
5940: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
5950: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
5960: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
5970: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
5980: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
5990: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 nnel chan;../* T
59a0: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 he channel to se
59b0: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a t a mode on. */.
59c0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
59d0: 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 Ptr;../* client
59e0: 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f state for ssl so
59f0: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f cket */. SSL_
5a00: 43 54 58 20 2a 63 74 78 09 20 20 20 20 20 20 20 CTX *ctx.
5a10: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
5a20: 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 20 20 20 _Obj *script.
5a30: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
5a40: 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f Tcl_Obj *passwo
5a50: 72 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c rd. = NUL
5a60: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 L;. Tcl_DStri
5a70: 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 ng upperChannelT
5a80: 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 ranslation, uppe
5a90: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
5aa0: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e , upperChannelEn
5ab0: 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 coding, upperCha
5ac0: 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 nnelEOFChar;.
5ad0: 20 69 6e 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 int idx, len;.
5ae0: 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09 20 20 int flags..
5af0: 20 20 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f = TLS_TCL_
5b00: 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 INIT;. int se
5b10: 72 76 65 72 09 09 20 20 20 20 20 20 20 20 3d 20 rver.. =
5b20: 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 0;./* is connect
5b30: 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 ion incoming or
5b40: 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 outgoing? */.
5b50: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 char *keyfile.
5b60: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
5b70: 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c char *certfil
5b80: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
5b90: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ;. unsigned c
5ba0: 68 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c har *key .= NUL
5bb0: 4c 3b 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c L;. int key_l
5bc0: 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 en
5bd0: 20 20 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 = 0;. unsi
5be0: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 20 gned char *cert
5bf0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
5c00: 20 20 20 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e int cert_len
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5c20: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 = 0;. char *c
5c30: 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d iphers. =
5c40: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
5c50: 2a 63 69 70 68 65 72 73 75 69 74 65 73 09 20 20 *ciphersuites.
5c60: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
5c70: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 20 char *CAfile.
5c80: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
5c90: 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 09 09 char *CAdir..
5ca0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
5cb0: 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 char *DHpara
5cc0: 6d 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c ms. = NUL
5cd0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 L;. char *mod
5ce0: 65 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 el.. = NU
5cf0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 LL;. char *se
5d00: 72 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20 20 rvername.
5d10: 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 = NULL;./* host
5d20: 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20 name for Server
5d30: 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 Name Indication
5d40: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 */. const uns
5d50: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 igned char *sess
5d60: 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 ion_id = NULL;.
5d70: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e Tcl_Obj *alpn
5d80: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e ..= NULL;. in
5d90: 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 t ssl2 = 0, ssl3
5da0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c = 0;. int tl
5db0: 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d s1 = 1, tls1_1 =
5dc0: 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 1, tls1_2 = 1,
5dd0: 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 tls1_3 = 1;.
5de0: 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c int proto = 0, l
5df0: 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 evel = -1;. i
5e00: 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 nt verify = 0, r
5e10: 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 equire = 0, requ
5e20: 65 73 74 20 3d 20 31 3b 0a 0a 20 20 20 20 64 70 est = 1;.. dp
5e30: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
5e40: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
5e50: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
5e60: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
5e70: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
5e80: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
5e90: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 ned(NO_SSL2) &&
5ea0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
5eb0: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 && defined(NO_T
5ec0: 4c 53 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 LS1) && defined(
5ed0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 NO_TLS1_1) && de
5ee0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
5ef0: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 && defined(NO_T
5f00: 4c 53 31 5f 33 29 0a 20 20 20 20 73 73 6c 32 20 LS1_3). ssl2
5f10: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 1;.#endif.#if
5f20: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
5f30: 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 _NO_SSL3) && !de
5f40: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
5f50: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c & defined(NO_SSL
5f60: 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 2) && defined(NO
5f70: 5f 54 4c 53 31 29 20 26 26 20 64 65 66 69 6e 65 _TLS1) && define
5f80: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 d(NO_TLS1_1) &&
5f90: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
5fa0: 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 2) && defined(NO
5fb0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 73 73 6c _TLS1_3). ssl
5fc0: 33 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 3 = 1;.#endif.#i
5fd0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
5fe0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
5ff0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 ENSSL_NO_TLS1).
6000: 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e tls1 = 0;.#en
6010: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
6020: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
6030: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
6040: 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 _TLS1_1). tls
6050: 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 1_1 = 0;.#endif.
6060: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
6070: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
6080: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
6090: 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 1_2). tls1_2
60a0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 0;.#endif.#if
60b0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
60c0: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
60d0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
60e0: 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b . tls1_3 = 0;
60f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 .#endif.. if
6100: 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 (objc < 2) {..Tc
6110: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
6120: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
6130: 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e "channel ?option
6140: 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 s?");..return TC
6150: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
6160: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
6170: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
6180: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 , Tcl_GetStringF
6190: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 romObj(objv[1],
61a0: 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 NULL), NULL);.
61b0: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 if (chan == (T
61c0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
61d0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
61e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
61f0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 /* Make sure t
6200: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
6210: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
6220: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 */. chan = T
6230: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
6240: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 (chan);.. for
6250: 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c (idx = 2; idx <
6260: 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a objc; idx++) {.
6270: 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c .char *opt = Tcl
6280: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
6290: 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c j(objv[idx], NUL
62a0: 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d L);...if (opt[0]
62b0: 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 != '-').. br
62c0: 65 61 6b 3b 0a 0a 09 4f 50 54 53 54 52 28 22 2d eak;...OPTSTR("-
62d0: 63 61 64 69 72 22 2c 20 43 41 64 69 72 29 3b 0a cadir", CAdir);.
62e0: 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 .OPTSTR("-cafile
62f0: 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 ", CAfile);..OPT
6300: 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c STR("-certfile",
6310: 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 certfile);..OPT
6320: 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63 STR("-cipher", c
6330: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 iphers);..OPTSTR
6340: 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70 ("-ciphers", cip
6350: 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 hers);..OPTSTR("
6360: 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 20 -ciphersuites",
6370: 63 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09 ciphersuites);..
6380: 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 OPTOBJ("-command
6390: 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 ", script);..OPT
63a0: 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c STR("-dhparams",
63b0: 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 DHparams);..OPT
63c0: 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 STR("-keyfile",
63d0: 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 keyfile);..OPTST
63e0: 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 R("-model", mode
63f0: 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 l);..OPTOBJ("-pa
6400: 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 ssword", passwor
6410: 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 d);..OPTBOOL("-r
6420: 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 equire", require
6430: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 );..OPTBOOL("-re
6440: 71 75 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 quest", request)
6450: 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 ;..OPTINT("-secu
6460: 72 69 74 79 6c 65 76 65 6c 22 2c 20 6c 65 76 65 ritylevel", leve
6470: 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 l);..OPTBOOL("-s
6480: 65 72 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b erver", server);
6490: 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 ..OPTSTR("-serve
64a0: 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 rname", serverna
64b0: 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 me);..OPTSTR("-s
64c0: 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 ession_id", sess
64d0: 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 4f 42 4a ion_id);..OPTOBJ
64e0: 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b ("-alpn", alpn);
64f0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 ..OPTBOOL("-ssl2
6500: 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f ", ssl2);..OPTBO
6510: 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 OL("-ssl3", ssl3
6520: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
6530: 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 s1", tls1);..OPT
6540: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 BOOL("-tls1.1",
6550: 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f tls1_1);..OPTBOO
6560: 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 L("-tls1.2", tls
6570: 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 1_2);..OPTBOOL("
6580: 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 -tls1.3", tls1_3
6590: 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 );..OPTBYTE("-ce
65a0: 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f rt", cert, cert_
65b0: 6c 65 6e 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 len);..OPTBYTE("
65c0: 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f -key", key, key_
65d0: 6c 65 6e 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 len);...OPTBAD("
65e0: 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c option", "-alpn,
65f0: 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 -cadir, -cafile
6600: 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 , -cert, -certfi
6610: 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 le, -cipher, -ci
6620: 70 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d phersuites, -com
6630: 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c mand, -dhparams,
6640: 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c -key, -keyfile,
6650: 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f -model, -passwo
6660: 72 64 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 72 rd, -require, -r
6670: 65 71 75 65 73 74 2c 20 2d 73 65 63 75 72 69 74 equest, -securit
6680: 79 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c ylevel, -server,
6690: 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 -servername, -s
66a0: 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 ession_id, -ssl2
66b0: 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 , -ssl3, -tls1,
66c0: 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 -tls1.1, -tls1.2
66d0: 2c 20 6f 72 20 2d 74 6c 73 31 2e 33 22 29 3b 0a , or -tls1.3");.
66e0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
66f0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
6700: 20 28 72 65 71 75 65 73 74 29 09 20 20 20 20 76 (request). v
6710: 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 erify |= SSL_VER
6720: 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 IFY_CLIENT_ONCE
6730: 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 | SSL_VERIFY_PEE
6740: 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 R;. if (reque
6750: 73 74 20 26 26 20 72 65 71 75 69 72 65 29 20 76 st && require) v
6760: 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 erify |= SSL_VER
6770: 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 IFY_FAIL_IF_NO_P
6780: 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 EER_CERT;. if
6790: 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 76 (verify == 0).v
67a0: 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 erify = SSL_VERI
67b0: 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 FY_NONE;.. pr
67c0: 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 oto |= (ssl2 ? T
67d0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 LS_PROTO_SSL2 :
67e0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
67f0: 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f (ssl3 ? TLS_PRO
6800: 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 TO_SSL3 : 0);.
6810: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
6820: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
6830: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 1 : 0);. prot
6840: 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 o |= (tls1_1 ? T
6850: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 LS_PROTO_TLS1_1
6860: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
6870: 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 |= (tls1_2 ? TLS
6880: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 _PROTO_TLS1_2 :
6890: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
68a0: 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 (tls1_3 ? TLS_P
68b0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 ROTO_TLS1_3 : 0)
68c0: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 ;.. /* reset
68d0: 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b to NULL if blank
68e0: 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 string provided
68f0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 */. if (cert
6900: 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 && !*cert)..
6910: 20 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20 cert.
6920: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
6930: 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 (key && !*key).
6940: 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 . key.
6950: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
6960: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 if (certfile &&
6970: 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 !*certfile)
6980: 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 certfile.=
6990: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 NULL;. if (ke
69a0: 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 yfile && !*keyfi
69b0: 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 le)..keyfile.
69c0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
69d0: 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20 if (ciphers &&
69e0: 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20 !*ciphers).
69f0: 20 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20 ciphers.
6a00: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
6a10: 66 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20 f (ciphersuites
6a20: 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 && !*ciphersuite
6a30: 73 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20 s) ciphersuites
6a40: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
6a50: 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 f (CAfile && !*C
6a60: 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 Afile). C
6a70: 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 Afile. =
6a80: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 NULL;. if (CA
6a90: 64 69 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 dir && !*CAdir).
6aa0: 20 20 20 20 20 20 20 20 43 41 64 69 72 09 20 20 CAdir.
6ab0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
6ac0: 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 if (DHparams &
6ad0: 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 & !*DHparams).
6ae0: 20 20 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 DHparams
6af0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 = NULL;..
6b00: 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 /* new SSL st
6b10: 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 ate */. state
6b20: 50 74 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 Ptr..= (State *)
6b30: 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e ckalloc((unsign
6b40: 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 ed) sizeof(State
6b50: 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 ));. memset(s
6b60: 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 tatePtr, 0, size
6b70: 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 of(State));..
6b80: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 statePtr->flags
6b90: 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 .= flags;. st
6ba0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d atePtr->interp.=
6bb0: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 interp;. sta
6bc0: 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 tePtr->vflags.=
6bd0: 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 verify;. stat
6be0: 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a ePtr->err.= "";.
6bf0: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 . /* allocate
6c00: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 script */. i
6c10: 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 f (script) {..(v
6c20: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 oid) Tcl_GetStri
6c30: 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 ngFromObj(script
6c40: 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 , &len);..if (le
6c50: 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 n) {.. stateP
6c60: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 tr->callback = s
6c70: 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f cript;.. Tcl_
6c80: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 IncrRefCount(sta
6c90: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
6ca0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
6cb0: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 /* allocate pass
6cc0: 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 word */. if (
6cd0: 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f password) {..(vo
6ce0: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e id) Tcl_GetStrin
6cf0: 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 gFromObj(passwor
6d00: 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c d, &len);..if (l
6d10: 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 en) {.. state
6d20: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 Ptr->password =
6d30: 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 password;.. T
6d40: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
6d50: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
6d60: 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 rd);..}. }..
6d70: 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 if (model !=
6d80: 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 NULL) {..int mod
6d90: 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 e;../* Get the "
6da0: 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a model" context *
6db0: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
6dc0: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
6dd0: 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a model, &mode);.
6de0: 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 .if (chan == (Tc
6df0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
6e00: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
6e10: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
6e20: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
6e30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
6e40: 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 ./*.. * Make sur
6e50: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
6e60: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
6e70: 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d nel.. */..chan =
6e80: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
6e90: 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 el(chan);..if (T
6ea0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
6eb0: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
6ec0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
6ed0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
6ee0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
6ef0: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
6f00: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
6f10: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a me(chan),..."\":
6f20: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
6f30: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 el", NULL);..
6f40: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
6f50: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
6f60: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
6f70: 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 ROR;..}..ctx = (
6f80: 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 (State *)Tcl_Get
6f90: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
6fa0: 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b ata(chan))->ctx;
6fb0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 . } else {..i
6fc0: 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e f ((ctx = CTX_In
6fd0: 69 74 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 it(statePtr, ser
6fe0: 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 ver, proto, keyf
6ff0: 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b ile, certfile, k
7000: 65 79 2c 20 63 65 72 74 2c 0a 09 20 20 20 20 6b ey, cert,.. k
7010: 65 79 5f 6c 65 6e 2c 20 63 65 72 74 5f 6c 65 6e ey_len, cert_len
7020: 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c 65 2c , CAdir, CAfile,
7030: 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 ciphers, cipher
7040: 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 suites, level, D
7050: 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 28 53 53 Hparams)) == (SS
7060: 4c 5f 43 54 58 2a 29 30 29 20 7b 0a 09 20 20 20 L_CTX*)0) {..
7070: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
7080: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
7090: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
70a0: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ROR;..}. }..
70b0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 statePtr->ctx
70c0: 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a = ctx;.. /*.
70d0: 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 * We need t
70e0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 o make sure that
70f0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 the channel wor
7100: 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f ks in binary (fo
7110: 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 r the. * enc
7120: 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 ryption not to g
7130: 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 et goofed up)..
7140: 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 * We only wa
7150: 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 nt to adjust the
7160: 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 buffering in pr
7170: 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 e-v2 channels, w
7180: 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 here. * each
7190: 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 channel in the
71a0: 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 stack maintained
71b0: 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 its own buffers
71c0: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 .. */. Tc
71d0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
71e0: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
71f0: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c lation);. Tcl
7200: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
7210: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 perChannelBlocki
7220: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ng);. Tcl_DSt
7230: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
7240: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a hannelEOFChar);.
7250: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
7260: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
7270: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 lEncoding);.
7280: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
7290: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
72a0: 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 n, "-eofchar", &
72b0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
72c0: 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 har);. Tcl_Ge
72d0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
72e0: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 nterp, chan, "-e
72f0: 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 ncoding", &upper
7300: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
7310: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
7320: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
7330: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 p, chan, "-trans
7340: 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 lation", &upperC
7350: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
7360: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 n);. Tcl_GetC
7370: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
7380: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f erp, chan, "-blo
7390: 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 cking", &upperCh
73a0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a annelBlocking);.
73b0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
73c0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
73d0: 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 chan, "-transla
73e0: 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 tion", "binary")
73f0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
7400: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
7410: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b p, chan, "-block
7420: 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 ing", "true");.
7430: 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 dprintf("Cons
7440: 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 uming Tcl channe
7450: 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 l %s", Tcl_GetCh
7460: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 annelName(chan))
7470: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
7480: 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b self = Tcl_Stack
7490: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
74a0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
74b0: 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ), (ClientData)
74c0: 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52 statePtr, (TCL_R
74d0: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 EADABLE | TCL_WR
74e0: 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a ITABLE), chan);.
74f0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 dprintf("Cre
7500: 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d ated channel nam
7510: 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 ed %s", Tcl_GetC
7520: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
7530: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 Ptr->self));.
7540: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 if (statePtr->s
7550: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e elf == (Tcl_Chan
7560: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a nel) NULL) {../*
7570: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 .. * No use of T
7580: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 cl_EventuallyFre
7590: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 e because no pos
75a0: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 sible Tcl_Preser
75b0: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 ve... */..Tls_Fr
75c0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
75d0: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 ePtr);..return T
75e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
75f0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
7600: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
7610: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
7620: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
7630: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
7640: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
7650: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 Translation));.
7660: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
7670: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
7680: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 statePtr->self,
7690: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c "-encoding", Tcl
76a0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
76b0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
76c0: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 ing));. Tcl_S
76d0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
76e0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
76f0: 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 ->self, "-eofcha
7700: 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 r", Tcl_DStringV
7710: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
7720: 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 elEOFChar));.
7730: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
7740: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 ption(interp, st
7750: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d atePtr->self, "-
7760: 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 blocking", Tcl_D
7770: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
7780: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
7790: 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 g));.. /*.
77a0: 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 * SSL Initiali
77b0: 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 zation. */.
77c0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c statePtr->ssl
77d0: 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 = SSL_new(state
77e0: 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 Ptr->ctx);. i
77f0: 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73 f (!statePtr->ss
7800: 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 l) {../* SSL lib
7810: 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 rary error */..T
7820: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
7830: 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 interp, "couldn'
7840: 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 t construct ssl
7850: 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53 session: ", REAS
7860: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
7870: 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 ULL);..Tls_Free(
7880: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
7890: 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f r);..return TCL_
78a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
78b0: 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65 /* Set host se
78c0: 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 rver name */.
78d0: 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29 if (servername)
78e0: 20 7b 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 {..if (!SSL_set
78f0: 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d _tlsext_host_nam
7900: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c e(statePtr->ssl,
7910: 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 servername) &&
7920: 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 require) {..
7930: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7940: 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e (interp, "settin
7950: 67 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20 g TLS host name
7960: 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 extension failed
7970: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
7980: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 );. T
7990: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
79a0: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 statePtr);.
79b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 return T
79c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 CL_ERROR;.
79d0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f }. }.. /
79e0: 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e * Resume session
79f0: 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 id */. if (s
7a00: 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 ession_id && str
7a10: 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 len(session_id)
7a20: 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 <= SSL_MAX_SID_C
7a30: 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a TX_LENGTH) {../*
7a40: 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e SSL_set_session
7a50: 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f () */..if (!SSL_
7a60: 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f SESSION_set1_id_
7a70: 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f context(SSL_get_
7a80: 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 session(statePtr
7a90: 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f ->ssl), session_
7aa0: 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e id, (unsigned in
7ab0: 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f t) strlen(sessio
7ac0: 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 54 n_id))) {.. T
7ad0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
7ae0: 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20 interp, "Resume
7af0: 73 65 73 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 session id ", se
7b00: 73 73 69 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c ssion_id, " fail
7b10: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
7b20: 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 LL);.
7b30: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
7b40: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 *) statePtr);.
7b50: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e return
7b60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
7b70: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 61 6c }.. if (al
7b80: 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 pn) {../* Conver
7b90: 74 20 61 20 54 63 6c 20 6c 69 73 74 20 69 6e 74 t a Tcl list int
7ba0: 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 o a protocol-lis
7bb0: 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 t in wire-format
7bc0: 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 */..unsigned ch
7bd0: 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a ar *protos, *p;.
7be0: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 .unsigned int pr
7bf0: 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 otos_len = 0;..i
7c00: 6e 74 20 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a nt i, len, cnt;.
7c10: 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b .Tcl_Obj **list;
7c20: 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 ..if (Tcl_ListOb
7c30: 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 jGetElements(int
7c40: 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c erp, alpn, &cnt,
7c50: 20 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f &list) != TCL_O
7c60: 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 K) {.. Tls_Fr
7c70: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
7c80: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
7c90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
7ca0: 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 ../* Determine t
7cb0: 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 he memory requir
7cc0: 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f ed for the proto
7cd0: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 col-list */..for
7ce0: 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 (i = 0; i < cnt
7cf0: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 ; i++) {.. Tc
7d00: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
7d10: 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e bj(list[i], &len
7d20: 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 );.. if (len
7d30: 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 > 255) {...Tcl_A
7d40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7d50: 72 70 2c 20 22 61 6c 70 6e 20 70 72 6f 74 6f 63 rp, "alpn protoc
7d60: 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 ol name too long
7d70: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
7d80: 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63 );...Tls_Free((c
7d90: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
7da0: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
7db0: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 RROR;.. }..
7dc0: 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 protos_len +=
7dd0: 31 20 2b 20 6c 65 6e 3b 0a 09 7d 0a 09 2f 2a 20 1 + len;..}../*
7de0: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 Build the comple
7df0: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 te protocol-list
7e00: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b */..protos = ck
7e10: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e alloc(protos_len
7e20: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d );../* protocol-
7e30: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 lists consist of
7e40: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 8-bit length-pr
7e50: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 efixed, byte str
7e60: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 69 20 ings */..for (i
7e70: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b = 0, p = protos;
7e80: 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b i < cnt; i++) {
7e90: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 .. char *str
7ea0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
7eb0: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 romObj(list[i],
7ec0: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b &len);.. *p++
7ed0: 20 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d = len;.. mem
7ee0: 63 70 79 28 70 2c 20 73 74 72 2c 20 6c 65 6e 29 cpy(p, str, len)
7ef0: 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b ;.. p += len;
7f00: 0a 09 7d 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 ..}../* Note: Th
7f10: 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 is functions rev
7f20: 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72 6e erses the return
7f30: 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f value conventio
7f40: 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 n */..if (SSL_se
7f50: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 t_alpn_protos(st
7f60: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f atePtr->ssl, pro
7f70: 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 tos, protos_len)
7f80: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
7f90: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
7fa0: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73 65 74 , "failed to set
7fb0: 20 61 6c 70 6e 20 70 72 6f 74 6f 63 6f 6c 73 22 alpn protocols"
7fc0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
7fd0: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
7fe0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
7ff0: 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 r);.. ckfree(
8000: 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 protos);.. re
8010: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
8020: 09 7d 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 .}../* SSL_set_a
8030: 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 lpn_protos makes
8040: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 a copy of the p
8050: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a rotocol-list */.
8060: 09 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b .ckfree(protos);
8070: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
8080: 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 * SSL Callba
8090: 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 cks. */.
80a0: 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 SSL_set_app_data
80b0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
80c0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
80d0: 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b );./* point back
80e0: 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 to us */. SS
80f0: 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 L_set_verify(sta
8100: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 tePtr->ssl, veri
8110: 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 fy, VerifyCallba
8120: 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 ck);. SSL_CTX
8130: 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 _set_info_callba
8140: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ck(statePtr->ctx
8150: 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b , InfoCallback);
8160: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 . SSL_CTX_ses
8170: 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 s_set_new_cb(sta
8180: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 tePtr->ctx, Sess
8190: 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 ionCallback);..
81a0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c /* Create Tcl
81b0: 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e _Channel BIO Han
81c0: 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 dler */. stat
81d0: 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 ePtr->p_bio.= BI
81e0: 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50 O_new_tcl(stateP
81f0: 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 tr, BIO_NOCLOSE)
8200: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
8210: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 bio.= BIO_new(BI
8220: 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 O_f_ssl());..
8230: 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 if (server) {..
8240: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
8250: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 |= TLS_TCL_SERVE
8260: 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 R;..SSL_set_acce
8270: 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 pt_state(statePt
8280: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 r->ssl);. } e
8290: 6c 73 65 20 7b 0a 09 53 53 4c 5f 73 65 74 5f 63 lse {..SSL_set_c
82a0: 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 onnect_state(sta
82b0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
82c0: 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 }. SSL_set_b
82d0: 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c io(statePtr->ssl
82e0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 , statePtr->p_bi
82f0: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 o, statePtr->p_b
8300: 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 io);. BIO_set
8310: 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 _ssl(statePtr->b
8320: 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 io, statePtr->ss
8330: 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b l, BIO_NOCLOSE);
8340: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
8350: 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a End of SSL Init.
8360: 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 */. dpri
8370: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 ntf("Returning %
8380: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e s", Tcl_GetChann
8390: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
83a0: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c >self));. Tcl
83b0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
83c0: 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f p, (char *) Tcl_
83d0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
83e0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
83f0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a TCL_VOLATILE);..
8400: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
8410: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d K;..clientData =
8420: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c clientData;.}..
8430: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
8480: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d UnimportObjCmd -
8490: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
84a0: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
84b0: 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 d to remove the
84c0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
84d0: 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 filter.. *. * Re
84e0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
84f0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
8500: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
8510: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 cts:. *.May modi
8520: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 fy the behavior
8530: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c of an IO channel
8540: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
8550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
8590: 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f tatic int.Unimpo
85a0: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 rtObjCmd(ClientD
85b0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
85c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
85d0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
85e0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
85f0: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
8600: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
8610: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
8620: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
8630: 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 /.. dprintf("
8640: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
8650: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
8660: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
8670: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
8680: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
8690: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
86a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 ;. }.. cha
86b0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
86c0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
86d0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d etString(objv[1]
86e0: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 ), NULL);. if
86f0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
8700: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
8710: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
8720: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
8730: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
8740: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
8750: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a most channel */.
8760: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
8770: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
8780: 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c n);.. if (Tcl
8790: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
87a0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
87b0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
87c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
87d0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
87e0: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
87f0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
8800: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 n),..."\": not a
8810: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
8820: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
8830: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
8840: 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 if (Tcl_Unst
8850: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 ackChannel(inter
8860: 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f p, chan) == TCL_
8870: 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e ERROR) {..return
8880: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8890: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }.. return TC
88a0: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 L_OK;..clientDat
88b0: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a a = clientData;.
88c0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
88d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
8910: 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 * CTX_Init -- c
8920: 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 onstruct a SSL_C
8930: 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 TX instance. *.
8940: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
8950: 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e valid SSL_CTX in
8960: 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a stance or NULL..
8970: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
8980: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 ts:. *.construct
8990: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 s SSL context (C
89a0: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d TX). *. *-------
89b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
89c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
89d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
89e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
89f0: 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 .static SSL_CTX
8a00: 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 *.CTX_Init(State
8a10: 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 *statePtr, int
8a20: 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 isServer, int pr
8a30: 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 oto, char *keyfi
8a40: 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69 le, char *certfi
8a50: 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 le,. unsigned
8a60: 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 char *key, unsi
8a70: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c gned char *cert,
8a80: 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e int key_len, in
8a90: 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72 t cert_len, char
8aa0: 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 63 68 61 *CAdir,. cha
8ab0: 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20 r *CAfile, char
8ac0: 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a *ciphers, char *
8ad0: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e ciphersuites, in
8ae0: 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 t level, char *D
8af0: 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 Hparams) {. T
8b00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
8b10: 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p = statePtr->in
8b20: 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 terp;. SSL_CT
8b30: 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 X *ctx = NULL;.
8b40: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 Tcl_DString d
8b50: 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 s;. Tcl_DStri
8b60: 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 ng ds1;. int
8b70: 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 off = 0;. int
8b80: 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 load_private_ke
8b90: 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c y;. const SSL
8ba0: 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b _METHOD *method;
8bb0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
8bc0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
8bd0: 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c (!proto) {..Tcl
8be0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
8bf0: 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 terp, "no valid
8c00: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 protocol selecte
8c10: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 d", NULL);..retu
8c20: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b rn (SSL_CTX *)0;
8c30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 . }.. /* c
8c40: 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 reate SSL contex
8c50: 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c t */.#if OPENSSL
8c60: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
8c70: 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c >= 0x10100000L |
8c80: 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c | defined(NO_SSL
8c90: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
8ca0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 ENSSL_NO_SSL2).
8cb0: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
8cc0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
8cd0: 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 SSL2)) {..Tcl_Ap
8ce0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
8cf0: 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f p, "SSL2 protoco
8d00: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
8d10: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
8d20: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 (SSL_CTX *)0;.
8d30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
8d40: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
8d50: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
8d60: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 SSL_NO_SSL3).
8d70: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
8d80: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 to, TLS_PROTO_SS
8d90: 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 L3)) {..Tcl_Appe
8da0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
8db0: 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 "SSL3 protocol
8dc0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
8dd0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 NULL);..return (
8de0: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 SSL_CTX *)0;.
8df0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
8e00: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c fined(NO_TLS1) |
8e10: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
8e20: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 L_NO_TLS1). i
8e30: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
8e40: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
8e50: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
8e60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
8e70: 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c TLS 1.0 protocol
8e80: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
8e90: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
8ea0: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 (SSL_CTX *)0;.
8eb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 }.#endif.#if d
8ec0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
8ed0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
8ee0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a NSSL_NO_TLS1_1).
8ef0: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 if (ENABLED(
8f00: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
8f10: 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c _TLS1_1)) {..Tcl
8f20: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
8f30: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 terp, "TLS 1.1 p
8f40: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
8f50: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
8f60: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
8f70: 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 *)0;. }.#endi
8f80: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
8f90: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
8fa0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
8fb0: 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 LS1_2). if (E
8fc0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
8fd0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 S_PROTO_TLS1_2))
8fe0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
8ff0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
9000: 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.2 protocol n
9010: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
9020: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 ULL);..return (S
9030: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 SL_CTX *)0;.
9040: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 }.#endif.#if def
9050: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
9060: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
9070: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
9080: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
9090: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
90a0: 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 LS1_3)) {..Tcl_A
90b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
90c0: 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f rp, "TLS 1.3 pro
90d0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
90e0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ted", NULL);..re
90f0: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 turn (SSL_CTX *)
9100: 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0;. }.#endif.
9110: 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f . switch (pro
9120: 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 to) {.#if OPENSS
9130: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
9140: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 < 0x10100000L &
9150: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 & !defined(NO_SS
9160: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L2) && !defined(
9170: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
9180: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
9190: 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f OTO_SSL2:..metho
91a0: 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f 64 d = SSLv2_method
91b0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
91c0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
91d0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
91e0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
91f0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
9200: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
9210: 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 3_METHOD). ca
9220: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c se TLS_PROTO_SSL
9230: 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c 3:..method = SSL
9240: 76 33 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 v3_method();..br
9250: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
9260: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
9270: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
9280: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 ENSSL_NO_TLS1) &
9290: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
92a0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
92b0: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
92c0: 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 PROTO_TLS1:..met
92d0: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 hod = TLSv1_meth
92e0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
92f0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
9300: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 d(NO_TLS1_1) &&
9310: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
9320: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 _NO_TLS1_1) && !
9330: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
9340: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 NO_TLS1_1_METHOD
9350: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
9360: 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 ROTO_TLS1_1:..me
9370: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d thod = TLSv1_1_m
9380: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
9390: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
93a0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
93b0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
93c0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 SSL_NO_TLS1_2) &
93d0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
93e0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 SL_NO_TLS1_2_MET
93f0: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
9400: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a S_PROTO_TLS1_2:.
9410: 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f .method = TLSv1_
9420: 32 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 2_method();..bre
9430: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
9440: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
9450: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
9460: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
9470: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
9480: 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a ROTO_TLS1_3:../*
9490: 0a 09 20 2a 20 54 68 65 20 76 65 72 73 69 6f 6e .. * The version
94a0: 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 range is constr
94b0: 61 69 6e 65 64 20 62 65 6c 6f 77 2c 0a 09 20 2a ained below,.. *
94c0: 20 61 66 74 65 72 20 74 68 65 20 63 6f 6e 74 65 after the conte
94d0: 78 74 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 xt is created.
94e0: 55 73 65 20 74 68 65 0a 09 20 2a 20 67 65 6e 65 Use the.. * gene
94f0: 72 69 63 20 6d 65 74 68 6f 64 20 68 65 72 65 2e ric method here.
9500: 0a 09 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 .. */..method =
9510: 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 TLS_method();..b
9520: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 reak;.#endif.
9530: 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 default:../* Ne
9540: 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20 gotiate highest
9550: 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c available SSL/TL
9560: 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 S version */..me
9570: 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f thod = TLS_metho
9580: 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c d();.#if OPENSSL
9590: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
95a0: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 < 0x10100000L &&
95b0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
95c0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
95d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
95e0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
95f0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
9600: 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 O_SSL2) ? 0 :
9610: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 SSL_OP_NO_SSLv2)
9620: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
9630: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
9640: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
9650: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 SL_NO_SSL3)..off
9660: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f |= (ENABLED(pro
9670: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 to, TLS_PROTO_SS
9680: 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f L3) ? 0 : SSL_
9690: 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 OP_NO_SSLv3);.#e
96a0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
96b0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 d(NO_TLS1) && !d
96c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
96d0: 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 O_TLS1)..off |=
96e0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
96f0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 TLS_PROTO_TLS1)
9700: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ? 0 : SSL_OP_N
9710: 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 O_TLSv1);.#endif
9720: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
9730: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
9740: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
9750: 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 TLS1_1)..off |=
9760: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
9770: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
9780: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ) ? 0 : SSL_OP_N
9790: 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 O_TLSv1_1);.#end
97a0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
97b0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
97c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
97d0: 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c O_TLS1_2)..off |
97e0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
97f0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
9800: 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 _2) ? 0 : SSL_OP
9810: 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 _NO_TLSv1_2);.#e
9820: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
9830: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 d(NO_TLS1_3) &&
9840: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
9850: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 _NO_TLS1_3)..off
9860: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f |= (ENABLED(pro
9870: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
9880: 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f S1_3) ? 0 : SSL_
9890: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a OP_NO_TLSv1_3);.
98a0: 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 #endif..break;.
98b0: 20 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 }.. ctx =
98c0: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 SSL_CTX_new(meth
98d0: 6f 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 63 od);.. if (!c
98e0: 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 tx) {..return(NU
98f0: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 LL);. }..
9900: 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 if (getenv(SSLKE
9910: 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 YLOGFILE)) {..SS
9920: 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 L_CTX_set_keylog
9930: 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b _callback(ctx, K
9940: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a eyLogCallback);.
9950: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 }..#if !defi
9960: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
9970: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
9980: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
9990: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 if (proto == T
99a0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
99b0: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
99c0: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f min_proto_versio
99d0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
99e0: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 RSION);..SSL_CTX
99f0: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 _set_max_proto_v
9a00: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
9a10: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 0a 09 69 _3_VERSION);...i
9a20: 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a f (!isServer) {.
9a30: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
9a40: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 _options(ctx, SS
9a50: 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 L_OP_CIPHER_SERV
9a60: 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a ER_PREFERENCE);.
9a70: 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a .}. }.#endif.
9a80: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
9a90: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 _app_data(ctx, (
9aa0: 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f void*)interp);./
9ab0: 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 * remember the i
9ac0: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 nterpreter */.
9ad0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 SSL_CTX_set_op
9ae0: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
9af0: 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 P_ALL);./* all S
9b00: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e SL bug workaroun
9b10: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 ds */. SSL_CT
9b20: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
9b30: 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 x, off);../* dis
9b40: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 able protocol ve
9b50: 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 rsions */.#if OP
9b60: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
9b70: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 MBER < 0x1010100
9b80: 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 0L. SSL_CTX_s
9b90: 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c et_mode(ctx, SSL
9ba0: 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 _MODE_AUTO_RETRY
9bb0: 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 );./* handle new
9bc0: 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 handshakes in b
9bd0: 61 63 6b 67 72 6f 75 6e 64 20 2a 2f 0a 23 65 6e ackground */.#en
9be0: 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f dif. SSL_CTX_
9bf0: 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 sess_set_cache_s
9c00: 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a ize(ctx, 128);..
9c10: 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 /* Set user
9c20: 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c defined ciphers,
9c30: 20 63 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 cipher suites,
9c40: 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 and security lev
9c50: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 28 el */. if (((
9c60: 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 ciphers != NULL)
9c70: 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 && !SSL_CTX_set
9c80: 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 _cipher_list(ctx
9c90: 2c 20 63 69 70 68 65 72 73 29 29 20 7c 7c 20 5c , ciphers)) || \
9ca0: 0a 09 28 28 63 69 70 68 65 72 73 75 69 74 65 73 ..((ciphersuites
9cb0: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 != NULL) && !SS
9cc0: 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 L_CTX_set_cipher
9cd0: 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 suites(ctx, ciph
9ce0: 65 72 73 75 69 74 65 73 29 29 29 20 7b 0a 09 20 ersuites))) {..
9cf0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
9d00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 ult(interp, "Set
9d10: 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 22 ciphers failed"
9d20: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9d30: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
9d40: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
9d50: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
9d60: 29 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f )0;. }.. /
9d70: 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20 6c * Set security l
9d80: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 evel */. if (
9d90: 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 level > -1 && le
9da0: 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 vel < 6) {../* S
9db0: 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f SL_set_security_
9dc0: 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 level */..SSL_CT
9dd0: 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c X_set_security_l
9de0: 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 evel(ctx, level)
9df0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
9e00: 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 set some callbac
9e10: 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 ks */. SSL_CT
9e20: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 X_set_default_pa
9e30: 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 sswd_cb(ctx, Pas
9e40: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a swordCallback);.
9e50: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
9e60: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 default_passwd_c
9e70: 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 b_userdata(ctx,
9e80: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
9e90: 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 );.. /* read
9ea0: 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e a Diffie-Hellman
9eb0: 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 parameters file
9ec0: 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 , or use the bui
9ed0: 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 lt-in one */.#if
9ee0: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 def OPENSSL_NO_D
9ef0: 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 H. if (DHpara
9f00: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 ms != NULL) {..T
9f10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
9f20: 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 interp, "DH para
9f30: 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f meter support no
9f40: 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 t available", (c
9f50: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 har *) NULL);..S
9f60: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
9f70: 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 ;..return (SSL_C
9f80: 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 TX *)0;. }.#e
9f90: 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 lse. {..DH* d
9fa0: 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 h;..if (DHparams
9fb0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
9fc0: 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 BIO *bio;..
9fd0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
9fe0: 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d &ds);.. bio =
9ff0: 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 BIO_new_file(F2
a000: 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 N(DHparams, &ds)
a010: 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 , "r");.. if
a020: 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 (!bio) {...Tcl_D
a030: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
a040: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
a050: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 ult(interp, "Cou
a060: 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 ld not find DH p
a070: 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c arameters file",
a080: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
a090: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
a0a0: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 ctx);...return (
a0b0: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 SSL_CTX *)0;..
a0c0: 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 }... dh = P
a0d0: 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 EM_read_bio_DHpa
a0e0: 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 rams(bio, NULL,
a0f0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 NULL, NULL);..
a100: 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b BIO_free(bio);
a110: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
a120: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 gFree(&ds);..
a130: 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 if (!dh) {...Tc
a140: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
a150: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f nterp, "Could no
a160: 74 20 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 t read DH parame
a170: 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c ters from file",
a180: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
a190: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
a1a0: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 ctx);...return (
a1b0: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 SSL_CTX *)0;..
a1c0: 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 }..} else {..
a1d0: 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50 61 dh = get_dhPa
a1e0: 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f rams();..}..SSL_
a1f0: 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 CTX_set_tmp_dh(c
a200: 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 tx, dh);..DH_fre
a210: 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e e(dh);. }.#en
a220: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 dif.. /* set
a230: 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 our certificate
a240: 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 */. load_priv
a250: 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 ate_key = 0;.
a260: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d if (certfile !=
a270: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 NULL) {..load_p
a280: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a rivate_key = 1;.
a290: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 ..Tcl_DStringIni
a2a0: 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 t(&ds);...if (SS
a2b0: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 L_CTX_use_certif
a2c0: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 icate_file(ctx,
a2d0: 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 F2N(certfile, &d
a2e0: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 s), SSL_FILETYPE
a2f0: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 _PEM) <= 0) {..
a300: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
a310: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 ee(&ds);.. Tc
a320: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
a330: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
a340: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 o set certificat
a350: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 e file ", certfi
a360: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 le, ": ",....
a370: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 REASON(), (cha
a380: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
a390: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
a3a0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
a3b0: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d (SSL_CTX *)0;..}
a3c0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
a3d0: 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a cert != NULL) {.
a3e0: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 .load_private_ke
a3f0: 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f y = 1;..if (SSL_
a400: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
a410: 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 ate_ASN1(ctx, ce
a420: 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d rt_len, cert) <=
a430: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 0) {.. Tcl_D
a440: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
a450: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
a460: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
a470: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 unable to set ce
a480: 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 rtificate: ",...
a490: 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 . REASON(),
a4a0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
a4b0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 . SSL_CTX_fre
a4c0: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 e(ctx);.. ret
a4d0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
a4e0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
a4f0: 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 {..certfile = (c
a500: 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 har*)X509_get_de
a510: 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 fault_cert_file(
a520: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 );...if (SSL_CTX
a530: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
a540: 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 _file(ctx, certf
a550: 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ile, SSL_FILETYP
a560: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 E_PEM) <= 0) {.#
a570: 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 if 0.. Tcl_DS
a580: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
a590: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
a5a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
a5b0: 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 nable to use def
a5c0: 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 ault certificate
a5d0: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c file ", certfil
a5e0: 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 e, ": ",....
a5f0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
a600: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
a610: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
a620: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 );.. return (
a630: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 23 65 6e SSL_CTX *)0;.#en
a640: 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 dif..}. }..
a650: 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 /* set our pri
a660: 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 vate key */.
a670: 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 if (load_private
a680: 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 _key) {..if (key
a690: 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 file == NULL &&
a6a0: 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 key == NULL) {..
a6b0: 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 keyfile = ce
a6c0: 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 rtfile;..}...if
a6d0: 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c (keyfile != NULL
a6e0: 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 ) {.. /* get
a6f0: 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 the private key
a700: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
a710: 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 this certificate
a720: 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 */.. if (key
a730: 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a file == NULL) {.
a740: 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 ..keyfile = cert
a750: 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 file;.. }...
a760: 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 if (SSL_CTX_u
a770: 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 se_PrivateKey_fi
a780: 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 le(ctx, F2N(keyf
a790: 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 ile, &ds), SSL_F
a7a0: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 ILETYPE_PEM) <=
a7b0: 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 0) {...Tcl_DStri
a7c0: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f ngFree(&ds);.../
a7d0: 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 * flush the pass
a7e0: 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 phrase which mig
a7f0: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 ht be left in th
a800: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 e result */...Tc
a810: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
a820: 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 rp, NULL, TCL_ST
a830: 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 ATIC);...Tcl_App
a840: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
a850: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 , "unable to set
a860: 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 public key file
a870: 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 ", keyfile, " "
a880: 2c 0a 09 09 09 20 20 20 20 20 20 20 20 20 52 45 ,.... RE
a890: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
a8a0: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
a8b0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
a8c0: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
a8d0: 29 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 )0;.. }..
a8e0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
a8f0: 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 &ds);...} else i
a900: 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 f (key != NULL)
a910: 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 {.. if (SSL_C
a920: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 TX_use_PrivateKe
a930: 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f y_ASN1(EVP_PKEY_
a940: 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 RSA, ctx, key,ke
a950: 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 y_len) <= 0) {..
a960: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
a970: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 (&ds);.../* flus
a980: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 h the passphrase
a990: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 which might be
a9a0: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 left in the resu
a9b0: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 lt */...Tcl_SetR
a9c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 esult(interp, NU
a9d0: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b LL, TCL_STATIC);
a9e0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
a9f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
aa00: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 ble to set publi
aa10: 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e c key: ", REASON
aa20: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
aa30: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
aa40: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
aa50: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
aa60: 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f . }..}../* No
aa70: 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 w we know that a
aa80: 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 key and cert ha
aa90: 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 ve been set agai
aaa0: 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 nst.. * the SSL
aab0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 context */..if (
aac0: 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 !SSL_CTX_check_p
aad0: 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29 rivate_key(ctx))
aae0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
aaf0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ab00: 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f "private key do
ab10: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 es not match the
ab20: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62 certificate pub
ab30: 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 20 lic key",....
ab40: 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 (char *) NULL)
ab50: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
ab60: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
ab70: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
ab80: 29 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 )0;..}. }..
ab90: 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63 /* Set verific
aba0: 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 ation CAs */.
abb0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
abc0: 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 (&ds);. Tcl_D
abd0: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 StringInit(&ds1)
abe0: 3b 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 ;. if (!SSL_C
abf0: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c TX_load_verify_l
ac00: 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 ocations(ctx, F2
ac10: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 N(CAfile, &ds),
ac20: 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29 F2N(CAdir, &ds1)
ac30: 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 ) ||..!SSL_CTX_s
ac40: 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 et_default_verif
ac50: 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a y_paths(ctx)) {.
ac60: 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 #if 0..Tcl_DStri
ac70: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63 ngFree(&ds);..Tc
ac80: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
ac90: 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 s1);../* Don't c
aca0: 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66 urrently care if
acb0: 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 this fails */..
acc0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
acd0: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65 (interp, "SSL de
ace0: 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 74 fault verify pat
acf0: 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c hs: ", REASON(),
ad00: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
ad10: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
ad20: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 tx);..return (SS
ad30: 4c 5f 43 54 58 20 2a 29 30 3b 0a 23 65 6e 64 69 L_CTX *)0;.#endi
ad40: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 f. }.. /*
ad50: 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f https://sourcefo
ad60: 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 rge.net/p/tls/bu
ad70: 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a gs/57/ */. /*
ad80: 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 XXX:TODO: Let t
ad90: 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 he user supply v
ada0: 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 alues here inste
adb0: 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 ad of something
adc0: 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 that exists on t
add0: 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f he filesystem */
ade0: 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 . if (CAfile
adf0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53 54 41 43 != NULL) {..STAC
ae00: 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 K_OF(X509_NAME)
ae10: 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c *certNames = SSL
ae20: 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f _load_client_CA_
ae30: 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c file(F2N(CAfile,
ae40: 20 26 64 73 29 29 3b 0a 09 69 66 20 28 63 65 72 &ds));..if (cer
ae50: 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 tNames != NULL)
ae60: 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 {.. SSL_CTX_s
ae70: 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
ae80: 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 t(ctx, certNames
ae90: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
aea0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
aeb0: 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 (&ds);. Tcl_D
aec0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 StringFree(&ds1)
aed0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 ;. return ctx
aee0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
aef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
af00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
af10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
af20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
af30: 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d *. * StatusObjCm
af40: 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 d -- return cert
af50: 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e ificate for conn
af60: 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 ected peer.. *.
af70: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
af80: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
af90: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
afa0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
afb0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
afc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
afd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
afe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
b000: 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 tatic int.Status
b010: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
b020: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
b030: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
b040: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
b050: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
b060: 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a ]) {. State *
b070: 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 statePtr;. X5
b080: 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 09 *peer;. Tc
b090: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 l_Obj *objPtr;.
b0a0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
b0b0: 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 han;. char *c
b0c0: 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 hannelName, *cip
b0d0: 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f hers;. int mo
b0e0: 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e de;. const un
b0f0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f signed char *pro
b100: 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 to;. unsigned
b110: 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 int len;.. d
b120: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
b130: 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 6f ;.. switch (o
b140: 62 6a 63 29 20 7b 0a 09 63 61 73 65 20 32 3a 0a bjc) {..case 2:.
b150: 09 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 . channelName
b160: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
b170: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
b180: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 NULL);.. bre
b190: 61 6b 3b 0a 0a 09 63 61 73 65 20 33 3a 0a 09 20 ak;...case 3:..
b1a0: 20 20 20 69 66 20 28 21 73 74 72 63 6d 70 20 28 if (!strcmp (
b1b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 20 28 6f Tcl_GetString (o
b1c0: 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c bjv[1]), "-local
b1d0: 22 29 29 20 7b 0a 09 09 63 68 61 6e 6e 65 6c 4e ")) {...channelN
b1e0: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 ame = Tcl_GetStr
b1f0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
b200: 32 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 09 62 72 65 2], NULL);...bre
b210: 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ak;.. }..
b220: 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 2d 74 68 72 /* else fall-thr
b230: 6f 75 67 68 20 2e 2e 2e 20 2a 2f 0a 23 69 66 20 ough ... */.#if
b240: 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f defined(__GNUC__
b250: 29 0a 09 20 20 20 20 5f 5f 61 74 74 72 69 62 75 ).. __attribu
b260: 74 65 5f 5f 28 28 66 61 6c 6c 74 68 72 6f 75 67 te__((fallthroug
b270: 68 29 29 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 h));.#endif..def
b280: 61 75 6c 74 3a 0a 09 20 20 20 20 54 63 6c 5f 57 ault:.. Tcl_W
b290: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
b2a0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d rp, 1, objv, "?-
b2b0: 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 local? channel")
b2c0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
b2d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
b2e0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
b2f0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
b300: 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 , channelName, &
b310: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 mode);. if (c
b320: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
b330: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
b340: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
b350: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4d 61 6b }. /* Mak
b360: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
b370: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
b380: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
b390: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
b3a0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
b3b0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
b3c0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
b3d0: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
b3e0: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
b3f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
b400: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
b410: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
b420: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
b430: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 ."\": not a TLS
b440: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
b450: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
b460: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 OR;. }. st
b470: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
b480: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *) Tcl_GetChanne
b490: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
b4a0: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a an);. if (obj
b4b0: 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 c == 2) {..peer
b4c0: 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 = SSL_get_peer_c
b4d0: 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 ertificate(state
b4e0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
b4f0: 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 else {..peer =
b500: 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 SSL_get_certific
b510: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ate(statePtr->ss
b520: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 l);. }. if
b530: 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 (peer) {..objPt
b540: 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f r = Tls_NewX509O
b550: 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 bj(interp, peer)
b560: 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 ;..if (objc == 2
b570: 29 20 7b 20 58 35 30 39 5f 66 72 65 65 28 70 65 ) { X509_free(pe
b580: 65 72 29 3b 20 7d 0a 20 20 20 20 7d 20 65 6c 73 er); }. } els
b590: 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 e {..objPtr = Tc
b5a0: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
b5b0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL);. }..
b5c0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
b5d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
b5e0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
b5f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 62 69 ewStringObj("sbi
b600: 74 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 ts", -1));. T
b610: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
b620: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
b630: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 objPtr, Tcl_NewI
b640: 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69 ntObj(SSL_get_ci
b650: 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 pher_bits(stateP
b660: 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 tr->ssl, NULL)))
b670: 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d ;.. ciphers =
b680: 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f (char*)SSL_get_
b690: 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d cipher(statePtr-
b6a0: 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 28 >ssl);. if ((
b6b0: 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 ciphers != NULL)
b6c0: 20 26 26 20 28 73 74 72 63 6d 70 28 63 69 70 68 && (strcmp(ciph
b6d0: 65 72 73 2c 20 22 28 4e 4f 4e 45 29 22 29 20 21 ers, "(NONE)") !
b6e0: 3d 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 = 0)) {..Tcl_Lis
b6f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
b700: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
b710: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
b720: 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29 bj("cipher", -1)
b730: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
b740: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
b750: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
b760: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
b770: 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 L_get_cipher(sta
b780: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 tePtr->ssl), -1)
b790: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
b7a0: 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 39 Verify the X509
b7b0: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 65 certificate pre
b7c0: 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 sented by the pe
b7d0: 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 er */. Tcl_Li
b7e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
b7f0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
b800: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
b810: 4f 62 6a 28 22 76 61 6c 69 64 61 74 69 6f 6e 22 Obj("validation"
b820: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 , -1));. if (
b830: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 SSL_get_verify_r
b840: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e esult(statePtr->
b850: 73 73 6c 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f ssl) != X509_V_O
b860: 4b 29 20 7b 0a 09 2f 2a 20 70 72 6f 74 6f 20 3d K) {../* proto =
b870: 20 22 66 61 69 6c 65 64 22 3b 20 2a 2f 0a 09 70 "failed"; */..p
b880: 72 6f 74 6f 20 3d 20 52 45 41 53 4f 4e 28 29 3b roto = REASON();
b890: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 . } else {..p
b8a0: 72 6f 74 6f 20 3d 20 22 6f 6b 22 3b 0a 20 20 20 roto = "ok";.
b8b0: 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f }. Tcl_ListO
b8c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
b8d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
b8e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
b8f0: 28 70 72 6f 74 6f 2c 20 2d 31 29 29 3b 0a 0a 20 (proto, -1));..
b900: 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 /* Report the
b910: 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 selected protoc
b920: 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f ol as a result o
b930: 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f f the negotiatio
b940: 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 n */. SSL_get
b950: 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 0_alpn_selected(
b960: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
b970: 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 proto, &len);.
b980: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
b990: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
b9a0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
b9b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 ewStringObj("alp
b9c0: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 n", -1));. Tc
b9d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
b9e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
b9f0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
ba00: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 ringObj((char *)
ba10: 70 72 6f 74 6f 2c 20 28 69 6e 74 29 6c 65 6e 29 proto, (int)len)
ba20: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
ba30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
ba40: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ba50: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
ba60: 28 22 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 29 ("version", -1))
ba70: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
ba80: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
ba90: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
baa0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
bab0: 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 SSL_get_version(
bac0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 statePtr->ssl),
bad0: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 -1));.. Tcl_S
bae0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
baf0: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
bb00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
bb10: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
bb20: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
bb30: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
bb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb70: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e ------. *. * Con
bb80: 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d nectionInfoObjCm
bb90: 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e d -- return conn
bba0: 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d ection info from
bbb0: 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 OpenSSL.. *. *
bbc0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 Results:. *.A li
bbd0: 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e st of connection
bbe0: 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d info. *. *----
bbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
bc30: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 */..static int
bc40: 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 ConnectionInfoOb
bc50: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
bc60: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
bc70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
bc80: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
bc90: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
bca0: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e {. Tcl_Chann
bcb0: 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 el chan;../* The
bcc0: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 channel to set
bcd0: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 a mode on. */.
bce0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
bcf0: 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 r;../* client st
bd00: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b ate for ssl sock
bd10: 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 et */. Tcl_Ob
bd20: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 63 j *objPtr;. c
bd30: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 onst SSL *ssl;.
bd40: 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 const SSL_CIP
bd50: 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 HER *cipher;.
bd60: 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 const SSL_SESSI
bd70: 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 ON *session;.
bd80: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
bd90: 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 char *proto;.
bda0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 unsigned int le
bdb0: 6e 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 n;.#if defined(H
bdc0: 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 AVE_SSL_COMPRESS
bdd0: 49 4f 4e 29 0a 20 20 20 20 63 6f 6e 73 74 20 43 ION). const C
bde0: 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 OMP_METHOD *comp
bdf0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 ;.#endif.. if
be00: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
be10: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
be20: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
be30: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
be40: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
be50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 ;. }.. cha
be60: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
be70: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
be80: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
be90: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 objv[1], NULL),
bea0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
beb0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
bec0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
bed0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
bee0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
bef0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
bf00: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
bf10: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
bf20: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
bf30: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
bf40: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 ;. if (Tcl_Ge
bf50: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
bf60: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
bf70: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f lType()) {..Tcl_
bf80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
bf90: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
bfa0: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
bfb0: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
bfc0: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 "\": not a TLS
bfd0: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
bfe0: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
bff0: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
c000: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
c010: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
c020: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 ;.. /* Connec
c030: 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 tion info */.
c040: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
c050: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
c060: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
c070: 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d chan);. ssl =
c080: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a statePtr->ssl;.
c090: 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e if (ssl != N
c0a0: 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 ULL) {..const ch
c0b0: 61 72 20 2a 73 74 61 74 65 3b 0a 0a 09 2f 2a 20 ar *state;.../*
c0c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 connection state
c0d0: 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 69 73 5f */..if (SSL_is_
c0e0: 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 73 init_finished(ss
c0f0: 6c 29 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 l)) {.. state
c100: 20 3d 20 22 65 73 74 61 62 6c 69 73 68 65 64 22 = "established"
c110: 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 53 53 ;..} else if (SS
c120: 4c 5f 69 6e 5f 69 6e 69 74 28 73 73 6c 29 29 20 L_in_init(ssl))
c130: 7b 0a 09 20 20 20 20 73 74 61 74 65 20 3d 20 22 {.. state = "
c140: 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 7d 20 65 handshake";..} e
c150: 6c 73 65 20 7b 0a 09 20 20 20 20 73 74 61 74 65 lse {.. state
c160: 20 3d 20 22 69 6e 69 74 69 61 6c 69 7a 69 6e 67 = "initializing
c170: 22 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f ";..}..Tcl_ListO
c180: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
c190: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
c1a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
c1b0: 28 22 73 74 61 74 65 22 2c 20 2d 31 29 29 3b 0a ("state", -1));.
c1c0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
c1d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
c1e0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
c1f0: 77 53 74 72 69 6e 67 4f 62 6a 28 73 74 61 74 65 wStringObj(state
c200: 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 , -1));.../* Get
c210: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a server name */.
c220: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
c230: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
c240: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
c250: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 72 76 wStringObj("serv
c260: 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 ername", -1));..
c270: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
c280: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
c290: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
c2a0: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 StringObj(SSL_ge
c2b0: 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c t_servername(ssl
c2c0: 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 , TLSEXT_NAMETYP
c2d0: 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 E_host_name), -1
c2e0: 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f ));.../* Get pro
c2f0: 74 6f 63 6f 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 tocol */..Tcl_Li
c300: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
c310: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
c320: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
c330: 4f 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 Obj("protocol",
c340: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
c350: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
c360: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
c370: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
c380: 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e (SSL_get_version
c390: 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f (ssl), -1));.../
c3a0: 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 * Renegotiation
c3b0: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 54 63 6c 5f allowed */..Tcl_
c3c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
c3d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
c3e0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
c3f0: 6e 67 4f 62 6a 28 22 72 65 6e 65 67 6f 74 69 61 ngObj("renegotia
c400: 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 tion", -1));..Tc
c410: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
c420: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
c430: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
c440: 72 69 6e 67 4f 62 6a 28 0a 09 20 20 20 20 53 53 ringObj(.. SS
c450: 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e L_get_secure_ren
c460: 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f egotiation_suppo
c470: 72 74 28 73 73 6c 29 20 3f 20 22 61 6c 6c 6f 77 rt(ssl) ? "allow
c480: 65 64 22 20 3a 20 22 6e 6f 74 20 73 75 70 70 6f ed" : "not suppo
c490: 72 74 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 2f rted", -1));.../
c4a0: 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c * Report the sel
c4b0: 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
c4c0: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 s a result of th
c4d0: 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 e ALPN negotiati
c4e0: 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 67 65 74 30 5f on */..SSL_get0_
c4f0: 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 73 alpn_selected(ss
c500: 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 l, &proto, &len)
c510: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
c520: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
c530: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
c540: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c NewStringObj("al
c550: 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f pn", -1));..Tcl_
c560: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
c570: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
c580: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
c590: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 ngObj((char *)pr
c5a0: 6f 74 6f 2c 20 28 69 6e 74 29 6c 65 6e 29 29 3b oto, (int)len));
c5b0: 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 .../* Get securi
c5c0: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 54 63 6c ty level */..Tcl
c5d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
c5e0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
c5f0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
c600: 69 6e 67 4f 62 6a 28 22 73 65 63 75 72 69 74 79 ingObj("security
c610: 6c 65 76 65 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 level", -1));..T
c620: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
c630: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
c640: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 objPtr, Tcl_NewI
c650: 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 ntObj(SSL_get_se
c660: 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c curity_level(ssl
c670: 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 )));. }..
c680: 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a /* Cipher info *
c690: 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 /. cipher = S
c6a0: 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 SL_get_current_c
c6b0: 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 ipher(ssl);.
c6c0: 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 if (cipher != NU
c6d0: 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b LL) {..char buf[
c6e0: 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 BUFSIZ] = {0};..
c6f0: 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 int bits, alg_bi
c700: 74 73 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 ts;...Tcl_ListOb
c710: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
c720: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
c730: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
c740: 22 63 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a "cipher", -1));.
c750: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
c760: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
c770: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
c780: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 wStringObj(SSL_C
c790: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 IPHER_get_name(c
c7a0: 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 09 54 ipher), -1));..T
c7b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
c7c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
c7d0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
c7e0: 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 6e 64 61 tringObj("standa
c7f0: 72 64 5f 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a rd_name", -1));.
c800: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
c810: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
c820: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
c830: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 wStringObj(SSL_C
c840: 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e IPHER_standard_n
c850: 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 ame(cipher), -1)
c860: 29 3b 0a 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f );...bits = SSL_
c870: 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28 CIPHER_get_bits(
c880: 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 cipher, &alg_bit
c890: 73 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a s);..Tcl_ListObj
c8a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
c8b0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
c8c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
c8d0: 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 bits", -1));..Tc
c8e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
c8f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
c900: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e bjPtr, Tcl_NewIn
c910: 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a 09 54 63 tObj(bits));..Tc
c920: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
c930: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
c940: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
c950: 72 69 6e 67 4f 62 6a 28 22 73 65 63 72 65 74 5f ringObj("secret_
c960: 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 bits", -1));..Tc
c970: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
c980: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
c990: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e bjPtr, Tcl_NewIn
c9a0: 74 4f 62 6a 28 61 6c 67 5f 62 69 74 73 29 29 3b tObj(alg_bits));
c9b0: 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 ../* alg_bits is
c9c0: 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 72 actual key secr
c9d0: 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 20 et bits. If use
c9e0: 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 20 bits and secret
c9f0: 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 73 (algorithm) bits
ca00: 20 64 69 66 66 65 72 2c 0a 20 20 20 20 20 20 20 differ,.
ca10: 20 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 the rest of
ca20: 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 the bits are fix
ca30: 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d ed, i.e. for lim
ca40: 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 ited export ciph
ca50: 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 ers (bits < 56)
ca60: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
ca70: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
ca80: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
ca90: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d _NewStringObj("m
caa0: 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 in_version", -1)
cab0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
cac0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
cad0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
cae0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
caf0: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 L_CIPHER_get_ver
cb00: 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 sion(cipher), -1
cb10: 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 49 ));...if (SSL_CI
cb20: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e PHER_description
cb30: 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 (cipher, buf, si
cb40: 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 zeof(buf)) != NU
cb50: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c LL) {.. Tcl_L
cb60: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
cb70: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
cb80: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
cb90: 67 4f 62 6a 28 22 64 65 73 63 72 69 70 74 69 6f gObj("descriptio
cba0: 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54 n", -1));.. T
cbb0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
cbc0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
cbd0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
cbe0: 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 tringObj(buf, -1
cbf0: 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 ));..}. }..
cc00: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 /* Session inf
cc10: 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e o */. session
cc20: 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 = SSL_get_sessi
cc30: 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 on(ssl);. if
cc40: 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c (session != NULL
cc50: 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 ) {..const unsig
cc60: 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 ned char *ticket
cc70: 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a ;..size_t len2;.
cc80: 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 .const unsigned
cc90: 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 char *session_id
cca0: 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 ;.../* Session i
ccb0: 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 nfo */..Tcl_List
ccc0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
ccd0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
cce0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
ccf0: 6a 28 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 j("session_reuse
cd00: 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c d", -1));..Tcl_L
cd10: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
cd20: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
cd30: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
cd40: 6a 28 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 j(SSL_session_re
cd50: 75 73 65 64 28 73 73 6c 29 29 29 3b 0a 0a 09 2f used(ssl)));.../
cd60: 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a * Session id */.
cd70: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
cd80: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
cd90: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
cda0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 wStringObj("sess
cdb0: 69 6f 6e 5f 69 64 22 2c 20 2d 31 29 29 3b 0a 09 ion_id", -1));..
cdc0: 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c session_id = SSL
cdd0: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 _SESSION_get0_id
cde0: 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e _context(session
cdf0: 2c 20 26 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 , &len);..Tcl_Li
ce00: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
ce10: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
ce20: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
ce30: 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 Obj(session_id,
ce40: 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 0a 09 2f 2a (int)len));.../*
ce50: 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 Session ticket
ce60: 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f */..SSL_SESSION_
ce70: 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 get0_ticket(sess
ce80: 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
ce90: 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f en2);..Tcl_ListO
cea0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
ceb0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
cec0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
ced0: 28 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 ("session_ticket
cee0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
cef0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
cf00: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
cf10: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
cf20: 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 Obj(ticket, (int
cf30: 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 52 ) len2));.../* R
cf40: 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e esumable session
cf50: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
cf60: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
cf70: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
cf80: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
cf90: 72 65 73 75 6d 61 62 6c 65 22 2c 20 2d 31 29 29 resumable", -1))
cfa0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
cfb0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
cfc0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
cfd0: 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 53 45 NewIntObj(SSL_SE
cfe0: 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 SSION_is_resumab
cff0: 6c 65 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a le(session)));..
d000: 09 2f 2a 20 53 74 61 72 74 20 74 69 6d 65 20 2a ./* Start time *
d010: 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
d020: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
d030: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
d040: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 NewStringObj("st
d050: 61 72 74 5f 74 69 6d 65 22 2c 20 2d 31 29 29 3b art_time", -1));
d060: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
d070: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
d080: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
d090: 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 ewLongObj(SSL_SE
d0a0: 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 SSION_get_time(s
d0b0: 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 ession)));.../*
d0c0: 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2a 2f Timeout value */
d0d0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
d0e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
d0f0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
d100: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 6d ewStringObj("tim
d110: 65 6f 75 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 eout", -1));..Tc
d120: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
d130: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
d140: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f bjPtr, Tcl_NewLo
d150: 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f ngObj(SSL_SESSIO
d160: 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 N_get_timeout(se
d170: 73 73 69 6f 6e 29 29 29 3b 0a 20 20 20 20 7d 0a ssion)));. }.
d180: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 .#if defined(HAV
d190: 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f E_SSL_COMPRESSIO
d1a0: 4e 29 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 N). /* Compre
d1b0: 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ssion info */.
d1c0: 20 20 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 comp = SSL_get
d1d0: 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 _current_compres
d1e0: 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 sion(ssl);. i
d1f0: 66 20 28 63 6f 6d 70 20 21 3d 20 4e 55 4c 4c 29 f (comp != NULL)
d200: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
d210: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
d220: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
d230: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 _NewStringObj("c
d240: 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 ompression", -1)
d250: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
d260: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
d270: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
d280: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
d290: 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 L_COMP_get_name(
d2a0: 63 6f 6d 70 29 2c 20 2d 31 29 29 3b 0a 09 63 6f comp), -1));..co
d2b0: 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 mp = SSL_get_cur
d2c0: 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 rent_expansion(s
d2d0: 73 6c 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 sl);..Tcl_ListOb
d2e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
d2f0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
d300: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
d310: 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 "expansion", -1)
d320: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
d330: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
d340: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
d350: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
d360: 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 L_COMP_get_name(
d370: 63 6f 6d 70 29 2c 20 2d 31 29 29 3b 0a 20 20 20 comp), -1));.
d380: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 }.#endif.. T
d390: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
d3a0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
d3b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
d3c0: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 OK;..clientData
d3d0: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a = clientData;.}.
d3e0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
d3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
d430: 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d VersionObjCmd -
d440: 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e - return version
d450: 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 string from Ope
d460: 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 nSSL.. *. * Resu
d470: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
d480: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
d490: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
d4a0: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
d4b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
d4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d4f0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
d500: 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d int.VersionObjCm
d510: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
d520: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
d530: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
d540: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
d550: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
d560: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
d570: 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 Ptr;.. dprint
d580: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
d590: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
d5a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e ewStringObj(OPEN
d5b0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 SSL_VERSION_TEXT
d5c0: 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53 , -1);. Tcl_S
d5d0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
d5e0: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 rp, objPtr);..
d5f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
d600: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
d610: 6c 69 65 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63 lientData;..objc
d620: 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d = objc;..objv =
d630: 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a objv;.}.../*. *
d640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d680: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 ---. *. * MiscOb
d690: 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d jCmd -- misc com
d6a0: 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 mands. *. * Resu
d6b0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
d6c0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
d6d0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
d6e0: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
d6f0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
d700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d730: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
d740: 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 int.MiscObjCmd(C
d750: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
d760: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
d770: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
d780: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
d790: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
d7a0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 static const ch
d7b0: 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 ar *commands []
d7c0: 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 = { "req", "strr
d7d0: 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 eq", NULL };.
d7e0: 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 enum command {
d7f0: 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c C_REQ, C_STRREQ,
d800: 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 C_DUMMY };.
d810: 69 6e 74 20 63 6d 64 2c 20 69 73 53 74 72 3b 0a int cmd, isStr;.
d820: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b char buffer[
d830: 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72 16384];.. dpr
d840: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
d850: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 . if (objc <
d860: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
d870: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
d880: 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d , objv, "subcomm
d890: 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 and ?args?");..r
d8a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
d8b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 . }. if (T
d8c0: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f cl_GetIndexFromO
d8d0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
d8e0: 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 1], commands, "c
d8f0: 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 63 6d 64 29 ommand", 0,&cmd)
d900: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
d910: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
d920: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73 53 74 . }.. isSt
d930: 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 r = (cmd == C_ST
d940: 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 RREQ);. switc
d950: 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 h ((enum command
d960: 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 ) cmd) {..case C
d970: 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 _REQ:..case C_ST
d980: 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 RREQ: {.. EVP
d990: 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c _PKEY *pkey=NULL
d9a0: 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 ;.. X509 *cer
d9b0: 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 t=NULL;.. X50
d9c0: 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 9_NAME *name=NUL
d9d0: 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 L;.. Tcl_Obj
d9e0: 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 69 6e **listv;.. in
d9f0: 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 t listc,i;...
da00: 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a BIO *out=NULL;.
da10: 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d .. char *k_C=
da20: 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c "",*k_ST="",*k_L
da30: 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f ="",*k_O="",*k_O
da40: 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b U="",*k_CN="",*k
da50: 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 _Email="";..
da60: 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 char *keyout,*pe
da70: 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 mout,*str;..
da80: 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 int keysize,seri
da90: 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a al=0,days=365;..
daa0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
dab0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
dac0: 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 0000000L.. BI
dad0: 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c GNUM *bne = NULL
dae0: 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 ;.. RSA *rsa
daf0: 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 = NULL;.#else..
db00: 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 EVP_PKEY_CTX
db10: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e *ctx = NULL;.#en
db20: 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f dif... if ((o
db30: 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e bjc<5) || (objc>
db40: 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 6)) {...Tcl_Wron
db50: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
db60: 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 2, objv, "keysi
db70: 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 ze keyfile certf
db80: 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 ile ?info?");...
db90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
dba0: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 ;.. }... i
dbb0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
dbc0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
dbd0: 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 v[2], &keysize)
dbe0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 != TCL_OK) {...r
dbf0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
dc00: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 .. }.. key
dc10: 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e out=Tcl_GetStrin
dc20: 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 g(objv[3]);..
dc30: 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 pemout=Tcl_GetS
dc40: 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a tring(objv[4]);.
dc50: 09 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 . if (isStr)
dc60: 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 {...Tcl_SetVar(i
dc70: 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c nterp,keyout,"",
dc80: 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 0);...Tcl_SetVar
dc90: 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 (interp,pemout,"
dca0: 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 ",0);.. }...
dcb0: 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 if (objc>=6)
dcc0: 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 {...if (Tcl_List
dcd0: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 ObjGetElements(i
dce0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a nterp, objv[5],.
dcf0: 09 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 ...&listc, &list
dd00: 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a v) != TCL_OK) {.
dd10: 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
dd20: 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 _ERROR;...}....i
dd30: 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 f ((listc%2) !=
dd40: 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 0) {... Tcl_S
dd50: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
dd60: 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 "Information lis
dd70: 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e t must have even
dd80: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d number of argum
dd90: 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ents",NULL);...
dda0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
ddb0: 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 ROR;...}...for (
ddc0: 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b i=0; i<listc; i+
ddd0: 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d =2) {... str=
dde0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
ddf0: 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 stv[i]);... i
de00: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 f (strcmp(str,"d
de10: 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 ays")==0) {....i
de20: 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
de30: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 mObj(interp,list
de40: 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 v[i+1],&days)!=T
de50: 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 CL_OK).... re
de60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
de70: 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
de80: 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 (strcmp(str,"ser
de90: 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 ial")==0) {....i
dea0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
deb0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 mObj(interp,list
dec0: 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 v[i+1],&serial)!
ded0: 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 =TCL_OK)....
dee0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
def0: 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
df00: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 f (strcmp(str,"C
df10: 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d ")==0) {....k_C=
df20: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
df30: 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
df40: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
df50: 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 mp(str,"ST")==0)
df60: 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 {....k_ST=Tcl_G
df70: 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
df80: 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
df90: 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
dfa0: 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 r,"L")==0) {....
dfb0: 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e k_L=Tcl_GetStrin
dfc0: 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
dfd0: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
dfe0: 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d strcmp(str,"O")=
dff0: 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c =0) {....k_O=Tcl
e000: 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
e010: 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
e020: 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
e030: 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a str,"OU")==0) {.
e040: 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 ...k_OU=Tcl_GetS
e050: 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
e060: 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
e070: 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
e080: 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f CN")==0) {....k_
e090: 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 CN=Tcl_GetString
e0a0: 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
e0b0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
e0c0: 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c trcmp(str,"Email
e0d0: 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d ")==0) {....k_Em
e0e0: 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e ail=Tcl_GetStrin
e0f0: 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
e100: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
e110: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
e120: 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 nterp,"Unknown p
e130: 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b arameter",NULL);
e140: 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ....return TCL_E
e150: 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 RROR;... }...
e160: 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 }.. }..#if OP
e170: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
e180: 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
e190: 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 0L.. bne = BN
e1a0: 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 _new();.. rsa
e1b0: 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 = RSA_new();..
e1c0: 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b pkey = EVP_PK
e1d0: 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 EY_new();.. i
e1e0: 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c f (bne == NULL |
e1f0: 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c | rsa == NULL ||
e200: 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c pkey == NULL ||
e210: 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e !BN_set_word(bn
e220: 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 e,RSA_F4) ||...!
e230: 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 RSA_generate_key
e240: 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 _ex(rsa, keysize
e250: 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 , bne, NULL) ||
e260: 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e !EVP_PKEY_assign
e270: 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 _RSA(pkey, rsa))
e280: 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 {...EVP_PKEY_fr
e290: 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 ee(pkey);.../* R
e2a0: 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 SA_free(rsa); fr
e2b0: 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f eed by EVP_PKEY_
e2c0: 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 free */...BN_fre
e2d0: 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 e(bne);.#else..
e2e0: 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 pkey = EVP_RS
e2f0: 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 A_gen((unsigned
e300: 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 int) keysize);..
e310: 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b ctx = EVP_PK
e320: 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c EY_CTX_new(pkey,
e330: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 NULL);.. if (
e340: 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 pkey == NULL ||
e350: 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 ctx == NULL || !
e360: 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f EVP_PKEY_keygen_
e370: 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 init(ctx) ||...!
e380: 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 EVP_PKEY_CTX_set
e390: 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 _rsa_keygen_bits
e3a0: 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c (ctx, keysize) |
e3b0: 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 | !EVP_PKEY_keyg
e3c0: 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 en(ctx, &pkey))
e3d0: 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 {...EVP_PKEY_fre
e3e0: 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 e(pkey);...EVP_P
e3f0: 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 KEY_CTX_free(ctx
e400: 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f );.#endif...Tcl_
e410: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
e420: 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 ,"Error generati
e430: 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c ng private key",
e440: 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 NULL);...return
e450: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
e460: 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 } else {...if (i
e470: 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 sStr) {... ou
e480: 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
e490: 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 mem());... PE
e4a0: 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 M_write_bio_Priv
e4b0: 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c ateKey(out,pkey,
e4c0: 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c NULL,NULL,0,NULL
e4d0: 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d ,NULL);... i=
e4e0: 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 BIO_read(out,buf
e4f0: 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 fer,sizeof(buffe
e500: 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 r)-1);... i=(
e510: 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 i<0) ? 0 : i;...
e520: 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c buffer[i]='\
e530: 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 0';... Tcl_Se
e540: 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f tVar(interp,keyo
e550: 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 ut,buffer,0);...
e560: 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 BIO_flush(ou
e570: 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 t);... BIO_fr
e580: 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 ee(out);...} els
e590: 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 e {... out=BI
e5a0: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 O_new(BIO_s_file
e5b0: 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 ());... BIO_w
e5c0: 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 rite_filename(ou
e5d0: 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 t,keyout);...
e5e0: 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 PEM_write_bio_P
e5f0: 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b rivateKey(out,pk
e600: 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e ey,NULL,NULL,0,N
e610: 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 ULL,NULL);...
e620: 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 /* PEM_write_bi
e630: 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 o_RSAPrivateKey(
e640: 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 out, rsa, NULL,
e650: 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e NULL, 0, NULL, N
e660: 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 ULL); */... B
e670: 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 IO_free_all(out)
e680: 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 ;.. .}....if ((c
e690: 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d ert=X509_new())=
e6a0: 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 =NULL) {... T
e6b0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
e6c0: 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 erp,"Error gener
e6d0: 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 ating certificat
e6e0: 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 e request",NULL)
e6f0: 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 ;... EVP_PKEY
e700: 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 _free(pkey);.#if
e710: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
e720: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
e730: 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 0000L... BN_f
e740: 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 ree(bne);.#endif
e750: 0a 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 ... return(TC
e760: 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 L_ERROR);...}...
e770: 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f .X509_set_versio
e780: 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e n(cert,2);...ASN
e790: 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 1_INTEGER_set(X5
e7a0: 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 09_get_serialNum
e7b0: 62 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c ber(cert),serial
e7c0: 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 );...X509_gmtime
e7d0: 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e _adj(X509_getm_n
e7e0: 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 otBefore(cert),0
e7f0: 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 );...X509_gmtime
e800: 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e _adj(X509_getm_n
e810: 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c otAfter(cert),(l
e820: 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 ong)60*60*24*day
e830: 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 s);...X509_set_p
e840: 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 ubkey(cert,pkey)
e850: 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 ;....name=X509_g
e860: 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 et_subject_name(
e870: 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e cert);....X509_N
e880: 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
e890: 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d _txt(name,"C", M
e8a0: 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
e8b0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
e8c0: 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 r *) k_C, -1, -1
e8d0: 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
e8e0: 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
e8f0: 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 xt(name,"ST", MB
e900: 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
e910: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
e920: 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 *) k_ST, -1, -1
e930: 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
e940: 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
e950: 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 xt(name,"L", MBS
e960: 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
e970: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
e980: 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 *) k_L, -1, -1,
e990: 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
e9a0: 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
e9b0: 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 (name,"O", MBSTR
e9c0: 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
e9d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
e9e0: 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_O, -1, -1, 0)
e9f0: 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
ea00: 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
ea10: 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 ame,"OU", MBSTRI
ea20: 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
ea30: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
ea40: 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_OU, -1, -1, 0)
ea50: 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
ea60: 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
ea70: 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 ame,"CN", MBSTRI
ea80: 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
ea90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
eaa0: 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_CN, -1, -1, 0)
eab0: 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
eac0: 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
ead0: 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 ame,"Email", MBS
eae0: 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
eaf0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
eb00: 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 *) k_Email, -1,
eb10: 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f -1, 0);....X509_
eb20: 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 set_subject_name
eb30: 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 (cert,name);....
eb40: 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 if (!X509_sign(c
eb50: 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 ert,pkey,EVP_sha
eb60: 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 256())) {...
eb70: 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b X509_free(cert);
eb80: 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f ... EVP_PKEY_
eb90: 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
eba0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
ebb0: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
ebc0: 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 000L... BN_fr
ebd0: 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
ebe0: 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 .. Tcl_SetRes
ebf0: 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f ult(interp,"Erro
ec00: 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 r signing certif
ec10: 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 icate",NULL);...
ec20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
ec30: 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 RROR;...}....if
ec40: 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 (isStr) {...
ec50: 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f out=BIO_new(BIO_
ec60: 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 s_mem());...
ec70: 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 PEM_write_bio_X5
ec80: 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 09(out,cert);...
ec90: 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f i=BIO_read(o
eca0: 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 ut,buffer,sizeof
ecb0: 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 (buffer)-1);...
ecc0: 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a i=(i<0) ? 0 :
ecd0: 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 i;... buffer
ece0: 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 [i]='\0';...
ecf0: 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 Tcl_SetVar(inter
ed00: 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c p,pemout,buffer,
ed10: 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 0);... BIO_fl
ed20: 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 ush(out);...
ed30: 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 BIO_free(out);..
ed40: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 .} else {...
ed50: 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f out=BIO_new(BIO_
ed60: 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 s_file());...
ed70: 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e BIO_write_filen
ed80: 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b ame(out,pemout);
ed90: 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 ... PEM_write
eda0: 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 _bio_X509(out,ce
edb0: 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 rt);... BIO_f
edc0: 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 ree_all(out);...
edd0: 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 }....X509_free(c
ede0: 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 ert);...EVP_PKEY
edf0: 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 _free(pkey);.#if
ee00: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
ee10: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
ee20: 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 0000L...BN_free(
ee30: 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 bne);.#endif..
ee40: 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 }..}..break;.
ee50: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 default:..bre
ee60: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 ak;. }. re
ee70: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
ee80: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
ee90: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a tData;.}.../****
eea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
eeb0: 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 /./* Init
eec0: 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a */./******
eed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
eee0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
eef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ef00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ef10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ef20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
ef30: 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 Tls_Free --. *.
ef40: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
ef50: 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 cleans up when
ef60: 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 a SSL socket bas
ef70: 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 ed channel. *.is
ef80: 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 closed and its
ef90: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 reference count
efa0: 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a falls below 1. *
efb0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
efc0: 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 none. *. * Side
efd0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 effects:. *.Free
efe0: 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a s all the state.
eff0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
f000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f030: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
f040: 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 d.Tls_Free(char
f050: 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 *blockPtr) {.
f060: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
f070: 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 = (State *)bloc
f080: 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e kPtr;.. dprin
f090: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
f0a0: 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 Tls_Clean(sta
f0b0: 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 tePtr);. ckfr
f0c0: 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a ee(blockPtr);.}.
f0d0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
f0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
f120: 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a Tls_Clean --. *
f130: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
f140: 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 re cleans up whe
f150: 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 n a SSL socket b
f160: 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 ased channel. *.
f170: 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 is closed and it
f180: 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e s reference coun
f190: 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e t falls below 1.
f1a0: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a This should. *
f1b0: 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 .be called synch
f1c0: 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 ronously by the
f1d0: 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 CloseProc, not i
f1e0: 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 n the. *.Eventua
f1f0: 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b llyFree callback
f200: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
f210: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.none. *. * S
f220: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
f230: 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 Frees all the st
f240: 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ate. *. *-------
f250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
f290: 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 .void Tls_Clean(
f2a0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 State *statePtr)
f2b0: 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 {. dprintf("
f2c0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f Called");.. /
f2d0: 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 *. * we're a
f2e0: 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 ssuming here tha
f2f0: 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 t we're single-t
f300: 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a hreaded. */.
f310: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
f320: 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f ->timer != (Tcl_
f330: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c TimerToken) NULL
f340: 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 ) {..Tcl_DeleteT
f350: 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 imerHandler(stat
f360: 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 ePtr->timer);..s
f370: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
f380: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
f390: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
f3a0: 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 bio) {../* This
f3b0: 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 will call SSL_sh
f3c0: 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 utdown. Bug 1414
f3d0: 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 045 */..dprintf(
f3e0: 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 "BIO_free_all(%p
f3f0: 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 )", statePtr->bi
f400: 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c o);..BIO_free_al
f410: 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 l(statePtr->bio)
f420: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ;..statePtr->bio
f430: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
f440: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
f450: 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 >ssl) {..dprintf
f460: 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c ("SSL_free(%p)",
f470: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b statePtr->ssl);
f480: 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 ..SSL_free(state
f490: 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 Ptr->ssl);..stat
f4a0: 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c ePtr->ssl = NULL
f4b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
f4c0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b statePtr->ctx) {
f4d0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 ..SSL_CTX_free(s
f4e0: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 tatePtr->ctx);..
f4f0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 statePtr->ctx =
f500: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
f510: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 if (statePtr->ca
f520: 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 llback) {..Tcl_D
f530: 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ecrRefCount(stat
f540: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
f550: 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c ..statePtr->call
f560: 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 back = NULL;.
f570: 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
f580: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b Ptr->password) {
f590: 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 ..Tcl_DecrRefCou
f5a0: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 nt(statePtr->pas
f5b0: 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 sword);..statePt
f5c0: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 r->password = NU
f5d0: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 LL;. }.. d
f5e0: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
f5f0: 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d g");.}.../*. *--
f600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f640: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 -. *. * Tls_Init
f650: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 --. *. *.This i
f660: 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 s a package init
f670: 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 ialization proce
f680: 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 dure, which is c
f690: 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 alled. *.by Tcl
f6a0: 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 when this packag
f6b0: 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 e is to be added
f6c0: 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 to an interpret
f6d0: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
f6e0: 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 s: Ssl configur
f6f0: 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a ed and loaded. *
f700: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
f710: 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 :. *. create the
f720: 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e ssl command, in
f730: 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e itialize ssl con
f740: 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d text. *. *------
f750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
f790: 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 /.DLLEXPORT int
f7a0: 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 Tls_Init(Tcl_Int
f7b0: 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 erp *interp) {.
f7c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c const char tl
f7d0: 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d sTclInitScript[]
f7e0: 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 = {.#include "t
f7f0: 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a ls.tcl.h"..0x00.
f800: 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 };.. dpri
f810: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
f820: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 /*. * We
f830: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 54 63 only support Tc
f840: 6c 20 38 2e 34 20 6f 72 20 6e 65 77 65 72 0a 20 l 8.4 or newer.
f850: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 0a */. if (.
f860: 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 #ifdef USE_TCL_S
f870: 54 55 42 53 0a 09 54 63 6c 5f 49 6e 69 74 53 74 TUBS..Tcl_InitSt
f880: 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 ubs(interp, "8.4
f890: 22 2c 20 30 29 0a 23 65 6c 73 65 0a 09 54 63 6c ", 0).#else..Tcl
f8a0: 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 _PkgRequire(inte
f8b0: 72 70 2c 20 22 54 63 6c 22 2c 20 22 38 2e 34 2d rp, "Tcl", "8.4-
f8c0: 22 2c 20 30 29 0a 23 65 6e 64 69 66 0a 09 20 3d ", 0).#endif.. =
f8d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
f8e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
f8f0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c }.. if (TlsL
f900: 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c ibInit(0) != TCL
f910: 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 _OK) {..Tcl_Appe
f920: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
f930: 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 "could not init
f940: 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 ialize SSL libra
f950: 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ry", NULL);..ret
f960: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
f970: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 }.. Tcl_Cr
f980: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
f990: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 nterp, "tls::cip
f9a0: 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 hers", CiphersOb
f9b0: 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
f9c0: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
f9d0: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
f9e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
f9f0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
fa00: 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 rp, "tls::connec
fa10: 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f tion", Connectio
fa20: 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c nInfoObjCmd, (Cl
fa30: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
fa40: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
fa50: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
fa60: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
fa70: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
fa80: 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e :handshake", Han
fa90: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 dshakeObjCmd, (C
faa0: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
fab0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
fac0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
fad0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
fae0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
faf0: 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 ::import", Impor
fb00: 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 tObjCmd, (Client
fb10: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
fb20: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
fb30: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
fb40: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
fb50: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 nterp, "tls::uni
fb60: 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 mport", Unimport
fb70: 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
fb80: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
fb90: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
fba0: 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
fbb0: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
fbc0: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 terp, "tls::stat
fbd0: 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d us", StatusObjCm
fbe0: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
fbf0: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
fc00: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
fc10: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
fc20: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
fc30: 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c "tls::version",
fc40: 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 VersionObjCmd,
fc50: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
fc60: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
fc70: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
fc80: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
fc90: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
fca0: 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f ls::misc", MiscO
fcb0: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
fcc0: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
fcd0: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
fce0: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
fcf0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
fd00: 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f erp, "tls::proto
fd10: 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 cols", Protocols
fd20: 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
fd30: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
fd40: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
fd50: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e LL);.. if (in
fd60: 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 terp) {..Tcl_Eva
fd70: 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c l(interp, tlsTcl
fd80: 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20 InitScript);.
fd90: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 54 }.. return(T
fda0: 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e cl_PkgProvide(in
fdb0: 74 65 72 70 2c 20 22 74 6c 73 22 2c 20 50 41 43 terp, "tls", PAC
fdc0: 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 29 3b 0a KAGE_VERSION));.
fdd0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
fde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
fe10: 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e *. *.Tls_SafeIn
fe20: 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d it --. *. *.----
fe30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
fe60: 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 .Standard proced
fe70: 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20 ure required by
fe80: 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 'load'.. *.Initi
fe90: 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 alizes this exte
fea0: 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 nsion for a safe
feb0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a interpreter.. *
fec0: 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
fed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fef0: 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 -*. *. *.Side ef
ff00: 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 fects:. *..As of
ff10: 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 'Tls_Init'. *.
ff20: 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 *.Result:. *..A
ff30: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 standard Tcl err
ff40: 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d or code.. *. *--
ff50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ff60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ff70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ff80: 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 ----*. */.DLLEXP
ff90: 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 ORT int Tls_Safe
ffa0: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 Init(Tcl_Interp
ffb0: 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 *interp) {. d
ffc0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
ffd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 6c 73 ;. return(Tls
ffe0: 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b 0a _Init(interp));.
fff0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
10000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
10030 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 *. *.TlsLibInit
10040 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d --. *. *.------
10050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 ----------*. *.I
10080 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c nitializes SSL l
10090 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 ibrary once per
100a0 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d application. *.-
100b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
100c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
100d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
100e0 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 . *. *.Side effe
100f0 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c cts:. *..initial
10100 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 izes SSL library
10110 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 . *. *.Result:.
10120 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *..none. *. *---
10130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10160 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ---*. */.static
10170 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 int TlsLibInit(i
10180 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 nt uninitialize)
10190 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e {. static in
101a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 t initialized =
101b0 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75 0;. int statu
101c0 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 s = TCL_OK;.#if
101d0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
101e0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
101f0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
10200 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f . size_t num_
10210 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 locks;.#endif..
10220 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c if (uninitial
10230 69 7a 65 29 20 7b 0a 20 20 20 20 20 20 20 20 69 ize) {. i
10240 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 f (!initialized)
10250 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 {. d
10260 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f printf("Asked to
10270 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 uninitialize, b
10280 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e ut we are not in
10290 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 20 20 itialized");..
102a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e return
102b0 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 (TCL_OK);.
102c0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 64 70 72 }.. dpr
102d0 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 intf("Asked to u
102e0 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a ninitialize");..
102f0 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
10300 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
10310 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
10320 41 44 53 29 0a 20 20 20 20 20 20 20 20 54 63 6c ADS). Tcl
10330 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 _MutexLock(&init
10340 5f 6d 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 _mx);.. i
10350 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 20 20 20 20 f (locks) {.
10360 20 20 20 20 20 20 20 20 66 72 65 65 28 6c 6f 63 free(loc
10370 6b 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 ks);.
10380 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 20 locks = NULL;.
10390 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 73 locks
103a0 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 Count = 0;.
103b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 }.#endif.
103c0 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 initialized
103d0 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 = 0;..#if define
103e0 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
103f0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
10400 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 20 L_THREADS).
10410 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f Tcl_MutexUnlo
10420 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 ck(&init_mx);.#e
10430 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 72 65 ndif.. re
10440 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 turn(TCL_OK);.
10450 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 }.. if (ini
10460 74 69 61 6c 69 7a 65 64 29 20 7b 0a 20 20 20 20 tialized) {.
10470 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
10480 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20 63 led, but using c
10490 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a 20 ached value");.
104a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 28 73 74 return(st
104b0 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 atus);. }..
104c0 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
104d0 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 d");..#if define
104e0 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
104f0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
10500 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 L_THREADS). T
10510 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e cl_MutexLock(&in
10520 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 it_mx);.#endif.
10530 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d initialized =
10540 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 1;..#if defined
10550 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
10560 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
10570 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 _THREADS). nu
10580 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 m_locks = 1;.
10590 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 locksCount = (i
105a0 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 nt) num_locks;.
105b0 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f locks = mallo
105c0 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 c(sizeof(*locks)
105d0 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 * num_locks);.
105e0 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c memset(locks,
105f0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 0, sizeof(*lock
10600 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b s) * num_locks);
10610 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
10620 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 Initialize BOTH
10630 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 libcrypto and li
10640 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 bssl. */. OPE
10650 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 NSSL_init_ssl(OP
10660 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f ENSSL_INIT_LOAD_
10670 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 SSL_STRINGS | OP
10680 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f ENSSL_INIT_LOAD_
10690 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 CRYPTO_STRINGS..
106a0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 | OPENSSL_INIT_A
106b0 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c DD_ALL_CIPHERS |
106c0 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 OPENSSL_INIT_AD
106d0 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e D_ALL_DIGESTS, N
106e0 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e ULL);.. BIO_n
106f0 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b ew_tcl(NULL, 0);
10700 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 ..#if 0. /*.
10710 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 * XXX:TODO:
10720 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65 Remove this code
10730 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 and replace it
10740 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20 with a check.
10750 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 * for enough e
10760 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f ntropy and do no
10770 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 t try to create
10780 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 our own. * t
10790 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a errible entropy.
107a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 */. /*.
107b0 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 * Seed the r
107c0 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e andom number gen
107d0 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 erator in the SS
107e0 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 L library,.
107f0 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 * using the do/w
10800 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 hile construct b
10810 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 ecause of the bu
10820 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 g note in the.
10830 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 * OpenSSL FAQ
10840 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f at http://www.o
10850 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f penssl.org/suppo
10860 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 rt/faq.html#USER
10870 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 1. *. *
10880 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 The crux of the
10890 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 problem is that
108a0 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e Solaris 7 does n
108b0 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a ot have a. *
108c0 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 /dev/random or
108d0 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 /dev/urandom dev
108e0 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 ice so it cannot
108f0 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 gather enough.
10900 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 * entropy fr
10910 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 om the RAND_seed
10920 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 () when TLS init
10930 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 ializes and refu
10940 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f ses. * to go
10950 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 further. Earlie
10960 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 r versions of Op
10970 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e enSSL carried on
10980 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 regardless..
10990 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 */. srand((
109a0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 unsigned int) ti
109b0 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 me((time_t *) NU
109c0 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 LL));. do {..
109d0 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 for (i = 0; i <
109e0 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 16; i++) {..
109f0 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 rnd_seed[i] = 1
10a00 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 + (char) (255.0
10a10 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d * rand()/(RAND_M
10a20 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 AX+1.0));..}..RA
10a30 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 ND_seed(rnd_seed
10a40 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 , sizeof(rnd_see
10a50 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 d));. } while
10a60 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 (RAND_status()
10a70 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 != 1);.#endif..#
10a80 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
10a90 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
10aa0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
10ab0 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e DS)..Tcl_MutexUn
10ac0 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a lock(&init_mx);.
10ad0 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 #endif...return(
10ae0 73 74 61 74 75 73 29 3b 0a 7d 0a status);.}.