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 54 68 72 65 61 64 2d 53 61 66 /*. * Thread-Saf
0780: 65 20 54 4c 53 20 43 6f 64 65 0a 20 2a 2f 0a 0a e TLS Code. */..
0790: 23 69 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 #ifdef TCL_THREA
07a0: 44 53 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 53 DS.#define OPENS
07b0: 53 4c 5f 54 48 52 45 41 44 5f 44 45 46 49 4e 45 SL_THREAD_DEFINE
07c0: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e S.#include <open
07d0: 73 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e 66 2e ssl/opensslconf.
07e0: 68 3e 0a 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 h>..#ifdef OPENS
07f0: 53 4c 5f 54 48 52 45 41 44 53 0a 23 69 6e 63 6c SL_THREADS.#incl
0800: 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 79 ude <openssl/cry
0810: 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 pto.h>.#include
0820: 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a <openssl/ssl.h>.
0830: 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65 64 20 ./*. * Threaded
0840: 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75 69 72 operation requir
0850: 65 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c 6c 62 es locking callb
0860: 61 63 6b 73 0a 20 2a 20 42 61 73 65 64 20 66 72 acks. * Based fr
0870: 6f 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79 70 74 om /crypto/crypt
0880: 6c 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53 53 4c lib.c of OpenSSL
0890: 20 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c 2e 0a and NSOpenSSL..
08a0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f */..static Tcl_
08b0: 4d 75 74 65 78 20 2a 6c 6f 63 6b 73 20 3d 20 4e Mutex *locks = N
08c0: 55 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 ULL;.static int
08d0: 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a locksCount = 0;.
08e0: 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 static Tcl_Mutex
08f0: 20 69 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64 69 66 init_mx;.#endif
0900: 20 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 /* OPENSSL_THRE
0910: 41 44 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a ADS */.#endif /*
0920: 20 54 43 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a TCL_THREADS */.
0930: 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
0940: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 61 6c ********/./* Cal
0950: 6c 62 61 63 6b 73 20 20 20 20 20 20 20 20 2a 2f lbacks */
0960: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
0970: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d ******/../*. *--
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09c0: 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 43 61 6c -. *. * Eval Cal
09d0: 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 20 2d 2d lback Command --
09e0: 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63 61 6c 6c . *. *.Eval call
09f0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 back command and
0a00: 20 63 61 74 63 68 20 61 6e 79 20 65 72 72 6f 72 catch any error
0a10: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
0a20: 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e 64 20 . *.0 = Command
0a30: 72 65 74 75 72 6e 65 64 20 66 61 69 6c 20 6f 72 returned fail or
0a40: 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 eval returned T
0a50: 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 20 3d 20 CL_ERROR. *.1 =
0a60: 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 Command returned
0a70: 20 73 75 63 63 65 73 73 20 6f 72 20 65 76 61 6c success or eval
0a80: 20 72 65 74 75 72 6e 65 64 20 54 43 4c 5f 4f 4b returned TCL_OK
0a90: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
0aa0: 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75 61 74 65 cts:. *.Evaluate
0ab0: 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 s callback comma
0ac0: 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d nd. *. *--------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
0b10: 73 74 61 74 69 63 20 69 6e 74 0a 45 76 61 6c 43 static int.EvalC
0b20: 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 6e 74 65 allback(Tcl_Inte
0b30: 72 70 20 2a 69 6e 74 65 72 70 2c 20 53 74 61 74 rp *interp, Stat
0b40: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 54 63 6c e *statePtr, Tcl
0b50: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29 20 7b 0a _Obj *cmdPtr) {.
0b60: 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 6f 6b int code, ok
0b70: 20 3d 20 30 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 = 0;.. Tcl_P
0b80: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
0b90: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
0ba0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
0bb0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
0bc0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 ePtr);.. /* E
0bd0: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 val callback wit
0be0: 68 20 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b h success for ok
0bf0: 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 or return value
0c00: 20 31 2c 20 66 61 69 6c 20 66 6f 72 20 65 72 72 1, fail for err
0c10: 6f 72 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c or or return val
0c20: 75 65 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c 5f ue 0 */. Tcl_
0c30: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 ResetResult(inte
0c40: 72 70 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 rp);. code =
0c50: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e Tcl_EvalObjEx(in
0c60: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 terp, cmdPtr, TC
0c70: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a L_EVAL_GLOBAL);.
0c80: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 if (code ==
0c90: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 43 68 TCL_OK) {../* Ch
0ca0: 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72 20 72 eck result for r
0cb0: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 eturn value */..
0cc0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 20 Tcl_Obj *result
0cd0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 = Tcl_GetObjResu
0ce0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 66 20 lt(interp);..if
0cf0: 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 20 (result == NULL
0d00: 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f || Tcl_GetIntFro
0d10: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 mObj(interp, res
0d20: 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c ult, &ok) != TCL
0d30: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b 20 3d _OK) {.. ok =
0d40: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 1;..}. } els
0d50: 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20 e {../* Error -
0d60: 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 reject the certi
0d70: 66 69 63 61 74 65 20 2a 2f 0a 23 69 66 20 28 54 ficate */.#if (T
0d80: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
0d90: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d == 8) && (TCL_M
0da0: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 INOR_VERSION < 6
0db0: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e )..Tcl_Backgroun
0dc0: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a dError(interp);.
0dd0: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 #else..Tcl_Backg
0de0: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 roundException(i
0df0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 nterp, code);.#e
0e00: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ndif. }..
0e10: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
0e20: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
0e30: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 r);. Tcl_Rele
0e40: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
0e50: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 interp);. re
0e60: 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a turn ok;.}.../*.
0e70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0eb0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f -----. *. * Info
0ec0: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 Callback --. *.
0ed0: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 *.Monitors SSL c
0ee0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 onnection proces
0ef0: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
0f00: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
0f10: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
0f20: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
0f30: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
0f40: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f80: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
0f90: 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 void.InfoCallbac
0fa0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
0fb0: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 , int where, int
0fc0: 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 ret) {. Stat
0fd0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
0fe0: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 tate*)SSL_get_ap
0ff0: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 p_data((SSL *)ss
1000: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 l);. Tcl_Inte
1010: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
1020: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
1030: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
1040: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 tr;. char *ma
1050: 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 jor; char *minor
1060: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
1070: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
1080: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
1090: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
10a0: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e j*)NULL)..return
10b0: 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 ;.. if (where
10c0: 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 & SSL_CB_HANDSH
10d0: 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 AKE_START) {..ma
10e0: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 jor = "handshake
10f0: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 ";..minor = "sta
1100: 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 rt";. } else
1110: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
1120: 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e CB_HANDSHAKE_DON
1130: 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 E) {..major = "h
1140: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f andshake";..mino
1150: 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 r = "done";.
1160: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 } else {..if (wh
1170: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 ere & SSL_CB_ALE
1180: 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c RT)..major = "al
1190: 65 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 ert";..else if (
11a0: 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 where & SSL_ST_C
11b0: 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 ONNECT).major =
11c0: 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 "connect";..else
11d0: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c if (where & SSL
11e0: 5f 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a _ST_ACCEPT)..maj
11f0: 6f 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 or = "accept";..
1200: 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d else.....major =
1210: 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 "unknown";...if
1220: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 (where & SSL_CB
1230: 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 _READ)..minor =
1240: 22 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 "read";..else if
1250: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 (where & SSL_CB
1260: 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d _WRITE)..minor =
1270: 20 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 "write";..else
1280: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
1290: 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 CB_LOOP)..minor
12a0: 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 = "loop";..else
12b0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
12c0: 43 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 CB_EXIT)..minor
12d0: 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 = "exit";..else.
12e0: 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b ....minor = "unk
12f0: 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 nown";. }..
1300: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
1310: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 and to eval */.
1320: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
1330: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
1340: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
1350: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1360: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1370: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1380: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1390: 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 "info", -1));.
13a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
13b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
13c0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
13d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
13e0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
13f0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
1400: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lf), -1));. T
1410: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1420: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1430: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
1440: 74 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 tringObj(major,
1450: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
1460: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1470: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1480: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
1490: 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b Obj(minor, -1));
14a0: 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 .. if (where
14b0: 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 & SSL_CB_ALERT)
14c0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
14d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
14e0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
14f0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1500: 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 j(SSL_alert_desc
1510: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 _string_long(ret
1520: 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ), -1));..Tcl_Li
1530: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1540: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1550: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
1560: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 tringObj(SSL_ale
1570: 72 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c rt_type_string_l
1580: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a ong(ret), -1));.
1590: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
15a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
15b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
15c0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
15d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c NewStringObj(SSL
15e0: 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f _state_string_lo
15f0: 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 ng(ssl), -1));..
1600: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1610: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1620: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
1630: 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 StringObj("info"
1640: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 , -1));. }..
1650: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
1660: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 ack command */.
1670: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
1680: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
1690: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e EvalCallback(in
16a0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
16b0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c cmdPtr);. Tcl
16c0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
16d0: 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a dPtr);.}.../*. *
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1720: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 ---. *. * Messag
1730: 65 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a eCallback --. *.
1740: 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 *.Monitors SSL
1750: 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 protocol message
1760: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
1770: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
1780: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
1790: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
17a0: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
17b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17f0: 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 ----. */.#ifndef
1800: 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f OPENSSL_NO_SSL_
1810: 54 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 TRACE.static voi
1820: 64 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 d.MessageCallbac
1830: 6b 28 69 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 k(int write_p, i
1840: 6e 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 nt version, int
1850: 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f content_type, co
1860: 6e 73 74 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 nst void *buf, s
1870: 69 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a ize_t len, SSL *
1880: 73 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 ssl, void *arg)
1890: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
18a0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
18b0: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 arg;. Tcl_Int
18c0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
18d0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
18e0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
18f0: 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 Ptr;. char *v
1900: 65 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 er, *type;. B
1910: 49 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 IO *bio;. cha
1920: 72 20 62 75 66 66 65 72 5b 31 35 30 30 30 5d 3b r buffer[15000];
1930: 0a 20 20 20 20 62 75 66 66 65 72 5b 30 5d 20 3d . buffer[0] =
1940: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 0;.. dprintf
1950: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
1960: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
1970: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f allback == (Tcl_
1980: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 Obj*)NULL)..retu
1990: 72 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 rn;.. switch(
19a0: 76 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 20 4f version) {.#if O
19b0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
19c0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
19d0: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 00L && !defined(
19e0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 NO_SSL2) && !def
19f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
1a00: 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 53 SSL2). case S
1a10: 53 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 SL2_VERSION:..ve
1a20: 72 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 r = "SSLv2";..br
1a30: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
1a40: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 !defined(NO_SSL3
1a50: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
1a60: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 ENSSL_NO_SSL3).
1a70: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 56 45 52 case SSL3_VER
1a80: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 SION:..ver = "SS
1a90: 4c 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 Lv3";..break;.#e
1aa0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c ndif. case TL
1ab0: 53 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 S1_VERSION:..ver
1ac0: 20 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 = "TLSv1";..bre
1ad0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 ak;. case TLS
1ae0: 31 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 1_1_VERSION:..ve
1af0: 72 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 r = "TLSv1.1";..
1b00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1b10: 54 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a TLS1_2_VERSION:.
1b20: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 .ver = "TLSv1.2"
1b30: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1b40: 73 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f se TLS1_3_VERSIO
1b50: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 N:..ver = "TLSv1
1b60: 2e 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 .3";..break;.
1b70: 20 63 61 73 65 20 30 3a 0a 09 76 65 72 20 3d 20 case 0:..ver =
1b80: 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a "none";..break;.
1b90: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 76 65 default:..ve
1ba0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 r = "unknown";..
1bb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 break;. }..
1bc0: 20 20 73 77 69 74 63 68 20 28 63 6f 6e 74 65 6e switch (conten
1bd0: 74 5f 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61 t_type) {. ca
1be0: 73 65 20 53 53 4c 33 5f 52 54 5f 48 45 41 44 45 se SSL3_RT_HEADE
1bf0: 52 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 64 R:..type = "Head
1c00: 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 er";..break;.
1c10: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e case SSL3_RT_IN
1c20: 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 NER_CONTENT_TYPE
1c30: 3a 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 :..type = "Inner
1c40: 20 43 6f 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a Content Type";.
1c50: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 .break;. case
1c60: 20 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47 45 5f SSL3_RT_CHANGE_
1c70: 43 49 50 48 45 52 5f 53 50 45 43 3a 0a 09 74 79 CIPHER_SPEC:..ty
1c80: 70 65 20 3d 20 22 43 68 61 6e 67 65 20 43 69 70 pe = "Change Cip
1c90: 68 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 her";..break;.
1ca0: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 case SSL3_RT_A
1cb0: 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d 20 22 41 LERT:..type = "A
1cc0: 6c 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 lert";..break;.
1cd0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f case SSL3_RT_
1ce0: 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79 70 65 HANDSHAKE:..type
1cf0: 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22 3b 0a = "Handshake";.
1d00: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 .break;. case
1d10: 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 43 41 SSL3_RT_APPLICA
1d20: 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 70 65 TION_DATA:..type
1d30: 20 3d 20 22 41 70 70 20 44 61 74 61 22 3b 0a 09 = "App Data";..
1d40: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1d50: 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45 DTLS1_RT_HEARTBE
1d60: 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 AT:..type = "Hea
1d70: 72 74 62 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b rtbeat";..break;
1d80: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 . default:..t
1d90: 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b ype = "unknown";
1da0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e . }.. /* N
1db0: 65 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d eeds compile tim
1dc0: 65 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 e option "enable
1dd0: 2d 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a -ssl-trace". */.
1de0: 20 20 20 20 69 66 20 28 28 62 69 6f 20 3d 20 42 if ((bio = B
1df0: 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d IO_new(BIO_s_mem
1e00: 28 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a ())) != NULL) {.
1e10: 09 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 .int n;..SSL_tra
1e20: 63 65 28 77 72 69 74 65 5f 70 2c 20 76 65 72 73 ce(write_p, vers
1e30: 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 ion, content_typ
1e40: 65 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c e, buf, len, ssl
1e50: 2c 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a , (void *)bio);.
1e60: 09 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 .n = BIO_read(bi
1e70: 6f 2c 20 62 75 66 66 65 72 2c 20 6d 69 6e 28 42 o, buffer, min(B
1e80: 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 2c IO_pending(bio),
1e90: 20 31 34 39 39 39 29 29 3b 0a 09 6e 20 3d 20 28 14999));..n = (
1ea0: 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 n<0) ? 0 : n;..b
1eb0: 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 uffer[n] = 0;..(
1ec0: 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 void)BIO_flush(b
1ed0: 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28 62 io);..BIO_free(b
1ee0: 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 2f io);. }.. /
1ef0: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 * Create command
1f00: 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 to eval */.
1f10: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
1f20: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
1f30: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 tr->callback);.
1f40: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
1f50: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
1f60: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
1f70: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 65 NewStringObj("me
1f80: 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20 ssage", -1));.
1f90: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1fa0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1fb0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
1fc0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1fd0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
1fe0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
1ff0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lf), -1));. T
2000: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2010: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2020: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
2030: 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65 5f 70 tringObj(write_p
2040: 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52 65 63 ? "Sent" : "Rec
2050: 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20 eived", -1));.
2060: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2070: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2080: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2090: 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65 72 2c ewStringObj(ver,
20a0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
20b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
20c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
20d0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
20e0: 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29 29 3b gObj(type, -1));
20f0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2100: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2110: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
2120: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 l_NewStringObj(b
2130: 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 uffer, -1));..
2140: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
2150: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
2160: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
2170: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
2180: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
2190: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
21a0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
21b0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
21c0: 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c Ptr);.}.#endif..
21d0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2220: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d VerifyCallback -
2230: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 -. *. *.Monitors
2240: 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65 SSL certificate
2250: 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63 validation proc
2260: 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 6f 6e ess. Used to con
2270: 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 68 61 trol the. *.beha
2280: 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 53 53 vior when the SS
2290: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 66 6c L_VERIFY_PEER fl
22a0: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 ag is set. This
22b0: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 68 65 is called. *.whe
22c0: 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63 never a certific
22d0: 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 ate is inspected
22e0: 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 61 or decided inva
22f0: 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f 72 0a lid. Called for.
2300: 20 2a 09 65 61 63 68 20 63 65 72 74 69 66 69 63 *.each certific
2310: 61 74 65 20 69 6e 20 74 68 65 20 63 65 72 74 20 ate in the cert
2320: 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 68 65 chain.. *. * Che
2330: 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69 66 69 63 cks:. *.certific
2340: 61 74 65 20 63 68 61 69 6e 20 69 73 20 63 68 65 ate chain is che
2350: 63 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 cked starting wi
2360: 74 68 20 74 68 65 20 64 65 65 70 65 73 74 20 6e th the deepest n
2370: 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 esting level. *.
2380: 20 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63 (the root CA c
2390: 65 72 74 69 66 69 63 61 74 65 29 20 61 6e 64 20 ertificate) and
23a0: 77 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f worked upward to
23b0: 20 74 68 65 20 70 65 65 72 27 73 20 63 65 72 74 the peer's cert
23c0: 69 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 ificate.. *.All
23d0: 73 69 67 6e 61 74 75 72 65 73 20 61 72 65 20 76 signatures are v
23e0: 61 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69 alid, current ti
23f0: 6d 65 20 69 73 20 77 69 74 68 69 6e 20 66 69 72 me is within fir
2400: 73 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69 st and last vali
2410: 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68 dity time.. *.Ch
2420: 65 63 6b 20 74 68 61 74 20 74 68 65 20 63 65 72 eck that the cer
2430: 74 69 66 69 63 61 74 65 20 69 73 20 69 73 73 75 tificate is issu
2440: 65 64 20 62 79 20 74 68 65 20 69 73 73 75 65 72 ed by the issuer
2450: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73 certificate iss
2460: 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 uer.. *.Check th
2470: 65 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 e revocation sta
2480: 74 75 73 20 66 6f 72 20 65 61 63 68 20 63 65 72 tus for each cer
2490: 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65 tificate.. *.Che
24a0: 63 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79 20 ck the validity
24b0: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c of the given CRL
24c0: 20 61 6e 64 20 74 68 65 20 63 65 72 74 20 72 65 and the cert re
24d0: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e vocation status.
24e0: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f . *.Check the po
24f0: 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68 licies of all th
2500: 65 20 63 65 72 74 69 66 69 63 61 74 65 73 0a 20 e certificates.
2510: 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65 *. * Args. *.pre
2520: 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61 verify_ok indica
2530: 74 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20 tes whether the
2540: 63 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69 certificate veri
2550: 66 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20 fication passed
2560: 28 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20 (1) or not (0).
2570: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
2580: 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e .A callback boun
2590: 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 d to the socket
25a0: 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f may return one o
25b0: 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20 f:. *. 0...-
25c0: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
25d0: 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 is deemed invali
25e0: 64 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63 61 d, send verifica
25f0: 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69 tion. *.... fai
2600: 6c 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65 lure alert to pe
2610: 65 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 er, and terminat
2620: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 e handshake.. *.
2630: 20 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 1...- the ce
2640: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 rtificate is dee
2650: 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69 med valid, conti
2660: 6e 75 65 20 77 69 74 68 20 68 61 6e 64 73 68 61 nue with handsha
2670: 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 ke.. *. empty
2680: 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 string.- no cha
2690: 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 63 61 nge to certifica
26a0: 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a te validation. *
26b0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
26c0: 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 :. *.The err fie
26d0: 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e ld of the curren
26e0: 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 tly operative St
26f0: 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 ate is set. *.
2700: 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 to a string desc
2710: 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e ribing the SSL n
2720: 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 egotiation failu
2730: 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d re reason. *. *-
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2780: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
2790: 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b t.VerifyCallback
27a0: 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 (int ok, X509_ST
27b0: 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a ORE_CTX *ctx) {.
27c0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
27d0: 50 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a Ptr;. SSL *
27e0: 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30 ssl..= (SSL*)X50
27f0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 9_STORE_CTX_get_
2800: 65 78 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c ex_data(ctx, SSL
2810: 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 _get_ex_data_X50
2820: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 9_STORE_CTX_idx(
2830: 29 29 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63 ));. X509 *c
2840: 65 72 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 ert..= X509_STOR
2850: 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e E_CTX_get_curren
2860: 74 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20 t_cert(ctx);.
2870: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
2880: 09 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 .= (State*)SSL_g
2890: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29 et_app_data(ssl)
28a0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
28b0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
28c0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
28d0: 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35 int depth..= X5
28e0: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
28f0: 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78 _error_depth(ctx
2900: 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09 );. int err..
2910: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 = X509_STORE_CTX
2920: 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b _get_error(ctx);
2930: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 .. dprintf("V
2940: 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29 3b erify: %d", ok);
2950: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
2960: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c tr->vcmd == (Tcl
2970: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69 _Obj*)NULL) {..i
2980: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c f (statePtr->vfl
2990: 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59 ags & SSL_VERIFY
29a0: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 _FAIL_IF_NO_PEER
29b0: 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 72 65 _CERT) {.. re
29c0: 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 turn ok;..} else
29d0: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31 {.. return 1
29e0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
29f0: 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c 4c if (cert == NULL
2a00: 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 || ssl == NULL)
2a10: 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 {..return 0;.
2a20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
2a30: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
2a40: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 al */. cmdPtr
2a50: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
2a60: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 Obj(statePtr->vc
2a70: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 md);. Tcl_Lis
2a80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2a90: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2aa0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
2ab0: 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 bj("verify", -1)
2ac0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2ad0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2ae0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
2af0: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 .Tcl_NewStringOb
2b00: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
2b10: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
2b20: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
2b30: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2b40: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2b50: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2b60: 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a IntObj(depth));.
2b70: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2b80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2b90: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 erp, cmdPtr, Tls
2ba0: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 _NewX509Obj(inte
2bb0: 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 rp, cert));.
2bc0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2bd0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2be0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2bf0: 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 IntObj(ok));.
2c00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2c10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2c20: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e , cmdPtr,..Tcl_N
2c30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 ewStringObj((cha
2c40: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 r*)X509_verify_c
2c50: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 ert_error_string
2c60: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 (err), -1));..
2c70: 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f /* Prevent I/O
2c80: 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 while callback
2c90: 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a is in progress *
2ca0: 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 /. /* statePt
2cb0: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
2cc0: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f TCL_CALLBACK; */
2cd0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
2ce0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
2cf0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
2d00: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
2d10: 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c ok = EvalCal
2d20: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
2d30: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b atePtr, cmdPtr);
2d40: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
2d50: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a Count(cmdPtr);..
2d60: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d /* statePtr-
2d70: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f >flags &= ~(TLS_
2d80: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a TCL_CALLBACK); *
2d90: 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 /. return(ok)
2da0: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c ;./* By default,
2db0: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 leave verificat
2dc0: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a ion unchanged. *
2dd0: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d /.}.../*. *-----
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2e20: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d *. * Tls_Error -
2e30: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 -. *. *.Calls ca
2e40: 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74 llback with list
2e50: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 of errors.. *.
2e60: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
2e70: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 *.The err field
2e80: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c of the currentl
2e90: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 y operative Stat
2ea0: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f e is set. *. to
2eb0: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 a string descri
2ec0: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 bing the SSL neg
2ed0: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 otiation failure
2ee0: 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d reason. *. *---
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f30: 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 . */.void.Tls_Er
2f40: 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 ror(State *state
2f50: 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20 Ptr, char *msg)
2f60: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 {. Tcl_Interp
2f70: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
2f80: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
2f90: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
2fa0: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 , *listPtr;.
2fb0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 unsigned long er
2fc0: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d r;. statePtr-
2fd0: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 >err = msg;..
2fe0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
2ff0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
3000: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
3010: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
3020: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 L)..return;..
3030: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
3040: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
3050: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
3060: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
3070: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
3080: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
3090: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
30a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
30b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
30c0: 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 error", -1));.
30d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
30e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
30f0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
3100: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
3110: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
3120: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
3130: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 lf), -1));. i
3140: 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20 f (msg != NULL)
3150: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
3160: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3170: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
3180: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 NewStringObj(msg
3190: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 , -1));.. } e
31a0: 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54 lse if ((msg = T
31b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
31c0: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 Obj(Tcl_GetObjRe
31d0: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 28 54 sult(interp), (T
31e0: 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 cl_Size *) NULL)
31f0: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 ) != NULL) {..Tc
3200: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3210: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3220: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
3230: 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 ringObj(msg, -1)
3240: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b );.. } else {
3250: 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f ..listPtr = Tcl_
3260: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
3270: 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65 72 LL);..while ((er
3280: 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f r = ERR_get_erro
3290: 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20 20 r()) != 0) {..
32a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
32b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
32c0: 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f p, listPtr, Tcl_
32d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52 52 NewStringObj(ERR
32e0: 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 _reason_error_st
32f0: 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b ring(err), -1));
3300: 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ..}..Tcl_ListObj
3310: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3320: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c 69 terp, cmdPtr, li
3330: 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 stPtr);. }..
3340: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
3350: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 ack command */.
3360: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
3370: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
3380: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e EvalCallback(in
3390: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
33a0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c cmdPtr);. Tcl
33b0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
33c0: 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a dPtr);.}.../*. *
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3410: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 ---. *. * KeyLog
3420: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 Callback --. *.
3430: 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 64 *.Write received
3440: 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f 67 key data to log
3450: 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 file.. *. * Sid
3460: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f e effects:. *.no
3470: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ne. *. *--------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
34c0: 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 void KeyLogCallb
34d0: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
34e0: 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a sl, const char *
34f0: 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 line) {. char
3500: 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 *str = getenv(S
3510: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 SLKEYLOGFILE);.
3520: 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 FILE *fd;..
3530: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
3540: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
3550: 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e r) {..fd = fopen
3560: 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 72 (str, "a");..fpr
3570: 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c intf(fd, "%s\n",
3580: 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66 line);..fclose(f
3590: 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a d);. }.}.../*
35a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 ------. *. * Pas
35f0: 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d sword Callback -
3600: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 -. *. *.Called w
3610: 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 66 hen a password f
3620: 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65 79 or a private key
3630: 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69 6e 67 loading/storing
3640: 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 74 69 66 a PEM. *.certif
3650: 69 63 61 74 65 20 77 69 74 68 20 65 6e 63 72 79 icate with encry
3660: 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c ption. Evals cal
3670: 6c 62 61 63 6b 20 73 63 72 69 70 74 20 61 6e 64 lback script and
3680: 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 68 65 20 returns. *.the
3690: 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 70 61 result as the pa
36a0: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69 6e ssword string in
36b0: 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 buf.. *. * Resu
36c0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
36d0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
36e0: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
36f0: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
3700: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
3710: 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65 20 *.Password size
3720: 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20 66 in bytes or -1 f
3730: 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a or an error.. *.
3740: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3780: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
3790: 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c int.PasswordCal
37a0: 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c lback(char *buf,
37b0: 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 int size, int r
37c0: 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 wflag, void *uda
37d0: 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 ta) {. State
37e0: 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 *statePtr.= (Sta
37f0: 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 te *) udata;.
3800: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
3810: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
3820: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
3830: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
3840: 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 int code;..
3850: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
3860: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f );.. /* If no
3870: 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64 callback, use d
3880: 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20 efault callback
3890: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
38a0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d Ptr->password ==
38b0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 NULL) {..if (Tc
38c0: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c l_EvalEx(interp,
38d0: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 "tls::password"
38e0: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 , -1, TCL_EVAL_G
38f0: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b LOBAL) == TCL_OK
3900: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 ) {.. char *r
3910: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 et = (char *) Tc
3920: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c l_GetStringResul
3930: 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 t(interp);..
3940: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 strncpy(buf, ret
3950: 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 , (size_t) size)
3960: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 ;.. return (i
3970: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a nt)strlen(ret);.
3980: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 .} else {.. r
3990: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 eturn -1;..}.
39a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
39b0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
39c0: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 l */. cmdPtr
39d0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
39e0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 bj(statePtr->pas
39f0: 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c 5f sword);. Tcl_
3a00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3a10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3a20: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
3a30: 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64 22 ngObj("password"
3a40: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
3a50: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3a60: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3a70: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
3a80: 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20 20 bj(rwflag));.
3a90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3aa0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3ab0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
3ac0: 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b 0a wIntObj(size));.
3ad0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 . Tcl_Preserv
3ae0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
3af0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f nterp);. Tcl_
3b00: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
3b10: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
3b20: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
3b30: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
3b40: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
3b50: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
3b60: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 code = Tcl_E
3b70: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c valObjEx(interp,
3b80: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 cmdPtr, TCL_EVA
3b90: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 L_GLOBAL);. i
3ba0: 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f f (code != TCL_O
3bb0: 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 K) {.#if (TCL_MA
3bc0: 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 JOR_VERSION == 8
3bd0: 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f ) && (TCL_MINOR_
3be0: 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 VERSION < 6)..Tc
3bf0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f l_BackgroundErro
3c00: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 r(interp);.#else
3c10: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
3c20: 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 Exception(interp
3c30: 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a , code);.#endif.
3c40: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
3c50: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
3c60: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c r);.. Tcl_Rel
3c70: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 ease((ClientData
3c80: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 ) statePtr);..
3c90: 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73 66 /* If successf
3ca0: 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70 61 ul, pass back pa
3cb0: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61 6e ssword string an
3cc0: 64 20 74 72 75 6e 63 61 74 65 20 69 66 20 74 6f d truncate if to
3cd0: 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 o long */. if
3ce0: 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b (code == TCL_OK
3cf0: 29 20 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c 65 ) {..Tcl_Size le
3d00: 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 n;..char *ret =
3d10: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
3d20: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
3d30: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
3d40: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 nterp), &len);..
3d50: 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 if (len > (Tcl_S
3d60: 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 ize) size-1) {..
3d70: 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 len = (Tcl_S
3d80: 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a ize) size-1;..}.
3d90: 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 .strncpy(buf, re
3da0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 t, (size_t) len)
3db0: 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c ;..buf[len] = '\
3dc0: 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 0';..Tcl_Release
3dd0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
3de0: 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 28 terp);..return((
3df0: 69 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20 20 7d int) len);. }
3e00: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 . Tcl_Release
3e10: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
3e20: 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 terp);. retur
3e30: 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d n -1;.}.../*. *-
3e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e80: 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e --. *. * Session
3e90: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c Callback for Cl
3ea0: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 ients --. *. *.C
3eb0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 alled when a new
3ec0: 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64 65 session is adde
3ed0: 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20 d to the cache.
3ee0: 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 In TLS 1.3. *.th
3ef0: 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 69 76 is may be receiv
3f00: 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 ed multiple time
3f10: 73 20 61 66 74 65 72 20 74 68 65 20 68 61 6e 64 s after the hand
3f20: 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 shake. For. *.ea
3f30: 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 rlier versions,
3f40: 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 63 this will be rec
3f50: 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 68 65 eived during the
3f60: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 handshake.. *.T
3f70: 68 69 73 20 69 73 20 74 68 65 20 70 72 65 66 65 his is the prefe
3f80: 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74 61 rred way to obta
3f90: 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20 73 in a resumable s
3fa0: 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 ession.. *. * Re
3fb0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
3fc0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
3fd0: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
3fe0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
3ff0: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 ). *. * Return c
4000: 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 odes:. *.0 = err
4010: 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 6f 6e or where session
4020: 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 will be immedia
4030: 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f tely removed fro
4040: 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 m the internal c
4050: 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 ache.. *.1 = suc
4060: 63 65 73 73 20 77 68 65 72 65 20 61 70 70 20 72 cess where app r
4070: 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 etains session i
4080: 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65 2c n session cache,
4090: 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 and must call S
40a0: 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 SL_SESSION_free(
40b0: 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a ) when done.. *.
40c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4100: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
4110: 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c int.SessionCall
4120: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a back(const SSL *
4130: 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e ssl, SSL_SESSION
4140: 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 20 *session) {.
4150: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
4160: 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 = (State*)SSL_g
4170: 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c et_app_data((SSL
4180: 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c *)ssl);. Tcl
4190: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
41a0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
41b0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
41c0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e *cmdPtr;. con
41d0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
41e0: 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 6f *ticket;. co
41f0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4200: 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 20 r *session_id;.
4210: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a size_t len2;.
4220: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
4230: 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 ulen;.. dpri
4240: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
4250: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
4260: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
4270: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
4280: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4290: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
42a0: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d else if (ssl ==
42b0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
42c0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
42d0: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
42e0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
42f0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 and to eval */.
4300: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
4310: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
4320: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
4330: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
4340: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
4350: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
4360: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
4370: 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b "session", -1));
4380: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4390: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
43a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
43b0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
43c0: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
43d0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
43e0: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 >self), -1));..
43f0: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 /* Session id
4400: 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f */. session_
4410: 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e id = SSL_SESSION
4420: 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c _get_id(session,
4430: 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c &ulen);. Tcl
4440: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4450: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4460: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 dPtr, Tcl_NewByt
4470: 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f eArrayObj(sessio
4480: 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 n_id, (Tcl_Size)
4490: 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a ulen));.. /*
44a0: 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 Session ticket
44b0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 */. SSL_SESSI
44c0: 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 ON_get0_ticket(s
44d0: 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c ession, &ticket,
44e0: 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c &len2);. Tcl
44f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4500: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4510: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 dPtr, Tcl_NewByt
4520: 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 eArrayObj(ticket
4530: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e , (Tcl_Size) len
4540: 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 2));.. /* Lif
4550: 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f etime - number o
4560: 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 f seconds */.
4570: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4580: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4590: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e , cmdPtr,..Tcl_N
45a0: 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 ewLongObj((long)
45b0: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
45c0: 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 _ticket_lifetime
45d0: 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 _hint(session)))
45e0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
45f0: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
4600: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
4610: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
4620: 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 . EvalCallbac
4630: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
4640: 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 tr, cmdPtr);.
4650: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
4660: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 t(cmdPtr);. r
4670: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a eturn 0;.}.../*.
4680: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46c0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e -----. *. * ALPN
46d0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 Callback for Se
46e0: 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 rvers and NPN Ca
46f0: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e llback for Clien
4700: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 ts --. *. *.Perf
4710: 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 orm protocol (ht
4720: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 tp/1.1, h2, h3,
4730: 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 etc.) selection
4740: 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d for the. *.incom
4750: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 ing connection.
4760: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c Called after Hel
4770: 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 lo and server ca
4780: 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 llbacks.. *.Wher
4790: 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 e 'out' is selec
47a0: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 ted protocol and
47b0: 20 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 'in' is the pee
47c0: 72 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 r advertised lis
47d0: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 t.. *. * Results
47e0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.None. *. *
47f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
4800: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 .Calls callback
4810: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a (if defined). *.
4820: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a * Return codes:
4830: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
4840: 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 RR_OK: ALPN prot
4850: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 ocol selected. T
4860: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
4870: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f ntinues.. *.SSL_
4880: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 TLSEXT_ERR_ALERT
4890: 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 _FATAL: There wa
48a0: 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 s no overlap bet
48b0: 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 ween the client'
48c0: 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 s. *. supplie
48d0: 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 d list and the s
48e0: 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 erver configurat
48f0: 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ion. The connect
4900: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 ion will be abor
4910: 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ted.. *.SSL_TLSE
4920: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c XT_ERR_NOACK: AL
4930: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 PN protocol not
4940: 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 selected, e.g.,
4950: 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a because no ALPN.
4960: 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 *. protocols
4970: 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 are configured
4980: 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 for this connect
4990: 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ion. The connect
49a0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
49b0: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
4a00: 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 ic int.ALPNCallb
4a10: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
4a20: 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e sl, const unsign
4a30: 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 ed char **out, u
4a40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 nsigned char *ou
4a50: 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 tlen,..const uns
4a60: 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 igned char *in,
4a70: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c unsigned int inl
4a80: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b en, void *arg) {
4a90: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
4aa0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
4ab0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
4ac0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
4ad0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
4ae0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
4af0: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
4b00: 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 , res;.. dpri
4b10: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
4b20: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e if (ssl == N
4b30: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 ULL || arg == NU
4b40: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
4b50: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
4b60: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f CK;. }.. /
4b70: 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f * Select protoco
4b80: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c l */. if (SSL
4b90: 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f _select_next_pro
4ba0: 74 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 to(out, outlen,
4bb0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
4bc0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 , statePtr->prot
4bd0: 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c os_len,..in, inl
4be0: 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e en) == OPENSSL_N
4bf0: 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b PN_NEGOTIATED) {
4c00: 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 ../* Match found
4c10: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 */..res = SSL_T
4c20: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 LSEXT_ERR_OK;.
4c30: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f } else {../* O
4c40: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 PENSSL_NPN_NO_OV
4c50: 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c ERLAP = No overl
4c60: 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 ap, so use first
4c70: 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e item from clien
4c80: 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 t protocol list
4c90: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c */..res = SSL_TL
4ca0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4cb0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
4cc0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d tatePtr->vcmd ==
4cd0: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 (Tcl_Obj*)NULL)
4ce0: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a {..return res;.
4cf0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
4d00: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
4d10: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
4d20: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
4d30: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
4d40: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
4d50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4d60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4d70: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
4d80: 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 gObj("alpn", -1)
4d90: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
4da0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
4db0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
4dc0: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
4dd0: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 ngObj(Tcl_GetCha
4de0: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
4df0: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a r->self), -1));.
4e00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4e10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4e20: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
4e30: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f _NewStringObj(*o
4e40: 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 ut, -1));. Tc
4e50: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4e60: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4e70: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f mdPtr, Tcl_NewBo
4e80: 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 oleanObj(res ==
4e90: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
4ea0: 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 K));.. /* Eva
4eb0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
4ec0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
4ed0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
4ee0: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 r);. if ((cod
4ef0: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b e = EvalCallback
4f00: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
4f10: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 r, cmdPtr)) > 1)
4f20: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
4f30: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4f40: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
4f50: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 ode == 1) {..res
4f60: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 = SSL_TLSEXT_ER
4f70: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 R_OK;. } else
4f80: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
4f90: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 SEXT_ERR_ALERT_F
4fa0: 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ATAL;. }.
4fb0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
4fc0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 (cmdPtr);. re
4fd0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a turn res;.}.../*
4fe0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5020: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 ------. *. * Adv
5030: 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 ertise Protocols
5040: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 Callback for Ne
5050: 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f xt Protocol Nego
5060: 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e tiation (NPN) in
5070: 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a ServerHello --.
5080: 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 *. *.called whe
5090: 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e n a TLS server n
50a0: 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73 eeds a list of s
50b0: 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f upported protoco
50c0: 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 ls for Next. *.P
50d0: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 rotocol Negotiat
50e0: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ion.. *. * Resul
50f0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
5100: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
5110: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
5120: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
5130: 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 T_ERR_OK: NPN pr
5140: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e otocol selected.
5150: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
5160: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
5170: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
5180: 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c CK: NPN protocol
5190: 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54 not selected. T
51a0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
51b0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d ntinues.. *. *--
51c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5200: 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 -. */.#ifdef USE
5210: 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a _NPN.static int.
5220: 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 NPNCallback(cons
5230: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 t SSL *ssl, cons
5240: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
5250: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 **out, unsigned
5260: 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 int *outlen, voi
5270: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 d *arg) {. St
5280: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
5290: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 (State*)arg;..
52a0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
52b0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 d");.. if (ss
52c0: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 l == NULL || arg
52d0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
52e0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
52f0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
5300: 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 . /* Set prot
5310: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 ocols list */.
5320: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
5330: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 protos != NULL)
5340: 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 {..*out = stateP
5350: 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 tr->protos;..*ou
5360: 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d tlen = statePtr-
5370: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 >protos_len;.
5380: 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 } else {..*out
5390: 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e = NULL;..*outlen
53a0: 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 = 0;..return SS
53b0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
53c0: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 CK;. }. re
53d0: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
53e0: 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 ERR_OK;.}.#endif
53f0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
5400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
5440: 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 * SNI Callback f
5450: 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a or Servers --. *
5460: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 . *.Perform serv
5470: 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 er-side SNI host
5480: 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 name selection a
5490: 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 fter receiving S
54a0: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 NI extension. *.
54b0: 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e in Client Hello.
54c0: 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 Called after he
54d0: 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 llo callback but
54e0: 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c before ALPN cal
54f0: 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
5500: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
5510: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
5520: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
5530: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
5540: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
5550: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 des:. *.SSL_TLSE
5560: 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 XT_ERR_OK: SNI h
5570: 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 ostname is accep
5580: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
5590: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
55a0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
55b0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e _ALERT_FATAL: SN
55c0: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
55d0: 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 t accepted. The
55e0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 connection. *.
55f0: 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 is aborted. De
5600: 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 fault for alert
5610: 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f is SSL_AD_UNRECO
5620: 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 GNIZED_NAME.. *.
5630: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5640: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e LERT_WARNING: SN
5650: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
5660: 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e t accepted, warn
5670: 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 ing alert. *.
5680: 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f sent (not suppo
5690: 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 rted in TLSv1.3)
56a0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
56b0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
56c0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
56d0: 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d ACK: SNI hostnam
56e0: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 e is not accepte
56f0: 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 d and not acknow
5700: 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 ledged,. *. e
5710: 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e .g. if SNI has n
5720: 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 ot been configur
5730: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
5740: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
5750: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5790: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
57a0: 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 c int.SNICallbac
57b0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
57c0: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f , int *alert, vo
57d0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
57e0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
57f0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
5800: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
5810: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
5820: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
5830: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
5840: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
5850: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 . char *serve
5860: 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 rname = NULL;..
5870: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
5880: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
5890: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 sl == NULL || ar
58a0: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 g == NULL) {..re
58b0: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
58c0: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
58d0: 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f .. /* Only wo
58e0: 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 rks for TLS 1.2
58f0: 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 and earlier */.
5900: 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 servername =
5910: 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 SSL_get_serverna
5920: 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e me(ssl, TLSEXT_N
5930: 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d AMETYPE_host_nam
5940: 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72 e);. if (!ser
5950: 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 vername || serve
5960: 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 rname[0] == '\0'
5970: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
5980: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
5990: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
59a0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 (statePtr->vcmd
59b0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
59c0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
59d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
59e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
59f0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
5a00: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
5a10: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
5a20: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
5a30: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
5a40: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5a50: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5a60: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
5a70: 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 gObj("sni", -1))
5a80: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
5a90: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5aa0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
5ab0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
5ac0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
5ad0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
5ae0: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
5af0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5b00: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5b10: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
5b20: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 NewStringObj(ser
5b30: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a vername , -1));.
5b40: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
5b50: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
5b60: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
5b70: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
5b80: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 if ((code = E
5b90: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
5ba0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
5bb0: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 dPtr)) > 1) {..r
5bc0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
5bd0: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e ERR_ALERT_WARNIN
5be0: 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c G;..*alert = SSL
5bf0: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 _AD_UNRECOGNIZED
5c00: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 _NAME; /* Not su
5c10: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 pported by TLS 1
5c20: 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 .3 */. } else
5c30: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
5c40: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
5c50: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
5c60: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
5c70: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5c80: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c LERT_FATAL;..*al
5c90: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 ert = SSL_AD_UNR
5ca0: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 ECOGNIZED_NAME;
5cb0: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 /* Not supported
5cc0: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 by TLS 1.3 */.
5cd0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
5ce0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
5cf0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 );. return re
5d00: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d s;.}.../*. *----
5d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
5d50: 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c *. * ClientHell
5d60: 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c o Handshake Call
5d70: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 back for Servers
5d80: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 --. *. *.Used b
5d90: 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d y server to exam
5da0: 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e ine the server n
5db0: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 ame indication (
5dc0: 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 SNI) extension.
5dd0: 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 *.provided by th
5de0: 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 e client in orde
5df0: 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 r to select an a
5e00: 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 ppropriate certi
5e10: 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 ficate to. *.pre
5e20: 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f sent, and make o
5e30: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 ther configurati
5e40: 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 on adjustments r
5e50: 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 elevant to that
5e60: 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 server. *.name a
5e70: 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 nd its configura
5e80: 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 tion. This inclu
5e90: 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 des swapping out
5ea0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a the associated.
5eb0: 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 *.SSL_CTX point
5ec0: 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 er, modifying th
5ed0: 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 e server's list
5ee0: 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 of permitted TLS
5ef0: 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 versions,. *.ch
5f00: 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 anging the serve
5f10: 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 r's cipher list
5f20: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 in response to t
5f30: 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 he client's ciph
5f40: 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a er list, etc.. *
5f50: 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 .Called before S
5f60: 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c NI and ALPN call
5f70: 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 backs.. *. * Res
5f80: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
5f90: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
5fa0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
5fb0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
5fc0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
5fd0: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 des:. *.SSL_CLIE
5fe0: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 NT_HELLO_RETRY:
5ff0: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 suspend the hand
6000: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 shake, and the h
6010: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f andshake functio
6020: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d n will return im
6030: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c mediately. *.SSL
6040: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6050: 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 ROR: failure, te
6060: 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 rminate connecti
6070: 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f on. Set alert to
6080: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 error code.. *.
6090: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
60a0: 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 _SUCCESS: succes
60b0: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d s. *. *---------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
6100: 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 tatic int.HelloC
6110: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
6120: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
6130: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
6140: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
6150: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
6160: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
6170: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
6180: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
6190: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
61a0: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
61b0: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 , res;. const
61c0: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
61d0: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
61e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 igned char *p;.
61f0: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 size_t len, r
6200: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 emaining;.. d
6210: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
6220: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
6230: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 Ptr->vcmd == (Tc
6240: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
6250: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6260: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b T_HELLO_SUCCESS;
6270: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
6280: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 ssl == (const SS
6290: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 L *)NULL || arg
62a0: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 == (void *)NULL)
62b0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 {..return SSL_C
62c0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
62d0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
62e0: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 Get names */.
62f0: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e if (!SSL_clien
6300: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 t_hello_get0_ext
6310: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 (ssl, TLSEXT_TYP
6320: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 E_server_name, &
6330: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c p, &remaining) |
6340: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 | remaining <= 2
6350: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
6360: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f L_R_SSLV3_ALERT_
6370: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 ILLEGAL_PARAMETE
6380: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 R;..return SSL_C
6390: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
63a0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
63b0: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e Extract the len
63c0: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c gth of the suppl
63d0: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 ied list of name
63e0: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 s. */. len =
63f0: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 (*(p++) << 8);.
6400: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 len += *(p++)
6410: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 ;. if (len +
6420: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 2 != remaining)
6430: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
6440: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c R_SSLV3_ALERT_IL
6450: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b LEGAL_PARAMETER;
6460: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
6470: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
6480: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 . }. remai
6490: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 ning = len;..
64a0: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 /* The list in
64b0: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 practice only ha
64c0: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 s a single eleme
64d0: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 nt, so we only c
64e0: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 onsider the firs
64f0: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 t one. */. if
6500: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 (remaining == 0
6510: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 || *p++ != TLSE
6520: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 XT_NAMETYPE_host
6530: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 _name) {..*alert
6540: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
6550: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
6560: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c ROR;..return SSL
6570: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6580: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
6590: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 emaining--;..
65a0: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 /* Now we can f
65b0: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 inally pull out
65c0: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 the byte array w
65d0: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 ith the actual h
65e0: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 ostname. */.
65f0: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d if (remaining <=
6600: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 2) {..*alert =
6610: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
6620: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 T_INTERNAL_ERROR
6630: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
6640: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
6650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 ;. }. len
6660: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b = (*(p++) << 8);
6670: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b . len += *(p+
6680: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 +);. if (len
6690: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 + 2 > remaining)
66a0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
66b0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
66c0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
66d0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
66e0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
66f0: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
6700: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 ng = len;. se
6710: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 rvername = (cons
6720: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 t char *)p;..
6730: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
6740: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
6750: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
6760: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
6770: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
6780: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
6790: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
67a0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
67b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c wStringObj("hell
67c0: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 o", -1));. Tc
67d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
67e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
67f0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
6800: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
6810: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
6820: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
6830: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
6840: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
6850: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
6860: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
6870: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c gObj(servername,
6880: 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 (Tcl_Size) len)
6890: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 );.. /* Eval
68a0: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
68b0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
68c0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
68d0: 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 ;. if ((code
68e0: 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 = EvalCallback(i
68f0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
6900: 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b cmdPtr)) > 1) {
6910: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 ..res = SSL_CLIE
6920: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a NT_HELLO_RETRY;.
6930: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f .*alert = SSL_R_
6940: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 TLSV1_ALERT_USER
6950: 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 _CANCELLED;.
6960: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
6970: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
6980: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
6990: 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 SUCCESS;. } e
69a0: 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c lse {..res = SSL
69b0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
69c0: 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 ROR;..*alert = S
69d0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 SL_R_TLSV1_ALERT
69e0: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b _INTERNAL_ERROR;
69f0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
6a00: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
6a10: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
6a20: 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a res;.}.../******
6a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
6a40: 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 /* Commands
6a50: 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a */./********
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f ************/../
6a70: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
6a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ab0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 -------. *. * Ci
6ac0: 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c phersObjCmd -- l
6ad0: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 ist available ci
6ae0: 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 phers. *. *.This
6af0: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
6b00: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 voked to process
6b10: 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 the "tls::ciphe
6b20: 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 rs" command. *.t
6b30: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 o list available
6b40: 20 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 ciphers, based
6b50: 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 upon protocol se
6b60: 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 lected.. *. * Re
6b70: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
6b80: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 dard Tcl result
6b90: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 list.. *. * Side
6ba0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e effects:. *.con
6bb0: 73 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 structs and dest
6bc0: 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 roys SSL context
6bd0: 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d (CTX). *. *----
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
6c20: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 */.static const
6c30: 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 char *protocols
6c40: 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 [] = {.."ssl2",
6c50: 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 "ssl3", "tls1",
6c60: 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e "tls1.1", "tls1.
6c70: 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 2", "tls1.3", NU
6c80: 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f LL.};.enum proto
6c90: 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 col {. TLS_SS
6ca0: 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c L2, TLS_SSL3, TL
6cb0: 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 S_TLS1, TLS_TLS1
6cc0: 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 _1, TLS_TLS1_2,
6cd0: 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f TLS_TLS1_3, TLS_
6ce0: 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 NONE.};..static
6cf0: 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d int.CiphersObjCm
6d00: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
6d10: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
6d20: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
6d30: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
6d40: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
6d50: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
6d60: 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 Ptr = NULL;.
6d70: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e SSL_CTX *ctx = N
6d80: 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 ULL;. SSL *ss
6d90: 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 l = NULL;. ST
6da0: 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 ACK_OF(SSL_CIPHE
6db0: 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 R) *sk;. char
6dc0: 20 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 49 5a *cp, buf[BUFSIZ
6dd0: 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 ];. int index
6de0: 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 , verbose = 0, u
6df0: 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 se_supported = 0
6e00: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f ;. const SSL_
6e10: 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a METHOD *method;.
6e20: 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e (void) clien
6e30: 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 tData;.. dpri
6e40: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
6e50: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 if ((objc <
6e60: 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 2) || (objc > 4)
6e70: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
6e80: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
6e90: 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c objv, "protocol
6ea0: 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 ?verbose? ?supp
6eb0: 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 orted?");..retur
6ec0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
6ed0: 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 }. if (Tcl_G
6ee0: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 etIndexFromObj(i
6ef0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 nterp, objv[1],
6f00: 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 protocols, "prot
6f10: 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 ocol", 0, &index
6f20: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
6f30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
6f40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
6f50: 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 (objc > 2) && Tc
6f60: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d l_GetBooleanFrom
6f70: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
6f80: 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 [2], &verbose) !
6f90: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
6fa0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
6fb0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 }. if ((ob
6fc0: 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 jc > 3) && Tcl_G
6fd0: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a etBooleanFromObj
6fe0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d (interp, objv[3]
6ff0: 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 , &use_supported
7000: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
7010: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7020: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
7030: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
7040: 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e . switch ((en
7050: 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 um protocol)inde
7060: 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 x) {..case TLS_S
7070: 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c SL2:.#if OPENSSL
7080: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
7090: 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c >= 0x10100000L |
70a0: 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c | defined(NO_SSL
70b0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
70c0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 ENSSL_NO_SSL2)..
70d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
70e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
70f0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
7100: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
7110: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
7120: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
7130: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
7140: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c method = SSL
7150: 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 v2_method(); bre
7160: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
7170: 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 TLS_SSL3:.#if d
7180: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
7190: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
71a0: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 SL_NO_SSL3) || d
71b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
71c0: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 O_SSL3_METHOD)..
71d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
71e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
71f0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
7200: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
7210: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
7220: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
7230: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
7240: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c method = SSL
7250: 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 v3_method(); bre
7260: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
7270: 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 TLS_TLS1:.#if d
7280: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
7290: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
72a0: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 SL_NO_TLS1) || d
72b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
72c0: 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 O_TLS1_METHOD)..
72d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
72e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
72f0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
7300: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
7310: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
7320: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
7330: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
7340: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 method = TLS
7350: 76 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 v1_method(); bre
7360: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
7370: 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 TLS_TLS1_1:.#if
7380: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
7390: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
73a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
73b0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
73c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d NSSL_NO_TLS1_1_M
73d0: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
73e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
73f0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
7400: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
7410: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
7420: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
7430: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7440: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
7450: 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 od = TLSv1_1_met
7460: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 hod(); break;.#e
7470: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
7480: 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e LS1_2:.#if defin
7490: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c ed(NO_TLS1_2) ||
74a0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
74b0: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 _NO_TLS1_2) || d
74c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
74d0: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 O_TLS1_2_METHOD)
74e0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
74f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
7500: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
7510: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
7520: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
7530: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
7540: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
7550: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 .. method = T
7560: 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29 3b LSv1_2_method();
7570: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
7580: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a case TLS_TLS1_3:
7590: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
75a0: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e TLS1_3) || defin
75b0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
75c0: 53 31 5f 33 29 0a 09 20 20 20 20 54 63 6c 5f 41 S1_3).. Tcl_A
75d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
75e0: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e rp, protocols[in
75f0: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f dex], ": protoco
7600: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
7610: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 , NULL);.. re
7620: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7630: 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f #else.. metho
7640: 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 d = TLS_method()
7650: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 ;.. SSL_CTX_s
7660: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 et_min_proto_ver
7670: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 sion(ctx, TLS1_3
7680: 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 _VERSION);..
7690: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f SSL_CTX_set_max_
76a0: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
76b0: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f x, TLS1_3_VERSIO
76c0: 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a N);.. break;.
76d0: 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a #endif..default:
76e0: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 .. method = T
76f0: 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 LS_method();..
7700: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a break;. }..
7710: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 ctx = SSL_CT
7720: 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 X_new(method);.
7730: 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 if (ctx == NU
7740: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
7750: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
7760: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b REASON(), NULL);
7770: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7780: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 OR;. }.. s
7790: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 sl = SSL_new(ctx
77a0: 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d );. if (ssl =
77b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 = NULL) {..Tcl_A
77c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
77d0: 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 rp, REASON(), NU
77e0: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 LL);..SSL_CTX_fr
77f0: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e ee(ctx);..return
7800: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
7810: 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 }.. /* Use li
7820: 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 st and order as
7830: 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e would be sent in
7840: 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f a ClientHello o
7850: 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 r all available
7860: 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 ciphers */. i
7870: 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 f (use_supported
7880: 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 ) {..sk = SSL_ge
7890: 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 t1_supported_cip
78a0: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d hers(ssl);. }
78b0: 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 else {..sk = SS
78c0: 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 L_get_ciphers(ss
78d0: 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 l);. }.. i
78e0: 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b f (sk != NULL) {
78f0: 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 ..if (!verbose)
7900: 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 {.. objPtr =
7910: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
7920: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f , NULL);.. fo
7930: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 r (int i = 0; i
7940: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f < sk_SSL_CIPHER_
7950: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a num(sk); i++) {.
7960: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 ..const SSL_CIPH
7970: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 ER *c = sk_SSL_C
7980: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 IPHER_value(sk,
7990: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e i);...if (c == N
79a0: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a ULL) continue;..
79b0: 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65 ../* cipher name
79c0: 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 or (NONE) */...
79d0: 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f cp = SSL_CIPHER_
79e0: 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69 get_name(c);...i
79f0: 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 f (cp == NULL) b
7a00: 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 reak;...Tcl_List
7a10: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
7a20: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
7a30: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
7a40: 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 j(cp, -1));..
7a50: 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 }...} else {..
7a60: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
7a70: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c NewStringObj("",
7a80: 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 0);.. for (in
7a90: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f t i = 0; i < sk_
7aa0: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 SSL_CIPHER_num(s
7ab0: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e k); i++) {...con
7ac0: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 st SSL_CIPHER *c
7ad0: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 = sk_SSL_CIPHER
7ae0: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 _value(sk, i);..
7af0: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 .if (c == NULL)
7b00: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 continue;..../*
7b10: 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 textual descript
7b20: 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 ion of the ciphe
7b30: 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 r */...if (SSL_C
7b40: 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f IPHER_descriptio
7b50: 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 n(c, buf, sizeof
7b60: 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 (buf)) != NULL)
7b70: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {... Tcl_Appe
7b80: 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 ndToObj(objPtr,
7b90: 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 buf, (Tcl_Size)
7ba0: 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 strlen(buf));...
7bb0: 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 } else {... T
7bc0: 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f cl_AppendToObj(o
7bd0: 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c bjPtr, "UNKNOWN\
7be0: 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 n", 8);...}..
7bf0: 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 }..}..if (use_s
7c00: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 upported) {..
7c10: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 sk_SSL_CIPHER_f
7c20: 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 ree(sk);..}.
7c30: 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 }. SSL_free(s
7c40: 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 sl);. SSL_CTX
7c50: 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 _free(ctx);..
7c60: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
7c70: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
7c80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
7c90: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ce0: 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f --. *. * Protoco
7cf0: 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 lsObjCmd -- list
7d00: 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f available proto
7d10: 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 cols. *. *.This
7d20: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
7d30: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
7d40: 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 the "tls::protoc
7d50: 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 ols" command. *.
7d60: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c to list availabl
7d70: 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a e protocols.. *.
7d80: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
7d90: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
7da0: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a sult list.. *. *
7db0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
7dc0: 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d *.none. *. *----
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7e10: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 */.static int.P
7e20: 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 rotocolsObjCmd(C
7e30: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
7e40: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
7e50: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
7e60: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
7e70: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
7e80: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
7e90: 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 ;. (void) cli
7ea0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 entData;.. dp
7eb0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
7ec0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
7ed0: 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 1) {..Tcl_Wron
7ee0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
7ef0: 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 1, objv, "");..
7f00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7f10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
7f20: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
7f30: 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 . objPtr = Tc
7f40: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
7f50: 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e NULL);..#if OPEN
7f60: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
7f70: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c ER < 0x10100000L
7f80: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f && !defined(NO_
7f90: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 SSL2) && !define
7fa0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
7fb0: 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 2). Tcl_ListO
7fc0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
7fd0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
7fe0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
7ff0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 (protocols[TLS_S
8000: 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 SL2], -1));.#end
8010: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
8020: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
8030: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8040: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
8050: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
8060: 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 3_METHOD). Tc
8070: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
8080: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
8090: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
80a0: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
80b0: 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 s[TLS_SSL3], -1)
80c0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
80d0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
80e0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
80f0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 SSL_NO_TLS1) &&
8100: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
8110: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 _NO_TLS1_METHOD)
8120: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
8130: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
8140: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
8150: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
8160: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 rotocols[TLS_TLS
8170: 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 1], -1));.#endif
8180: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
8190: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
81a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
81b0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
81c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
81d0: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 LS1_1_METHOD).
81e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
81f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
8200: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
8210: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
8220: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 ocols[TLS_TLS1_1
8230: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
8240: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
8250: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
8260: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
8270: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
8280: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
8290: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_2_METHOD).
82a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
82b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
82c0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
82d0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
82e0: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d cols[TLS_TLS1_2]
82f0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
8300: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
8310: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
8320: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
8330: 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 S1_3). Tcl_Li
8340: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
8350: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
8360: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
8370: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
8380: 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b S_TLS1_3], -1));
8390: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c .#endif.. Tcl
83a0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
83b0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 terp, objPtr);.
83c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
83d0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
83e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
83f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
8420: 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 *. * HandshakeOb
8430: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
8440: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 is command is us
8450: 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 ed to verify whe
8460: 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 ther the handsha
8470: 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 ke is complete.
8480: 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 *.or not.. *. *
8490: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
84a0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
84b0: 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 t. 1 means hands
84c0: 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 hake complete, 0
84d0: 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a means pending..
84e0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
84f0: 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 ts:. *.May force
8500: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e SSL negotiation
8510: 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a to take place..
8520: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
8530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8540: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 --------. */.sta
8570: 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b tic int Handshak
8580: 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 eObjCmd(ClientDa
8590: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
85a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
85b0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
85c0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
85d0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
85e0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 annel chan;
85f0: 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 /* The channe
8600: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
8610: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 on. */. State
8620: 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 *statePtr;
8630: 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 /* client sta
8640: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 te for ssl socke
8650: 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 t */. const c
8660: 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 har *errStr = NU
8670: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 LL;. int ret
8680: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 = 1;. int err
8690: 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 = 0;. (void)
86a0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 clientData;..
86b0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
86c0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
86d0: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc != 2) {..Tcl_
86e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
86f0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
8700: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 hannel");..retur
8710: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
8720: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
8730: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
8740: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
8750: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
8760: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
8770: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28 54 63 Obj(objv[1], (Tc
8780: 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 2c l_Size *) NULL),
8790: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
87a0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
87b0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
87c0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
87d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
87e0: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
87f0: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
8800: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
8810: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
8820: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
8830: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 );. if (Tcl_G
8840: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
8850: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
8860: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
8870: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
8880: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
8890: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
88a0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
88b0: 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 ,.. "\": not
88c0: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 a TLS channel",
88d0: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 NULL);..Tcl_SetE
88e0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
88f0: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 "TLS", "HANDSHA
8900: 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 KE", "CHANNEL",
8910: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 "INVALID", (char
8920: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
8930: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
8940: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 }. statePt
8950: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c r = (State *)Tcl
8960: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
8970: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a nceData(chan);..
8980: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
8990: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 ling Tls_WaitFor
89a0: 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 Connect");. r
89b0: 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 et = Tls_WaitFor
89c0: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 Connect(statePtr
89d0: 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 , &err, 1);.
89e0: 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 dprintf("Tls_Wai
89f0: 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 tForConnect retu
8a00: 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b rned: %i", ret);
8a10: 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 .. if (ret <
8a20: 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 0 && ((statePtr-
8a30: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c >flags & TLS_TCL
8a40: 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 _ASYNC) && (err
8a50: 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 == EAGAIN))) {..
8a60: 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 dprintf("Async s
8a70: 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 et and err = EAG
8a80: 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b AIN");..ret = 0;
8a90: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
8aa0: 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 ret < 0) {..long
8ab0: 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 result;..errStr
8ac0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 = statePtr->err
8ad0: 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 ;..Tcl_ResetResu
8ae0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c lt(interp);..Tcl
8af0: 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a _SetErrno(err);.
8b00: 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c ..if (!errStr ||
8b10: 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 (*errStr == 0))
8b20: 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d {.. errStr =
8b30: 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 Tcl_PosixError(
8b40: 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 interp);..}...Tc
8b50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
8b60: 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b nterp, "handshak
8b70: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 e failed: ", err
8b80: 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 Str, (char *) NU
8b90: 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c LL);..if ((resul
8ba0: 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 t = SSL_get_veri
8bb0: 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 fy_result(stateP
8bc0: 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 tr->ssl)) != X50
8bd0: 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 9_V_OK) {.. T
8be0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8bf0: 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74 6f interp, " due to
8c00: 3a 20 22 2c 20 58 35 30 39 5f 76 65 72 69 66 79 : ", X509_verify
8c10: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 _cert_error_stri
8c20: 6e 67 28 72 65 73 75 6c 74 29 2c 20 28 63 68 61 ng(result), (cha
8c30: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 r *) NULL);..}..
8c40: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
8c50: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
8c60: 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 "HANDSHAKE", "FA
8c70: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
8c80: 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 NULL);..dprintf(
8c90: 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 "Returning TCL_E
8ca0: 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 RROR with handsh
8cb0: 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c ake failed: %s",
8cc0: 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 errStr);..retur
8cd0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
8ce0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 } else {..if (
8cf0: 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 err != 0) {..
8d00: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e dprintf("Got an
8d10: 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f error with a co
8d20: 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b mpleted handshak
8d30: 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 e: err = %i", er
8d40: 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b r);..}..ret = 1;
8d50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 . }.. dpri
8d60: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 ntf("Returning T
8d70: 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 CL_OK with data
8d80: 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 \"%i\"", ret);.
8d90: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
8da0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
8db0: 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b NewIntObj(ret));
8dc0: 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f . return(TCL_
8dd0: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d OK);.}../*. *---
8de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e20: 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a . *. * ImportObj
8e30: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
8e40: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
8e50: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
8e60: 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d s the "ssl" comm
8e70: 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 and. *. *.The ss
8e80: 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 l command pushes
8e90: 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 SSL over a (new
8ea0: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 ly connected) tc
8eb0: 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 p socket. *. * R
8ec0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
8ed0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
8ee0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
8ef0: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 ects:. *.May mod
8f00: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 ify the behavior
8f10: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 of an IO channe
8f20: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d l.. *. *--------
8f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
8f70: 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 static int.Impor
8f80: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 tObjCmd(ClientDa
8f90: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
8fa0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
8fb0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
8fc0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
8fd0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
8fe0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 annel chan;../*
8ff0: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
9000: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f et a mode on. */
9010: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
9020: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 ePtr;../* client
9030: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
9040: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c ocket */. SSL
9050: 5f 43 54 58 20 2a 63 74 78 09 20 20 20 20 20 20 _CTX *ctx.
9060: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 = NULL;. Tc
9070: 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 20 20 l_Obj *script.
9080: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
9090: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 Tcl_Obj *passw
90a0: 6f 72 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ord. = NU
90b0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 LL;. Tcl_Obj
90c0: 2a 76 63 6d 64 09 20 20 20 20 20 20 20 20 3d 20 *vcmd. =
90d0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 NULL;. Tcl_DS
90e0: 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e tring upperChann
90f0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 elTranslation, u
9100: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
9110: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ing, upperChanne
9120: 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 lEncoding, upper
9130: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a ChannelEOFChar;.
9140: 20 20 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 int idx;.
9150: 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 Tcl_Size len;.
9160: 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09 20 20 int flags..
9170: 20 20 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f = TLS_TCL_
9180: 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 INIT;. int se
9190: 72 76 65 72 09 09 20 20 20 20 20 20 20 20 3d 20 rver.. =
91a0: 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 0;./* is connect
91b0: 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 ion incoming or
91c0: 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 outgoing? */.
91d0: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 char *keyfile.
91e0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
91f0: 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c char *certfil
9200: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
9210: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ;. unsigned c
9220: 68 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c har *key .= NUL
9230: 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 L;. Tcl_Size
9240: 6b 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 key_len
9250: 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 = 0;.
9260: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
9270: 63 65 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e cert = N
9280: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a ULL;. Tcl_Siz
9290: 65 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 e cert_len
92a0: 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 = 0;.
92b0: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 char *ciphers
92c0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
92d0: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 . char *ciphe
92e0: 72 73 75 69 74 65 73 09 20 20 20 20 20 20 20 20 rsuites.
92f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
9300: 20 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 *CAfile.
9310: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
9320: 72 20 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 r *CAdir..
9330: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 = NULL;. ch
9340: 61 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 ar *DHparams.
9350: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
9360: 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 char *model..
9370: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
9380: 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 char *serverna
9390: 6d 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c me. = NUL
93a0: 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 L;./* hostname f
93b0: 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 or Server Name I
93c0: 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 ndication */.
93d0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
93e0: 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 char *session_id
93f0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
9400: 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 _Obj *alpn..= NU
9410: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 LL;. int ssl2
9420: 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a = 0, ssl3 = 0;.
9430: 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 int tls1 = 1
9440: 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c , tls1_1 = 1, tl
9450: 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 s1_2 = 1, tls1_3
9460: 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 = 1;. int pr
9470: 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d oto = 0, level =
9480: 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 -1;. int ver
9490: 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 ify = 0, require
94a0: 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 = 0, request =
94b0: 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 1, post_handshak
94c0: 65 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 e = 0;. (void
94d0: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
94e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
94f0: 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e ed");..#if defin
9500: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 ed(NO_TLS1) || d
9510: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
9520: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 O_TLS1). tls1
9530: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
9540: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
9550: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
9560: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
9570: 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 ). tls1_1 = 0
9580: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
9590: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
95a0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
95b0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 SL_NO_TLS1_2).
95c0: 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 tls1_2 = 0;.#e
95d0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
95e0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 (NO_TLS1_3) || d
95f0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
9600: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c O_TLS1_3). tl
9610: 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 s1_3 = 0;.#endif
9620: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c .. if (objc <
9630: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
9640: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
9650: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
9660: 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 l ?options?");..
9670: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
9680: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
9690: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
96a0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
96b0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
96c0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
96d0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
96e0: 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 (Tcl_Size *) NU
96f0: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 LL), NULL);.
9700: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
9710: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
9720: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
9730: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
9740: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
9750: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
9760: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
9770: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
9780: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
9790: 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 han);.. for (
97a0: 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f idx = 2; idx < o
97b0: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 bjc; idx++) {..c
97c0: 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 har *opt = Tcl_G
97d0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
97e0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 28 54 63 6c 5f objv[idx], (Tcl_
97f0: 53 69 7a 65 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 09 Size *)NULL);...
9800: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d if (opt[0] != '-
9810: 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a ').. break;..
9820: 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c .OPTOBJ("-alpn",
9830: 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 alpn);..OPTSTR(
9840: 22 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 29 "-cadir", CAdir)
9850: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69 ;..OPTSTR("-cafi
9860: 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f le", CAfile);..O
9870: 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 PTBYTE("-cert",
9880: 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b cert, cert_len);
9890: 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 ..OPTSTR("-certf
98a0: 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b ile", certfile);
98b0: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 ..OPTSTR("-ciphe
98c0: 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f r", ciphers);..O
98d0: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 PTSTR("-ciphers"
98e0: 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 , ciphers);..OPT
98f0: 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 STR("-ciphersuit
9900: 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 es", ciphersuite
9910: 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f s);..OPTOBJ("-co
9920: 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b mmand", script);
9930: 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 ..OPTSTR("-dhpar
9940: 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b ams", DHparams);
9950: 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 ..OPTBYTE("-key"
9960: 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b , key, key_len);
9970: 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 ..OPTSTR("-keyfi
9980: 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 le", keyfile);..
9990: 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c OPTSTR("-model",
99a0: 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a model);..OPTOBJ
99b0: 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 ("-password", pa
99c0: 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f ssword);..OPTBOO
99d0: 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 L("-post_handsha
99e0: 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 ke", post_handsh
99f0: 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 ake);..OPTBOOL("
9a00: 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 -request", reque
9a10: 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d st);..OPTBOOL("-
9a20: 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 require", requir
9a30: 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 e);..OPTINT("-se
9a40: 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 6c curity_level", l
9a50: 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 evel);..OPTBOOL(
9a60: 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 "-server", serve
9a70: 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 r);..OPTSTR("-se
9a80: 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 rvername", serve
9a90: 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 rname);..OPTSTR(
9aa0: 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 "-session_id", s
9ab0: 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 ession_id);..OPT
9ac0: 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 BOOL("-ssl2", ss
9ad0: 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d l2);..OPTBOOL("-
9ae0: 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f ssl3", ssl3);..O
9af0: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 PTBOOL("-tls1",
9b00: 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 tls1);..OPTBOOL(
9b10: 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f "-tls1.1", tls1_
9b20: 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 1);..OPTBOOL("-t
9b30: 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b ls1.2", tls1_2);
9b40: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 ..OPTBOOL("-tls1
9b50: 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f .3", tls1_3);..O
9b60: 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 PTOBJ("-validate
9b70: 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b command", vcmd);
9b80: 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 ..OPTOBJ("-vcmd"
9b90: 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 , vcmd);...OPTBA
9ba0: 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c D("option", "-al
9bb0: 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 pn, -cadir, -caf
9bc0: 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 ile, -cert, -cer
9bd0: 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 tfile, -cipher,
9be0: 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 2d -ciphersuites, -
9bf0: 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 command, -dhpara
9c00: 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 ms, -key, -keyfi
9c10: 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 le, -model, -pas
9c20: 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e sword, -post_han
9c30: 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 74 dshake, -request
9c40: 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 63 , -require, -sec
9c50: 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 2d 73 65 urity_level, -se
9c60: 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d rver, -servernam
9c70: 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 e, -session_id,
9c80: 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 -ssl2, -ssl3, -t
9c90: 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 ls1, -tls1.1, -t
9ca0: 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 ls1.2, -tls1.3,
9cb0: 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d or -validatecomm
9cc0: 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 and");...return
9cd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
9ce0: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 . if (request
9cf0: 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c )..verify |= SSL
9d00: 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f _VERIFY_CLIENT_O
9d10: 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 NCE | SSL_VERIFY
9d20: 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28 72 _PEER;. if (r
9d30: 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69 72 equest && requir
9d40: 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c e).verify |= SSL
9d50: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f _VERIFY_FAIL_IF_
9d60: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 NO_PEER_CERT;.
9d70: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 if (request &&
9d80: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 post_handshake)
9d90: 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 .verify |= SSL_V
9da0: 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 ERIFY_POST_HANDS
9db0: 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76 65 HAKE;. if (ve
9dc0: 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65 72 69 rify == 0)..veri
9dd0: 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f fy = SSL_VERIFY_
9de0: 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f NONE;.. proto
9df0: 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f |= (ssl2 ? TLS_
9e00: 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b PROTO_SSL2 : 0);
9e10: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 . proto |= (s
9e20: 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f sl3 ? TLS_PROTO_
9e30: 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 SSL3 : 0);. p
9e40: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 roto |= (tls1 ?
9e50: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a TLS_PROTO_TLS1 :
9e60: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
9e70: 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f = (tls1_1 ? TLS_
9e80: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 PROTO_TLS1_1 : 0
9e90: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
9ea0: 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 (tls1_2 ? TLS_PR
9eb0: 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b OTO_TLS1_2 : 0);
9ec0: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 . proto |= (t
9ed0: 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 ls1_3 ? TLS_PROT
9ee0: 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a O_TLS1_3 : 0);..
9ef0: 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 /* reset to
9f00: 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 NULL if blank st
9f10: 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f ring provided */
9f20: 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26 26 . if (cert &&
9f30: 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20 20 !*cert)..
9f40: 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20 3d cert. =
9f50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b NULL;. if (k
9f60: 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20 ey && !*key)..
9f70: 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20 20 key.
9f80: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
9f90: 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a (certfile && !*
9fa0: 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20 20 certfile)
9fb0: 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c certfile.= NUL
9fc0: 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69 L;. if (keyfi
9fd0: 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 le && !*keyfile)
9fe0: 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 ..keyfile.
9ff0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
a000: 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a 63 (ciphers && !*c
a010: 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20 20 iphers).
a020: 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20 ciphers.
a030: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
a040: 63 69 70 68 65 72 73 75 69 74 65 73 20 26 26 20 ciphersuites &&
a050: 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 29 20 !*ciphersuites)
a060: 63 69 70 68 65 72 73 75 69 74 65 73 20 20 20 20 ciphersuites
a070: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
a080: 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69 CAfile && !*CAfi
a090: 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66 69 le). CAfi
a0a0: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c le. = NUL
a0b0: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69 72 L;. if (CAdir
a0c0: 20 26 26 20 21 2a 43 41 64 69 72 29 09 20 20 20 && !*CAdir).
a0d0: 20 20 20 20 20 43 41 64 69 72 09 20 20 20 20 20 CAdir.
a0e0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
a0f0: 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 f (DHparams && !
a100: 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20 20 *DHparams).
a110: 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20 20 DHparams
a120: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 = NULL;..
a130: 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65 /* new SSL state
a140: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
a150: 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b ..= (State *) ck
a160: 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 alloc((unsigned)
a170: 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b sizeof(State));
a180: 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 . memset(stat
a190: 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 ePtr, 0, sizeof(
a1a0: 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 State));.. st
a1b0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 atePtr->flags.=
a1c0: 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65 flags;. state
a1d0: 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e Ptr->interp.= in
a1e0: 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 terp;. stateP
a1f0: 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 tr->vflags.= ver
a200: 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 ify;. statePt
a210: 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 r->err.= "";..
a220: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 /* allocate sc
a230: 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 ript */. if (
a240: 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 script) {..(void
a250: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
a260: 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 romObj(script, &
a270: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 len);..if (len)
a280: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d {.. statePtr-
a290: 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 >callback = scri
a2a0: 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 pt;.. Tcl_Inc
a2b0: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
a2c0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 tr->callback);..
a2d0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
a2e0: 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 allocate passwor
a2f0: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 d */. if (pas
a300: 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 sword) {..(void)
a310: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
a320: 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 omObj(password,
a330: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 &len);..if (len)
a340: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 {.. statePtr
a350: 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73 ->password = pas
a360: 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f sword;.. Tcl_
a370: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 IncrRefCount(sta
a380: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
a390: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
a3a0: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 /* allocate vali
a3b0: 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a date command */.
a3c0: 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b 0a if (vcmd) {.
a3d0: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 .(void) Tcl_GetS
a3e0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d tringFromObj(vcm
a3f0: 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c d, &len);..if (l
a400: 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 en) {.. state
a410: 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 Ptr->vcmd = vcmd
a420: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 ;.. Tcl_IncrR
a430: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
a440: 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 ->vcmd);..}.
a450: 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 6c }.. if (model
a460: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 != NULL) {..int
a470: 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 mode;../* Get t
a480: 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 he "model" conte
a490: 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 xt */..chan = Tc
a4a0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
a4b0: 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 erp, model, &mod
a4c0: 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d e);..if (chan ==
a4d0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
a4e0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f ULL) {.. Tls_
a4f0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
a500: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
a510: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
a520: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 .}.../*.. * Make
a530: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
a540: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
a550: 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 channel.. */..ch
a560: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
a570: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 hannel(chan);..i
a580: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
a590: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
a5a0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
a5b0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
a5c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
a5d0: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
a5e0: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
a5f0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 elName(chan),...
a600: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
a610: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a hannel", NULL);.
a620: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f . Tcl_SetErro
a630: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
a640: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 LS", "IMPORT", "
a650: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c CHANNEL", "INVAL
a660: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ID", (char *) NU
a670: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
a680: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
a690: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
a6a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
a6b0: 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20 ..ctx = ((State
a6c0: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c *)Tcl_GetChannel
a6d0: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
a6e0: 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 n))->ctx;. }
a6f0: 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 else {..if ((ctx
a700: 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74 = CTX_Init(stat
a710: 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72 ePtr, server, pr
a720: 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 oto, keyfile, ce
a730: 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 rtfile, key, cer
a740: 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e t, (int) key_len
a750: 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 63 65 72 ,.. (int) cer
a760: 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 t_len, CAdir, CA
a770: 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 file, ciphers, c
a780: 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 iphersuites, lev
a790: 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d el, DHparams)) =
a7a0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 = NULL) {.. T
a7b0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
a7c0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
a7d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
a7e0: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 R;..}. }..
a7f0: 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d statePtr->ctx =
a800: 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ctx;.. /*.
a810: 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 * We need to
a820: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 make sure that t
a830: 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 he channel works
a840: 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 in binary (for
a850: 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 the. * encry
a860: 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 ption not to get
a870: 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 goofed up)..
a880: 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 * We only want
a890: 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 to adjust the b
a8a0: 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d uffering in pre-
a8b0: 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 v2 channels, whe
a8c0: 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 re. * each c
a8d0: 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 hannel in the st
a8e0: 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 ack maintained i
a8f0: 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a ts own buffers..
a900: 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f */. Tcl_
a910: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
a920: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
a930: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 tion);. Tcl_D
a940: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
a950: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
a960: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
a970: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
a980: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 nnelEOFChar);.
a990: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
a9a0: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 t(&upperChannelE
a9b0: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 ncoding);. Tc
a9c0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_GetChannelOpti
a9d0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
a9e0: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 "-eofchar", &up
a9f0: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 perChannelEOFCha
aa00: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 r);. Tcl_GetC
aa10: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
aa20: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 erp, chan, "-enc
aa30: 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 oding", &upperCh
aa40: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a annelEncoding);.
aa50: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e Tcl_GetChann
aa60: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
aa70: 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 chan, "-transla
aa80: 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 tion", &upperCha
aa90: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 nnelTranslation)
aaa0: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
aab0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
aac0: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b p, chan, "-block
aad0: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e ing", &upperChan
aae0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 nelBlocking);.
aaf0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
ab00: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
ab10: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 han, "-translati
ab20: 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a on", "binary");.
ab30: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
ab40: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
ab50: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e chan, "-blockin
ab60: 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20 g", "true");.
ab70: 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d dprintf("Consum
ab80: 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 ing Tcl channel
ab90: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e %s", Tcl_GetChan
aba0: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a nelName(chan));.
abb0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 statePtr->se
abc0: 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 lf = Tcl_StackCh
abd0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c annel(interp, Tl
abe0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c s_ChannelType(),
abf0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 (ClientData) st
ac00: 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 atePtr, (TCL_REA
ac10: 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 DABLE | TCL_WRIT
ac20: 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 ABLE), chan);.
ac30: 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 dprintf("Creat
ac40: 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 ed channel named
ac50: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 %s", Tcl_GetCha
ac60: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
ac70: 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 r->self));. i
ac80: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c f (statePtr->sel
ac90: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 f == (Tcl_Channe
aca0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 l) NULL) {../*..
acb0: 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c * No use of Tcl
acc0: 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 _EventuallyFree
acd0: 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 because no possi
ace0: 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65 ble Tcl_Preserve
acf0: 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 ... */..Tls_Free
ad00: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
ad10: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c tr);..return TCL
ad20: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
ad30: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
ad40: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
ad50: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 statePtr->self,
ad60: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 "-translation",
ad70: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
ad80: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 (&upperChannelTr
ad90: 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 anslation));.
ada0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
adb0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 ption(interp, st
adc0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d atePtr->self, "-
add0: 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 encoding", Tcl_D
ade0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
adf0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
ae00: 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 g));. Tcl_Set
ae10: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
ae20: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e terp, statePtr->
ae30: 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 self, "-eofchar"
ae40: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
ae50: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
ae60: 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54 EOFChar));. T
ae70: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
ae80: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
ae90: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c ePtr->self, "-bl
aea0: 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 ocking", Tcl_DSt
aeb0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
aec0: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 ChannelBlocking)
aed0: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 );.. /*.
aee0: 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 * SSL Initializa
aef0: 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 tion. */.
af00: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d statePtr->ssl =
af10: 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 SSL_new(statePt
af20: 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 r->ctx);. if
af30: 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 (!statePtr->ssl)
af40: 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 {../* SSL libra
af50: 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c ry error */..Tcl
af60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
af70: 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 terp, "couldn't
af80: 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 construct ssl se
af90: 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e ssion: ", REASON
afa0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
afb0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
afc0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
afd0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
afe0: 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c ", "INIT", "FAIL
aff0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
b000: 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 LL);..Tls_Free((
b010: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
b020: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
b030: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
b040: 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 /* Set host ser
b050: 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 ver name */.
b060: 69 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 if (servername)
b070: 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 {../* Sets the s
b080: 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 erver name indic
b090: 61 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 ation (SNI) in C
b0a0: 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e lientHello exten
b0b0: 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 sion */../* Per
b0c0: 52 46 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 RFC 6066, hostna
b0d0: 6d 65 20 69 73 20 61 20 41 53 43 49 49 20 65 6e me is a ASCII en
b0e0: 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 74 68 coded string, th
b0f0: 6f 75 67 68 20 52 46 43 20 34 33 36 36 20 73 61 ough RFC 4366 sa
b100: 79 73 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 ys UTF-8. */..if
b110: 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 (!SSL_set_tlsex
b120: 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 t_host_name(stat
b130: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 ePtr->ssl, serve
b140: 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 rname) && requir
b150: 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 e) {.. Tcl_Ap
b160: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
b170: 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c 53 20 p, "setting TLS
b180: 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 host name extens
b190: 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 63 68 ion failed", (ch
b1a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b1b0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
b1c0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
b1d0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 , "IMPORT", "SNI
b1e0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
b1f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b200: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
b210: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
b220: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
b230: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 RROR;..}.../* Se
b240: 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 t hostname for p
b250: 65 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20 eer certificate
b260: 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63 hostname verific
b270: 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 ation in clients
b280: 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20 ... Don't use
b290: 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 SSL_set1_host si
b2a0: 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74 nce it has limit
b2b0: 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 ations. */..if (
b2c0: 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 !SSL_add1_host(s
b2d0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 tatePtr->ssl, se
b2e0: 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 rvername)) {..
b2f0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
b300: 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74 lt(interp, "sett
b310: 69 6e 67 20 44 4e 53 20 68 6f 73 74 20 6e 61 6d ing DNS host nam
b320: 65 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 e failed", (char
b330: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
b340: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
b350: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
b360: 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e "IMPORT", "HOSTN
b370: 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 AME", "FAILED",
b380: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
b390: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
b3a0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
b3b0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
b3c0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 L_ERROR;..}.
b3d0: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 }.. /* Resume
b3e0: 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 session id */.
b3f0: 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 if (session_i
b400: 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 d && strlen(sess
b410: 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d ion_id) <= SSL_M
b420: 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 AX_SID_CTX_LENGT
b430: 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 H) {../* SSL_set
b440: 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 _session() */..i
b450: 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f f (!SSL_SESSION_
b460: 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 set1_id_context(
b470: 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_get_session(
b480: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 statePtr->ssl),
b490: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 session_id, (uns
b4a0: 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 igned int) strle
b4b0: 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 n(session_id)))
b4c0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
b4d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
b4e0: 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 "Resume session
b4f0: 69 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 id ", session_id
b500: 2c 20 22 20 66 61 69 6c 65 64 22 2c 20 28 63 68 , " failed", (ch
b510: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b520: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
b530: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
b540: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 , "IMPORT", "SES
b550: 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c SION", "FAILED",
b560: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b570: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
b580: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
b590: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
b5a0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 CL_ERROR;..}.
b5b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c }.. /* Enabl
b5c0: 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 e Application-La
b5d0: 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 yer Protocol Neg
b5e0: 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c otiation. Exampl
b5f0: 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 es are: http/1.0
b600: 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c ,..http/1.1, h2,
b610: 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 h3, ftp, imap,
b620: 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e pop3, xmpp-clien
b630: 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 t, xmpp-server,
b640: 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 mqtt, irc, etc.
b650: 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 */. if (alpn)
b660: 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 {../* Convert a
b670: 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 TCL list into a
b680: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 protocol-list i
b690: 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f n wire-format */
b6a0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
b6b0: 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e *protos, *p;..un
b6c0: 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f signed int proto
b6d0: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f s_len = 0;..Tcl_
b6e0: 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e Size cnt, i;..in
b6f0: 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a t j;..Tcl_Obj **
b700: 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f list;...if (Tcl_
b710: 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e ListObjGetElemen
b720: 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c ts(interp, alpn,
b730: 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d &cnt, &list) !=
b740: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 TCL_OK) {..
b750: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
b760: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
b770: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
b780: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 OR;..}.../* Dete
b790: 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 rmine the memory
b7a0: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 required for th
b7b0: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 e protocol-list
b7c0: 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 */..for (i = 0;
b7d0: 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a i < cnt; i++) {.
b7e0: 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 . Tcl_GetStri
b7f0: 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 ngFromObj(list[i
b800: 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 ], &len);.. i
b810: 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a f (len > 255) {.
b820: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
b830: 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e lt(interp, "ALPN
b840: 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 protocol name t
b850: 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 oo long", (char
b860: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f *) NULL);...Tcl_
b870: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
b880: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
b890: 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 ORT", "ALPN", "F
b8a0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
b8b0: 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 NULL);...Tls_Fr
b8c0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
b8d0: 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 ePtr);...return
b8e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
b8f0: 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 }.. protos_le
b900: 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c n += 1 + (int) l
b910: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c en;..}.../* Buil
b920: 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 d the complete p
b930: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a rotocol-list */.
b940: 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f .protos = ckallo
b950: 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 c(protos_len);..
b960: 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 /* protocol-list
b970: 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 s consist of 8-b
b980: 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 it length-prefix
b990: 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 ed, byte strings
b9a0: 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c */..for (j = 0,
b9b0: 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c p = protos; j <
b9c0: 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 cnt; j++) {..
b9d0: 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 char *str = Tc
b9e0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
b9f0: 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e bj(list[j], &len
ba00: 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 );.. *p++ = (
ba10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 20 6c unsigned char) l
ba20: 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 en;.. memcpy(
ba30: 70 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 p, str, (size_t)
ba40: 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d len);.. p +=
ba50: 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 len;..}.../* SS
ba60: 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f L_set_alpn_proto
ba70: 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f s makes a copy o
ba80: 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c f the protocol-l
ba90: 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a ist */../* Note:
baa0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 This functions
bab0: 72 65 76 65 72 73 65 73 20 74 68 65 20 72 65 74 reverses the ret
bac0: 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e urn value conven
bad0: 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c tion */..if (SSL
bae0: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 _set_alpn_protos
baf0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
bb00: 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c protos, protos_l
bb10: 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f en)) {.. Tcl_
bb20: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
bb30: 65 72 70 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 erp, "failed to
bb40: 73 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f set ALPN protoco
bb50: 6c 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ls", (char *) NU
bb60: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
bb70: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
bb80: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
bb90: 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 T", "ALPN", "FAI
bba0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
bbb0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
bbc0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
bbd0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 tePtr);.. ckf
bbe0: 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 ree(protos);..
bbf0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
bc00: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 OR;..}.../* Stor
bc10: 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 e protocols list
bc20: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 */..statePtr->p
bc30: 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a rotos = protos;.
bc40: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
bc50: 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c s_len = protos_l
bc60: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b en;. } else {
bc70: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
bc80: 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 os = NULL;..stat
bc90: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e ePtr->protos_len
bca0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 = 0;. }..
bcb0: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 /*. * SSL C
bcc0: 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f allbacks. */
bcd0: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 . SSL_set_app
bce0: 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e _data(statePtr->
bcf0: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ssl, (void *)sta
bd00: 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 tePtr);./* point
bd10: 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 back to us */.
bd20: 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 SSL_set_verif
bd30: 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c y(statePtr->ssl,
bd40: 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 verify, VerifyC
bd50: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 allback);. SS
bd60: 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 L_set_info_callb
bd70: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ack(statePtr->ss
bd80: 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 l, InfoCallback)
bd90: 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 ;.. /* Callba
bda0: 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 ck for observing
bdb0: 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 protocol messag
bdc0: 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 es */.#ifndef OP
bdd0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 ENSSL_NO_SSL_TRA
bde0: 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 CE. /* void S
bdf0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 SL_CTX_set_msg_c
be00: 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 allback_arg(stat
be10: 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 ePtr->ctx, (void
be20: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 *)statePtr);.
be30: 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 void SSL_CTX_s
be40: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 et_msg_callback(
be50: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d statePtr->ctx, M
be60: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b essageCallback);
be70: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f */. SSL_set_
be80: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 msg_callback_arg
be90: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
bea0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
beb0: 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d );. SSL_set_m
bec0: 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 sg_callback(stat
bed0: 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 ePtr->ssl, Messa
bee0: 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e geCallback);.#en
bef0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 dif.. /* Crea
bf00: 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 te Tcl_Channel B
bf10: 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 IO Handler */.
bf20: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 statePtr->p_bi
bf30: 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 o.= BIO_new_tcl(
bf40: 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f statePtr, BIO_NO
bf50: 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 CLOSE);. stat
bf60: 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f ePtr->bio.= BIO_
bf70: 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 new(BIO_f_ssl())
bf80: 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 ;.. if (serve
bf90: 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 r) {../* Server
bfa0: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 callbacks */..SS
bfb0: 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 L_CTX_set_tlsext
bfc0: 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 _servername_arg(
bfd0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 statePtr->ctx, (
bfe0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
bff0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 ;..SSL_CTX_set_t
c000: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 lsext_servername
c010: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 _callback(stateP
c020: 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c tr->ctx, SNICall
c030: 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f back);..SSL_CTX_
c040: 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f set_client_hello
c050: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
c060: 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b x, HelloCallback
c070: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
c080: 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 tr);..if (stateP
c090: 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 tr->protos != NU
c0a0: 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 LL) {.. SSL_C
c0b0: 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 TX_set_alpn_sele
c0c0: 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ct_cb(statePtr->
c0d0: 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 ctx, ALPNCallbac
c0e0: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
c0f0: 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45 Ptr);.#ifdef USE
c100: 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c _NPN.. if (tl
c110: 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 s1_2 == 0 && tls
c120: 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 1_3 == 0) {...SS
c130: 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 L_CTX_set_next_p
c140: 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 rotos_advertised
c150: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
c160: 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 x, NPNCallback,
c170: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
c180: 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 );.. }.#endif
c190: 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 ..}.../* Enable
c1a0: 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63 server to send c
c1b0: 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65 ert request afte
c1c0: 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 r handshake (TLS
c1d0: 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 1.3 only) */../
c1e0: 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 74 * A write operat
c1f0: 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c ion must take pl
c200: 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 74 ace for the Cert
c210: 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74 20 ificate Request
c220: 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74 to be.. sent t
c230: 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 o the client, th
c240: 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 is can be done w
c250: 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 ith SSL_do_hands
c260: 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 hake(). */..if (
c270: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f request && post_
c280: 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c 73 handshake && tls
c290: 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 1_3) {.. SSL_
c2a0: 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f verify_client_po
c2b0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 st_handshake(sta
c2c0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a tePtr->ssl);..}.
c2d0: 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 ../* set automat
c2e0: 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 69 ic curve selecti
c2f0: 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 on */..SSL_set_e
c300: 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50 74 cdh_auto(statePt
c310: 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a r->ssl, 1);.../*
c320: 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65 Set server mode
c330: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 */..statePtr->f
c340: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f lags |= TLS_TCL_
c350: 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 SERVER;..SSL_set
c360: 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 _accept_state(st
c370: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
c380: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 } else {../* C
c390: 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 lient callbacks
c3a0: 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 */.#ifdef USE_NP
c3b0: 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d N..if (statePtr-
c3c0: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 >protos != NULL
c3d0: 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 && tls1_2 == 0 &
c3e0: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b & tls1_3 == 0) {
c3f0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
c400: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c t_next_proto_sel
c410: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d ect_cb(statePtr-
c420: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 >ctx, ALPNCallba
c430: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
c440: 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 ePtr);..}.#endif
c450: 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 .../* Session ca
c460: 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 ching */..SSL_CT
c470: 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 X_set_session_ca
c480: 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 che_mode(statePt
c490: 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 r->ctx, SSL_SESS
c4a0: 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 _CACHE_CLIENT |
c4b0: 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e SSL_SESS_CACHE_N
c4c0: 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 O_INTERNAL_STORE
c4d0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 );..SSL_CTX_sess
c4e0: 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 _set_new_cb(stat
c4f0: 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 ePtr->ctx, Sessi
c500: 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f onCallback);.../
c510: 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 * Enable post ha
c520: 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 ndshake Authenti
c530: 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e cation extension
c540: 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 . TLS 1.3 only,
c550: 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 not http/2. */..
c560: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 if (request && p
c570: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b ost_handshake) {
c580: 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f .. SSL_set_po
c590: 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 st_handshake_aut
c5a0: 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c h(statePtr->ssl,
c5b0: 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 1);..}.../* Set
c5c0: 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a client mode */.
c5d0: 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 .SSL_set_connect
c5e0: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d _state(statePtr-
c5f0: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 >ssl);. }.
c600: 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 SSL_set_bio(sta
c610: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 tePtr->ssl, stat
c620: 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 ePtr->p_bio, sta
c630: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 tePtr->p_bio);.
c640: 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 BIO_set_ssl(s
c650: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 tatePtr->bio, st
c660: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f atePtr->ssl, BIO
c670: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 _NOCLOSE);..
c680: 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 /*. * End of
c690: 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a SSL Init. *
c6a0: 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 /. dprintf("R
c6b0: 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 eturning %s", Tc
c6c0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
c6d0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
c6e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 );. Tcl_SetRe
c6f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 sult(interp, (ch
c700: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 ar *) Tcl_GetCha
c710: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
c720: 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f r->self), TCL_VO
c730: 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 LATILE);.. re
c740: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
c750: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
c760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
c7a0: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d UnimportObjCmd -
c7b0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
c7c0: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
c7d0: 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 d to remove the
c7e0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
c7f0: 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 filter.. *. * Re
c800: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
c810: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
c820: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
c830: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 cts:. *.May modi
c840: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 fy the behavior
c850: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c of an IO channel
c860: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
c870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
c8b0: 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f tatic int.Unimpo
c8c0: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 rtObjCmd(ClientD
c8d0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
c8e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
c8f0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
c900: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
c910: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
c920: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
c930: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
c940: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
c950: 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 /. (void) cli
c960: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 entData;.. dp
c970: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
c980: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
c990: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
c9a0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
c9b0: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
c9c0: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 el");..return TC
c9d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
c9e0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
c9f0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
ca00: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 , Tcl_GetString(
ca10: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b objv[1]), NULL);
ca20: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
ca30: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
ca40: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
ca50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
ca60: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
ca70: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
ca80: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
ca90: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
caa0: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
cab0: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 nel(chan);..
cac0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
cad0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
cae0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
caf0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
cb00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
cb10: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
cb20: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
cb30: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
cb40: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
cb50: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 nel", NULL);..
cb60: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
cb70: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
cb80: 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 , "UNIMPORT", "C
cb90: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
cba0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
cbb0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
cbc0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
cbd0: 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 if (Tcl_Unstac
cbe0: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c kChannel(interp,
cbf0: 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 chan) == TCL_ER
cc00: 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ROR) {..return T
cc10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
cc20: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
cc30: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
cc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc80: 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 . *. * CTX_Init
cc90: 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 -- construct a S
cca0: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a SL_CTX instance.
ccb0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
ccc0: 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 *.A valid SSL_CT
ccd0: 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 X instance or NU
cce0: 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 LL.. *. * Side e
ccf0: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 ffects:. *.const
cd00: 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 ructs SSL contex
cd10: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d t (CTX). *. *---
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd60: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f . */.static SSL_
cd70: 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 CTX *.CTX_Init(S
cd80: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
cd90: 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e int isServer, in
cda0: 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b t proto, char *k
cdb0: 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 eyfile, char *ce
cdc0: 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 rtfile,. unsi
cdd0: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 gned char *key,
cde0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 unsigned char *c
cdf0: 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e ert, int key_len
ce00: 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 , int cert_len,
ce10: 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 20 char *CAdir,.
ce20: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 char *CAfile, c
ce30: 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 har *ciphers, ch
ce40: 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 ar *ciphersuites
ce50: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 , int level, cha
ce60: 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 r *DHparams) {.
ce70: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
ce80: 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 nterp = statePtr
ce90: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 ->interp;. SS
cea0: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c L_CTX *ctx = NUL
ceb0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 L;. Tcl_DStri
cec0: 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 ng ds;. Tcl_D
ced0: 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 String ds1;.
cee0: 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 int off = 0;.
cef0: 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 int load_privat
cf00: 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 e_key;. const
cf10: 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 SSL_METHOD *met
cf20: 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 hod;.. dprint
cf30: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
cf40: 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a if (!proto) {.
cf50: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
cf60: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 t(interp, "no va
cf70: 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c lid protocol sel
cf80: 65 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 ected", (char *)
cf90: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
cfa0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
cfb0: 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 /* create SSL c
cfc0: 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 ontext */.#if OP
cfd0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
cfe0: 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 MBER >= 0x101000
cff0: 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 00L || defined(N
d000: 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e O_SSL2) || defin
d010: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
d020: 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 L2). if (ENAB
d030: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
d040: 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 ROTO_SSL2)) {..T
d050: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d060: 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 interp, "SSL2 pr
d070: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d080: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
d090: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d0a0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
d0b0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
d0c0: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
d0d0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
d0e0: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 3). if (ENABL
d0f0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d100: 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 OTO_SSL3)) {..Tc
d110: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d120: 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f nterp, "SSL3 pro
d130: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
d140: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
d150: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
d160: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
d170: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
d180: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 TLS1) || defined
d190: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d1a0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
d1b0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
d1c0: 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c TO_TLS1)) {..Tcl
d1d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d1e0: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 terp, "TLS 1.0 p
d1f0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
d200: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
d210: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
d220: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
d230: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
d240: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 O_TLS1_1) || def
d250: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d260: 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 TLS1_1). if (
d270: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
d280: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 LS_PROTO_TLS1_1)
d290: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
d2a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 esult(interp, "T
d2b0: 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 LS 1.1 protocol
d2c0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
d2d0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
d2e0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
d2f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 }.#endif.#if d
d300: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
d310: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
d320: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a NSSL_NO_TLS1_2).
d330: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 if (ENABLED(
d340: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
d350: 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c _TLS1_2)) {..Tcl
d360: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d370: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 terp, "TLS 1.2 p
d380: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
d390: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
d3a0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
d3b0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
d3c0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
d3d0: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 O_TLS1_3) || def
d3e0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d3f0: 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 TLS1_3). if (
d400: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
d410: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
d420: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
d430: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 esult(interp, "T
d440: 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 LS 1.3 protocol
d450: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
d460: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
d470: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
d480: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 }.#endif. i
d490: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b f (proto == 0) {
d4a0: 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 ../* Use full ra
d4b0: 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f nge */..SSL_CTX_
d4c0: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 set_min_proto_ve
d4d0: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 rsion(ctx, 0);..
d4e0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f SSL_CTX_set_max_
d4f0: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
d500: 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 x, 0);. }..
d510: 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 switch (proto)
d520: 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 {.#if OPENSSL_V
d530: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
d540: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 0x10100000L && !
d550: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
d560: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d570: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 NSSL_NO_SSL2).
d580: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
d590: 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d _SSL2:..method =
d5a0: 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 isServer ? SSLv
d5b0: 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 2_server_method(
d5c0: 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 ) : SSLv2_client
d5d0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
d5e0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
d5f0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
d600: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
d610: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 SSL_NO_SSL3) &&
d620: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
d630: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 _NO_SSL3_METHOD)
d640: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
d650: 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f OTO_SSL3:..metho
d660: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 d = isServer ? S
d670: 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 SLv3_server_meth
d680: 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 od() : SSLv3_cli
d690: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
d6a0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
d6b0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
d6c0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
d6d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 PENSSL_NO_TLS1)
d6e0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
d6f0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 SSL_NO_TLS1_METH
d700: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 OD). case TLS
d710: 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 _PROTO_TLS1:..me
d720: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
d730: 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d ? TLSv1_server_m
d740: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f ethod() : TLSv1_
d750: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
d760: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
d770: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
d780: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
d790: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d7a0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
d7b0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d7c0: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_1_METHOD).
d7d0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
d7e0: 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 TLS1_1:..method
d7f0: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 = isServer ? TLS
d800: 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 v1_1_server_meth
d810: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 od() : TLSv1_1_c
d820: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
d830: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
d840: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
d850: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
d860: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d870: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
d880: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d890: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_2_METHOD).
d8a0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
d8b0: 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_2:..method =
d8c0: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
d8d0: 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 1_2_server_metho
d8e0: 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c d() : TLSv1_2_cl
d8f0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
d900: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
d910: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
d920: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
d930: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d940: 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 1_3). case TL
d950: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a S_PROTO_TLS1_3:.
d960: 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 ./* Use the gene
d970: 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 ric method and c
d980: 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 onstraint range
d990: 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 after context is
d9a0: 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 created */..met
d9b0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
d9c0: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 TLS_server_meth
d9d0: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e od() : TLS_clien
d9e0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
d9f0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 ak;.#endif. d
da00: 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f efault:../* Nego
da10: 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 tiate highest av
da20: 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 ailable SSL/TLS
da30: 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 version */..meth
da40: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
da50: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f TLS_server_metho
da60: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 d() : TLS_client
da70: 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f _method();.#if O
da80: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
da90: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
daa0: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 00L && !defined(
dab0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 NO_SSL2) && !def
dac0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
dad0: 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 SSL2)..off |= (E
dae0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
daf0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 S_PROTO_SSL2)
db00: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
db10: 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 SSLv2);.#endif.#
db20: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 if !defined(NO_S
db30: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
db40: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
db50: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
db60: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
db70: 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 OTO_SSL3) ? 0
db80: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 : SSL_OP_NO_SSLv
db90: 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 3);.#endif.#if !
dba0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
dbb0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
dbc0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f NSSL_NO_TLS1)..o
dbd0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
dbe0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
dbf0: 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 TLS1) ? 0 : SS
dc00: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a L_OP_NO_TLSv1);.
dc10: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
dc20: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 ned(NO_TLS1_1) &
dc30: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
dc40: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f SL_NO_TLS1_1)..o
dc50: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
dc60: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
dc70: 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 TLS1_1) ? 0 : SS
dc80: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 L_OP_NO_TLSv1_1)
dc90: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
dca0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
dcb0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
dcc0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a NSSL_NO_TLS1_2).
dcd0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
dce0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
dcf0: 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 O_TLS1_2) ? 0 :
dd00: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f SSL_OP_NO_TLSv1_
dd10: 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 2);.#endif.#if !
dd20: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
dd30: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
dd40: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
dd50: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
dd60: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
dd70: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 OTO_TLS1_3) ? 0
dd80: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
dd90: 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 1_3);.#endif..br
dda0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 eak;. }..
ddb0: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
ddc0: 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 );.. ctx = SS
ddd0: 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 L_CTX_new(method
dde0: 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 );. if (!ctx)
ddf0: 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 {..return(NULL)
de00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
de10: 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f (getenv(SSLKEYLO
de20: 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 GFILE)) {..SSL_C
de30: 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 TX_set_keylog_ca
de40: 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c llback(ctx, KeyL
de50: 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 ogCallback);.
de60: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 }..#if !defined
de70: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 (NO_TLS1_3) && !
de80: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
de90: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 NO_TLS1_3). i
dea0: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f f (proto == TLS_
deb0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a PROTO_TLS1_3) {.
dec0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e .SSL_CTX_set_min
ded0: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
dee0: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
def0: 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 ON);..SSL_CTX_se
df00: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 t_max_proto_vers
df10: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
df20: 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a VERSION);. }.
df30: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 #endif.. /* F
df40: 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 orce cipher sele
df50: 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 ction order by s
df60: 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 erver */. if
df70: 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 (!isServer) {..S
df80: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
df90: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 ns(ctx, SSL_OP_C
dfa0: 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 IPHER_SERVER_PRE
dfb0: 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a FERENCE);. }.
dfc0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
dfd0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
dfe0: 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 10100000L. Op
dff0: 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c enSSL_add_all_al
e000: 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c gorithms(); /* L
e010: 6f 61 64 20 63 69 70 68 65 72 73 20 61 6e 64 20 oad ciphers and
e020: 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 digests */.#endi
e030: 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 f.. SSL_CTX_s
e040: 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c et_app_data(ctx,
e050: 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b (void*)interp);
e060: 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 ./* remember the
e070: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a interpreter */.
e080: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
e090: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c options(ctx, SSL
e0a0: 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c _OP_ALL);./* all
e0b0: 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f SSL bug workaro
e0c0: 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f unds */. SSL_
e0d0: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
e0e0: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 ctx, SSL_OP_NO_C
e0f0: 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 OMPRESSION);./*
e100: 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 disable compress
e110: 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 ion even if supp
e120: 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c orted */. SSL
e130: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
e140: 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 (ctx, off);../*
e150: 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c disable protocol
e160: 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 versions */.#if
e170: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
e180: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
e190: 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 1000L. SSL_CT
e1a0: 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 X_set_mode(ctx,
e1b0: 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 SSL_MODE_AUTO_RE
e1c0: 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 TRY);./* handle
e1d0: 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 new handshakes i
e1e0: 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e n background. On
e1f0: 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f by default in O
e200: 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f penSSL 1.1.1. */
e210: 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f .#endif. SSL_
e220: 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 CTX_sess_set_cac
e230: 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 he_size(ctx, 128
e240: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 );.. /* Set u
e250: 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 ser defined ciph
e260: 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 ers, cipher suit
e270: 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 es, and security
e280: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 level */. if
e290: 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 ((ciphers != NU
e2a0: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f LL) && !SSL_CTX_
e2b0: 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 set_cipher_list(
e2c0: 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b ctx, ciphers)) {
e2d0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
e2e0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 lt(interp, "Set
e2f0: 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 ciphers failed:
e300: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 No valid ciphers
e310: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
e320: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
e330: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e (ctx);..return N
e340: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
e350: 66 20 28 28 63 69 70 68 65 72 73 75 69 74 65 73 f ((ciphersuites
e360: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 != NULL) && !SS
e370: 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 L_CTX_set_cipher
e380: 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 suites(ctx, ciph
e390: 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 ersuites)) {..Tc
e3a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e3b0: 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 nterp, "Set ciph
e3c0: 65 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 er suites failed
e3d0: 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 : No valid ciphe
e3e0: 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 rs", (char *) NU
e3f0: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 LL);..SSL_CTX_fr
e400: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e ee(ctx);..return
e410: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
e420: 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 /* Set securit
e430: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 y level */. i
e440: 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 f (level > -1 &&
e450: 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f level < 6) {../
e460: 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 * SSL_set_securi
e470: 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c ty_level */..SSL
e480: 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 _CTX_set_securit
e490: 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 y_level(ctx, lev
e4a0: 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 el);. }..
e4b0: 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c /* set some call
e4c0: 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c backs */. SSL
e4d0: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 _CTX_set_default
e4e0: 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 _passwd_cb(ctx,
e4f0: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b PasswordCallback
e500: 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 );. SSL_CTX_s
e510: 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 et_default_passw
e520: 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 d_cb_userdata(ct
e530: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 x, (void *)state
e540: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 Ptr);.. /* re
e550: 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c ad a Diffie-Hell
e560: 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 man parameters f
e570: 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 ile, or use the
e580: 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a built-in one */.
e590: 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e #ifdef OPENSSL_N
e5a0: 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 O_DH. if (DHp
e5b0: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b arams != NULL) {
e5c0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
e5d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 lt(interp, "DH p
e5e0: 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 arameter support
e5f0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c not available",
e600: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
e610: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
e620: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
e630: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 L;. }.#else.
e640: 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 {..DH* dh;..i
e650: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e f (DHparams != N
e660: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 ULL) {.. BIO
e670: 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 *bio;.. Tcl_D
e680: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b StringInit(&ds);
e690: 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f .. bio = BIO_
e6a0: 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 new_file(F2N(DHp
e6b0: 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 arams, &ds), "r"
e6c0: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f );.. if (!bio
e6d0: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
e6e0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 gFree(&ds);...Tc
e6f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e700: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f nterp, "Could no
e710: 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 t find DH parame
e720: 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 ters file", (cha
e730: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
e740: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
e750: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
e760: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 . }... dh
e770: 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 = PEM_read_bio_D
e780: 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c Hparams(bio, NUL
e790: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a L, NULL, NULL);.
e7a0: 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 . BIO_free(bi
e7b0: 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 o);.. Tcl_DSt
e7c0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
e7d0: 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 if (!dh) {..
e7e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
e7f0: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 t(interp, "Could
e800: 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 not read DH par
e810: 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c ameters from fil
e820: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c e", (char *) NUL
e830: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
e840: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
e850: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 n NULL;.. }..
e860: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
e870: 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b tmp_dh(ctx, dh);
e880: 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28 64 68 .. DH_free(dh
e890: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 );...} else {..
e8a0: 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b /* Use well k
e8b0: 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74 65 nown DH paramete
e8c0: 72 73 20 74 68 61 74 20 68 61 76 65 20 62 75 69 rs that have bui
e8d0: 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69 6e lt-in support in
e8e0: 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 OpenSSL */..
e8f0: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 if (!SSL_CTX_se
e900: 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 t_dh_auto(ctx, 1
e910: 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e )) {...Tcl_Appen
e920: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
e930: 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c "Could not enabl
e940: 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20 22 e set DH auto: "
e950: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 , REASON(), (cha
e960: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
e970: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
e980: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
e990: 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a . }..}. }.
e9a0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 #endif.. /* s
e9b0: 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 et our certifica
e9c0: 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 te */. load_p
e9d0: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a rivate_key = 0;.
e9e0: 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 if (certfile
e9f0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 != NULL) {..loa
ea00: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 d_private_key =
ea10: 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 1;...Tcl_DString
ea20: 49 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 Init(&ds);...if
ea30: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 (SSL_CTX_use_cer
ea40: 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 tificate_file(ct
ea50: 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c x, F2N(certfile,
ea60: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 &ds), SSL_FILET
ea70: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b YPE_PEM) <= 0) {
ea80: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
ea90: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 gFree(&ds);..
eaa0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
eab0: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
eac0: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 e to set certifi
ead0: 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 cate file ", cer
eae0: 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 tfile, ": ",....
eaf0: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 REASON(), (
eb00: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
eb10: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
eb20: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 (ctx);.. retu
eb30: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 rn NULL;..}.
eb40: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 } else if (cert
eb50: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 != NULL) {..load
eb60: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 _private_key = 1
eb70: 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 ;..if (SSL_CTX_u
eb80: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 se_certificate_A
eb90: 53 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 SN1(ctx, cert_le
eba0: 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b n, cert) <= 0) {
ebb0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
ebc0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 gFree(&ds);..
ebd0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
ebe0: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
ebf0: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 e to set certifi
ec00: 63 61 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 cate: ",....
ec10: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
ec20: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
ec30: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
ec40: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
ec50: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c ULL;..}. } el
ec60: 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d se {..certfile =
ec70: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 (char*)X509_get
ec80: 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 _default_cert_fi
ec90: 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f le();...if (SSL_
eca0: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
ecb0: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 ate_file(ctx, ce
ecc0: 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 rtfile, SSL_FILE
ecd0: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 TYPE_PEM) <= 0)
ece0: 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c {.#if 0.. Tcl
ecf0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
ed00: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 );.. Tcl_Appe
ed10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ed20: 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 "unable to use
ed30: 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 default certific
ed40: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 ate file ", cert
ed50: 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 file, ": ",....
ed60: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 REASON(), (c
ed70: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
ed80: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 SSL_CTX_free(
ed90: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ctx);.. retur
eda0: 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 n NULL;.#endif..
edb0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
edc0: 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 set our private
edd0: 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c key */. if (l
ede0: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 oad_private_key)
edf0: 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 {..if (keyfile
ee00: 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d == NULL && key =
ee10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b = NULL) {.. k
ee20: 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c eyfile = certfil
ee30: 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 e;..}...if (keyf
ee40: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile != NULL) {..
ee50: 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 /* get the p
ee60: 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 rivate key assoc
ee70: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 iated with this
ee80: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
ee90: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 if (keyfile
eea0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 == NULL) {...key
eeb0: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b file = certfile;
eec0: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 .. }... if
eed0: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 (SSL_CTX_use_Pr
eee0: 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 ivateKey_file(ct
eef0: 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 x, F2N(keyfile,
ef00: 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 &ds), SSL_FILETY
ef10: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a PE_PEM) <= 0) {.
ef20: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
ef30: 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 e(&ds);.../* flu
ef40: 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 sh the passphras
ef50: 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 e which might be
ef60: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 left in the res
ef70: 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 ult */...Tcl_Set
ef80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e Result(interp, N
ef90: 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 ULL, TCL_STATIC)
efa0: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 ;...Tcl_AppendRe
efb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e sult(interp, "un
efc0: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c able to set publ
efd0: 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b ic key file ", k
efe0: 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 eyfile, " ",....
eff0: 20 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 REASON(
f000: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
f010: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 );...SSL_CTX_fre
f020: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e e(ctx);...return
f030: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 NULL;.. }..
f040: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
f050: 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 ee(&ds);...} els
f060: 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c e if (key != NUL
f070: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 L) {.. if (SS
f080: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 L_CTX_use_Privat
f090: 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b eKey_ASN1(EVP_PK
f0a0: 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 EY_RSA, ctx, key
f0b0: 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 ,key_len) <= 0)
f0c0: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 {...Tcl_DStringF
f0d0: 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 ree(&ds);.../* f
f0e0: 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 lush the passphr
f0f0: 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 ase which might
f100: 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 be left in the r
f110: 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 esult */...Tcl_S
f120: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
f130: 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 NULL, TCL_STATI
f140: 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 C);...Tcl_Append
f150: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
f160: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 unable to set pu
f170: 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 blic key: ", REA
f180: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
f190: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
f1a0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
f1b0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
f1c0: 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 }..}../* Now we
f1d0: 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 know that a key
f1e0: 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 and cert have be
f1f0: 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 en set against..
f200: 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 * the SSL conte
f210: 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f xt */..if (!SSL_
f220: 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 CTX_check_privat
f230: 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 e_key(ctx)) {..
f240: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
f250: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 ult(interp, "pri
f260: 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f vate key does no
f270: 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 t match the cert
f280: 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b ificate public k
f290: 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 ey",.... (ch
f2a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
f2b0: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
f2c0: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
f2d0: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a NULL;..}. }.
f2e0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69 . /* Set veri
f2f0: 66 69 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a fication CAs */.
f300: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
f310: 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63 nit(&ds);. Tc
f320: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 l_DStringInit(&d
f330: 73 31 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 72 s1);. /* Ther
f340: 65 20 69 73 20 6f 6e 65 20 64 65 66 61 75 6c 74 e is one default
f350: 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 6e 65 20 directory, one
f360: 64 65 66 61 75 6c 74 20 66 69 6c 65 2c 20 61 6e default file, an
f370: 64 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 73 74 d one default st
f380: 6f 72 65 2e 0a 09 54 68 65 20 64 65 66 61 75 6c ore...The defaul
f390: 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65 t CA certificate
f3a0: 73 20 64 69 72 65 63 74 6f 72 79 20 28 61 6e 64 s directory (and
f3b0: 20 64 65 66 61 75 6c 74 20 73 74 6f 72 65 29 20 default store)
f3c0: 69 73 20 69 6e 20 74 68 65 20 4f 70 65 6e 53 53 is in the OpenSS
f3d0: 4c 0a 09 63 65 72 74 73 20 64 69 72 65 63 74 6f L..certs directo
f3e0: 72 79 2e 20 49 74 20 63 61 6e 20 62 65 20 6f 76 ry. It can be ov
f3f0: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 erridden by the
f400: 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 SSL_CERT_DIR env
f410: 20 76 61 72 2e 20 54 68 65 0a 09 64 65 66 61 75 var. The..defau
f420: 6c 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74 lt CA certificat
f430: 65 73 20 66 69 6c 65 20 69 73 20 63 61 6c 6c 65 es file is calle
f440: 64 20 63 65 72 74 2e 70 65 6d 20 69 6e 20 74 68 d cert.pem in th
f450: 65 20 64 65 66 61 75 6c 74 20 4f 70 65 6e 53 53 e default OpenSS
f460: 4c 0a 09 64 69 72 65 63 74 6f 72 79 2e 20 49 74 L..directory. It
f470: 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 can be overridd
f480: 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 en by the SSL_CE
f490: 52 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e RT_FILE env var.
f4a0: 20 2a 2f 0a 09 2f 2a 20 69 6e 74 20 53 53 4c 5f */../* int SSL_
f4b0: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
f4c0: 76 65 72 69 66 79 5f 64 69 72 28 53 53 4c 5f 43 verify_dir(SSL_C
f4d0: 54 58 20 2a 63 74 78 29 20 61 6e 64 20 69 6e 74 TX *ctx) and int
f4e0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 SSL_CTX_set_def
f4f0: 61 75 6c 74 5f 76 65 72 69 66 79 5f 66 69 6c 65 ault_verify_file
f500: 28 53 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 2a (SSL_CTX *ctx) *
f510: 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 /. if (!SSL_C
f520: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c TX_load_verify_l
f530: 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 ocations(ctx, F2
f540: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 N(CAfile, &ds),
f550: 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29 F2N(CAdir, &ds1)
f560: 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 ) ||..!SSL_CTX_s
f570: 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 et_default_verif
f580: 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a y_paths(ctx)) {.
f590: 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 #if 0..Tcl_DStri
f5a0: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63 ngFree(&ds);..Tc
f5b0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
f5c0: 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 s1);../* Don't c
f5d0: 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66 urrently care if
f5e0: 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 this fails */..
f5f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
f600: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65 (interp, "SSL de
f610: 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 74 fault verify pat
f620: 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c hs: ", REASON(),
f630: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
f640: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
f650: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
f660: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a L;.#endif. }.
f670: 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f . /* https://
f680: 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f sourceforge.net/
f690: 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a p/tls/bugs/57/ *
f6a0: 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 /. /* XXX:TOD
f6b0: 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 O: Let the user
f6c0: 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 supply values he
f6d0: 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f re instead of so
f6e0: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 mething that exi
f6f0: 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 sts on the files
f700: 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 ystem */. if
f710: 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 (CAfile != NULL)
f720: 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 {..STACK_OF(X50
f730: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 9_NAME) *certNam
f740: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c es = SSL_load_cl
f750: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e ient_CA_file(F2N
f760: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a (CAfile, &ds));.
f770: 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 .if (certNames !
f780: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 = NULL) {.. S
f790: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
f7a0: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 t_CA_list(ctx, c
f7b0: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 ertNames);..}.
f7c0: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
f7d0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 ringFree(&ds);.
f7e0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
f7f0: 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 ee(&ds1);. re
f800: 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a turn ctx;.}.../*
f810: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
f820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f850: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 ------. *. * Sta
f860: 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 tusObjCmd -- ret
f870: 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 urn certificate
f880: 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 for connected pe
f890: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
f8a0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
f8b0: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
f8c0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
f8d0: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
f8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f920: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
f930: 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 t.StatusObjCmd(C
f940: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
f950: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
f960: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
f970: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
f980: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
f990: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
f9a0: 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 ;. X509 *peer
f9b0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f ;. Tcl_Obj *o
f9c0: 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 bjPtr;. Tcl_C
f9d0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 hannel chan;.
f9e0: 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 char *channelNa
f9f0: 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 me, *ciphers;.
fa00: 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 int mode;.
fa10: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
fa20: 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 har *proto;.
fa30: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e unsigned int len
fa40: 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 ;. int nid, r
fa50: 65 73 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 es;. (void) c
fa60: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 lientData;..
fa70: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
fa80: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
fa90: 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 < 2 || objc > 3
faa0: 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 || (objc == 3 &
fab0: 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 & !strcmp(Tcl_Ge
fac0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 tString(objv[1])
fad0: 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a , "-local"))) {.
fae0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
faf0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
fb00: 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 v, "?-local? cha
fb10: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 nnel");..return
fb20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
fb30: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 .. /* Get cha
fb40: 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 nnel Id */. c
fb50: 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c hannelName = Tcl
fb60: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
fb70: 6a 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 j(objv[(objc ==
fb80: 32 20 3f 20 31 20 3a 20 32 29 5d 2c 20 28 54 63 2 ? 1 : 2)], (Tc
fb90: 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 3b l_Size *) NULL);
fba0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
fbb0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
fbc0: 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 p, channelName,
fbd0: 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 &mode);. if (
fbe0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
fbf0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
fc00: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
fc10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
fc20: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
fc30: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
fc40: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
fc50: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
fc60: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
fc70: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 ;. if (Tcl_Ge
fc80: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
fc90: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
fca0: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f lType()) {..Tcl_
fcb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
fcc0: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
fcd0: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
fce0: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
fcf0: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c ..."\": not a TL
fd00: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c S channel", NULL
fd10: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
fd20: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
fd30: 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 S", "STATUS", "C
fd40: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
fd50: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
fd60: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
fd70: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
fd80: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
fd90: 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 te *) Tcl_GetCha
fda0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
fdb0: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 (chan);.. /*
fdc0: 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 Get certificate
fdd0: 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 for peer or self
fde0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
fdf0: 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d == 2) {..peer =
fe00: 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 SSL_get_peer_ce
fe10: 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 rtificate(stateP
fe20: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 tr->ssl);. }
fe30: 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 else {..peer = S
fe40: 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 SL_get_certifica
fe50: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
fe60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 );. }. /*
fe70: 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66 69 Get X509 certifi
fe80: 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 cate info */.
fe90: 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 if (peer) {..ob
fea0: 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 jPtr = Tls_NewX5
feb0: 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 09Obj(interp, pe
fec0: 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d er);..if (objc =
fed0: 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 = 2) {.. X509
fee0: 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 _free(peer);..
fef0: 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 peer = NULL;..
ff00: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 }. } else {..
ff10: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
ff20: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
ff30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
ff40: 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 Peer name */.
ff50: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
ff60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 erp, objPtr, "pe
ff70: 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 ername", SSL_get
ff80: 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 0_peername(state
ff90: 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a Ptr->ssl), -1);.
ffa0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 LAPPEND_INT(
ffb0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ffc0: 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 "sbits", SSL_get
ffd0: 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 _cipher_bits(sta
ffe0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c tePtr->ssl, NULL
fff0: 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 ));.. ciphers
10000 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 = (char*)SSL_ge
10010 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 t_cipher(statePt
10020 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 r->ssl);. LAP
10030 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
10040 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 objPtr, "cipher
10050 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b ", ciphers, -1);
10060 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 .. /* Verify
10070 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69 the X509 certifi
10080 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 cate presented b
10090 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 y the peer */.
100a0 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
100b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 terp, objPtr, "v
100c0 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 erifyResult",..X
100d0 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 509_verify_cert_
100e0 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c error_string(SSL
100f0 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 _get_verify_resu
10100 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c lt(statePtr->ssl
10110 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a )), -1);.. /*
10120 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a Verify mode */.
10130 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 mode = SSL_g
10140 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 et_verify_mode(s
10150 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
10160 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53 if (mode && S
10170 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 SL_VERIFY_NONE)
10180 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 {..LAPPEND_STR(i
10190 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
101a0 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f verifyMode", "no
101b0 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 ne", -1);. }
101c0 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 else {..Tcl_Obj
101d0 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 *listObjPtr = Tc
101e0 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
101f0 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 NULL);..if (mode
10200 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 && SSL_VERIFY_P
10210 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f EER) {.. Tcl_
10220 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10230 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
10240 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
10250 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 StringObj("peer"
10260 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
10270 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
10280 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
10290 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 ER_CERT) {..
102a0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
102b0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
102c0 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c listObjPtr, Tcl
102d0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 _NewStringObj("f
102e0 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 ail if no peer c
102f0 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ert", -1));..}..
10300 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f if (mode && SSL_
10310 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e VERIFY_CLIENT_ON
10320 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c CE) {.. Tcl_L
10330 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10340 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
10350 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ObjPtr, Tcl_NewS
10360 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 tringObj("client
10370 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d once", -1));..}
10380 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 ..if (mode && SS
10390 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 L_VERIFY_POST_HA
103a0 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 NDSHAKE) {..
103b0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
103c0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
103d0 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c listObjPtr, Tcl
103e0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 _NewStringObj("p
103f0 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 ost handshake",
10400 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e -1));..}..LAPPEN
10410 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 D_OBJ(interp, ob
10420 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 jPtr, "verifyMod
10430 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a e", listObjPtr).
10440 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 }.. /* Ve
10450 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 rify mode depth
10460 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 */. LAPPEND_I
10470 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
10480 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68 22 r, "verifyDepth"
10490 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 , SSL_get_verify
104a0 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72 2d _depth(statePtr-
104b0 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 >ssl));.. /*
104c0 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 Report the selec
104d0 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 ted protocol as
104e0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 a result of the
104f0 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 negotiation */.
10500 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e SSL_get0_alpn
10510 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 _selected(stateP
10520 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c tr->ssl, &proto,
10530 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 &len);. LAPP
10540 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10550 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 objPtr, "alpn",
10560 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 (char *)proto, (
10570 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a Tcl_Size) len);.
10580 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
10590 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
105a0 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f "protocol", SSL_
105b0 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 get_version(stat
105c0 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b ePtr->ssl), -1);
105d0 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 .. /* Valid f
105e0 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 or non-RSA signa
105f0 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 ture and TLS 1.3
10600 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
10610 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 == 2) {..res =
10620 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 SSL_get_peer_sig
10630 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 nature_nid(state
10640 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b Ptr->ssl, &nid);
10650 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 . } else {..r
10660 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 es = SSL_get_sig
10670 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 nature_nid(state
10680 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b Ptr->ssl, &nid);
10690 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 . }. if (!
106a0 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a res) {nid = 0;}.
106b0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
106c0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
106d0 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c "signatureHashAl
106e0 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 gorithm", OBJ_ni
106f0 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a d2ln(nid), -1);.
10700 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d . if (objc ==
10710 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 2) {..res = SSL
10720 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 _get_peer_signat
10730 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 ure_type_nid(sta
10740 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
10750 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
10760 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 .res = SSL_get_s
10770 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 ignature_type_ni
10780 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c d(statePtr->ssl,
10790 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 &nid);. }.
107a0 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 if (!res) {nid
107b0 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 = 0;}. LAPPE
107c0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
107d0 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 bjPtr, "signatur
107e0 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 eType", OBJ_nid2
107f0 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 ln(nid), -1);..
10800 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
10810 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
10820 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
10830 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 TCL_OK;.}.../*.
10840 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
10850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10880 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 ----. *. * Conne
10890 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 ctionInfoObjCmd
108a0 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 -- return connec
108b0 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f tion info from O
108c0 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 penSSL.. *. * Re
108d0 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 sults:. *.A list
108e0 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 of connection i
108f0 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nfo. *. *------
10900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
10940 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f /..static int Co
10950 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 nnectionInfoObjC
10960 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
10970 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
10980 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
10990 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
109a0 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
109b0 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
109c0 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 chan;../* The c
109d0 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 hannel to set a
109e0 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 mode on */. S
109f0 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 tate *statePtr;.
10a00 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 ./* client state
10a10 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 for ssl socket
10a20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a */. Tcl_Obj *
10a30 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 objPtr, *listPtr
10a40 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 ;. const SSL
10a50 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 *ssl;. const
10a60 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 SSL_CIPHER *ciph
10a70 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 er;. const SS
10a80 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 L_SESSION *sessi
10a90 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 on;. const EV
10aa0 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28 76 P_MD *md;. (v
10ab0 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b oid) clientData;
10ac0 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
10ad0 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
10ae0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
10af0 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
10b00 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 el");..return(TC
10b10 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a L_ERROR);. }.
10b20 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
10b30 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
10b40 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
10b50 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
10b60 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 4c (Tcl_Size *)NUL
10b70 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 L), NULL);. i
10b80 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
10b90 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
10ba0 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
10bb0 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
10bc0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
10bd0 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
10be0 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
10bf0 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
10c00 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
10c10 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 han);. if (Tc
10c20 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
10c30 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
10c40 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
10c50 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
10c60 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
10c70 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
10c80 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
10c90 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e an),.. "\": n
10ca0 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
10cb0 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 ", NULL);..Tcl_S
10cc0 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
10cd0 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e rp, "TLS", "CONN
10ce0 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 ECTION", "CHANNE
10cf0 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 L", "INVALID", (
10d00 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
10d10 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
10d20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 );. }.. ob
10d30 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
10d40 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
10d50 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 . /* Connecti
10d60 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 on info */. s
10d70 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
10d80 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
10d90 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
10da0 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 an);. ssl = s
10db0 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 tatePtr->ssl;.
10dc0 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c if (ssl != NUL
10dd0 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 L) {../* connect
10de0 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 ion state */..LA
10df0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
10e00 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65 , objPtr, "state
10e10 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 ", SSL_state_str
10e20 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d ing_long(ssl), -
10e30 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 1);.../* Get SNI
10e40 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65 requested serve
10e50 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 r name */..LAPPE
10e60 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
10e70 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61 bjPtr, "serverna
10e80 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 me", SSL_get_ser
10e90 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 vername(ssl, TLS
10ea0 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 EXT_NAMETYPE_hos
10eb0 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 t_name), -1);...
10ec0 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 /* Get protocol
10ed0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
10ee0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10ef0 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f "protocol", SSL_
10f00 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 get_version(ssl)
10f10 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 , -1);.../* Rene
10f20 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 gotiation allowe
10f30 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f d */..LAPPEND_BO
10f40 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
10f50 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f r, "renegotiatio
10f60 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f n_allowed", SSL_
10f70 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 get_secure_reneg
10f80 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 otiation_support
10f90 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 (ssl));.../* Get
10fa0 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 security level
10fb0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 */..LAPPEND_INT(
10fc0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10fd0 22 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 "security_level"
10fe0 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 , SSL_get_securi
10ff0 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a ty_level(ssl));.
11000 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 ../* Session inf
11010 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f o */..LAPPEND_BO
11020 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
11030 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 r, "session_reus
11040 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e ed", SSL_session
11050 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a _reused(ssl));..
11060 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69 6e ./* Is server in
11070 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 fo */..LAPPEND_B
11080 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
11090 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 22 2c tr, "is_server",
110a0 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 SSL_is_server(s
110b0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 sl));.../* Is DT
110c0 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 LS */..LAPPEND_B
110d0 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
110e0 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 tr, "is_dtls", S
110f0 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 SL_is_dtls(ssl))
11100 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
11110 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 Cipher info */.
11120 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f cipher = SSL_
11130 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 get_current_ciph
11140 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 er(ssl);. if
11150 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 (cipher != NULL)
11160 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 {..char buf[BUF
11170 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 SIZ] = {0};..int
11180 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b bits, alg_bits;
11190 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d .../* Cipher nam
111a0 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 e */..LAPPEND_ST
111b0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
111c0 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 4c 5f , "cipher", SSL_
111d0 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 CIPHER_get_name(
111e0 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 cipher), -1);...
111f0 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 /* RFC name of c
11200 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e ipher */..LAPPEN
11210 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11220 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 64 5f jPtr, "standard_
11230 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 name", SSL_CIPHE
11240 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 R_standard_name(
11250 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 cipher), -1);...
11260 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 /* OpenSSL name
11270 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 of cipher */..LA
11280 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11290 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 , objPtr, "opens
112a0 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 sl_name", OPENSS
112b0 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 L_cipher_name(SS
112c0 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 L_CIPHER_standar
112d0 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 29 2c d_name(cipher)),
112e0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 -1);.../* numbe
112f0 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 74 73 r of secret bits
11300 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 65 72 used for cipher
11310 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f */..bits = SSL_
11320 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28 CIPHER_get_bits(
11330 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 cipher, &alg_bit
11340 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 s);..LAPPEND_INT
11350 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11360 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c 20 "secret_bits",
11370 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f bits);..LAPPEND_
11380 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
11390 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 tr, "algorithm_b
113a0 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b its", alg_bits);
113b0 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 ../* alg_bits is
113c0 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 72 actual key secr
113d0 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 20 et bits. If use
113e0 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 20 bits and secret
113f0 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 73 (algorithm) bits
11400 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68 65 differ,.. the
11410 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 74 rest of the bit
11420 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e 65 s are fixed, i.e
11430 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 . for limited ex
11440 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 69 port ciphers (bi
11450 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a ts < 56) */.../*
11460 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 63 68 Indicates which
11470 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f SSL/TLS protoco
11480 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 74 20 l version first
11490 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 70 68 defined the ciph
114a0 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 er */..LAPPEND_S
114b0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
114c0 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 r, "min_version"
114d0 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 , SSL_CIPHER_get
114e0 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29 _version(cipher)
114f0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 , -1);.../* Ciph
11500 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 er NID */..LAPPE
11510 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11520 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e 49 bjPtr, "cipherNI
11530 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f D", (char *)OBJ_
11540 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 nid2ln(SSL_CIPHE
11550 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 R_get_cipher_nid
11560 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
11570 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
11580 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 erp, objPtr, "di
11590 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72 20 gestNID", (char
115a0 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c *)OBJ_nid2ln(SSL
115b0 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67 65 _CIPHER_get_dige
115c0 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c st_nid(cipher)),
115d0 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 -1);..LAPPEND_S
115e0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
115f0 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65 4e r, "keyExchangeN
11600 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a ID", (char *)OBJ
11610 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 _nid2ln(SSL_CIPH
11620 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 ER_get_kx_nid(ci
11630 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 pher)), -1);..LA
11640 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11650 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 65 , objPtr, "authe
11660 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 nticationNID", (
11670 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c char *)OBJ_nid2l
11680 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 n(SSL_CIPHER_get
11690 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65 72 _auth_nid(cipher
116a0 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 )), -1);.../* me
116b0 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 61 ssage authentica
116c0 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 tion code - Ciph
116d0 65 72 20 69 73 20 41 45 41 44 20 28 65 2e 67 2e er is AEAD (e.g.
116e0 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32 30 GCM or ChaCha20
116f0 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f /Poly1305) or no
11700 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 t */../* Authent
11710 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 69 6f icated Encryptio
11720 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 74 65 n with associate
11730 64 20 64 61 74 61 20 28 41 45 41 44 29 20 63 68 d data (AEAD) ch
11740 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f eck */..LAPPEND_
11750 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
11760 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73 5f Ptr, "cipher_is_
11770 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 aead", SSL_CIPHE
11780 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65 72 R_is_aead(cipher
11790 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 ));.../* Digest
117a0 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 used during the
117b0 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b SSL/TLS handshak
117c0 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 e when using the
117d0 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 cipher. */..md
117e0 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 = SSL_CIPHER_get
117f0 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 _handshake_diges
11800 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 t(cipher);..LAPP
11810 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11820 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 68 61 objPtr, "handsha
11830 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63 68 61 ke_digest", (cha
11840 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 r *)EVP_MD_name(
11850 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 md), -1);.../* G
11860 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 et OpenSSL-speci
11870 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 fic ID, not IANA
11880 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ID */..LAPPEND_
11890 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
118a0 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 22 2c tr, "cipher_id",
118b0 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 (int) SSL_CIPHE
118c0 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 R_get_id(cipher)
118d0 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 );.../* Two-byte
118e0 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 65 20 ID used in the
118f0 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 TLS protocol of
11900 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 65 72 the given cipher
11910 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 */..LAPPEND_INT
11920 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11930 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 "protocol_id",
11940 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 (int) SSL_CIPHER
11950 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 _get_protocol_id
11960 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 (cipher));.../*
11970 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 Textual descript
11980 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 ion of the ciphe
11990 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 r */..if (SSL_CI
119a0 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e PHER_description
119b0 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 (cipher, buf, si
119c0 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 zeof(buf)) != NU
119d0 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 LL) {.. LAPPE
119e0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
119f0 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 70 74 bjPtr, "descript
11a00 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a ion", buf, -1);.
11a10 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
11a20 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f Session info */
11a30 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 . session = S
11a40 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 SL_get_session(s
11a50 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65 73 sl);. if (ses
11a60 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a sion != NULL) {.
11a70 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 .const unsigned
11a80 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 char *ticket;..s
11a90 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 ize_t len2;..uns
11aa0 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a igned int ulen;.
11ab0 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 .const unsigned
11ac0 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 char *session_id
11ad0 2c 20 2a 70 72 6f 74 6f 3b 0a 09 63 68 61 72 20 , *proto;..char
11ae0 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d buffer[SSL_MAX_M
11af0 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 ASTER_KEY_LENGTH
11b00 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 ];.../* Report t
11b10 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 he selected prot
11b20 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 ocol as a result
11b30 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 of the ALPN neg
11b40 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c otiation */..SSL
11b50 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c _SESSION_get0_al
11b60 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 pn_selected(sess
11b70 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 ion, &proto, &le
11b80 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 n2);..LAPPEND_ST
11b90 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11ba0 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 , "alpn", (char
11bb0 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 *) proto, (Tcl_S
11bc0 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a ize) len2);.../*
11bd0 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 Report the sele
11be0 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 cted protocol as
11bf0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 a result of the
11c00 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e NPN negotiation
11c10 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e */.#ifdef USE_N
11c20 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 PN..SSL_get0_nex
11c30 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 t_proto_negotiat
11c40 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 ed(ssl, &proto,
11c50 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 &ulen);..LAPPEND
11c60 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11c70 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 Ptr, "npn", (cha
11c80 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c r *) proto, (Tcl
11c90 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65 _Size) ulen);.#e
11ca0 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 ndif.../* Resuma
11cb0 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 ble session */..
11cc0 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
11cd0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 erp, objPtr, "re
11ce0 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 sumable", SSL_SE
11cf0 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 SSION_is_resumab
11d00 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 le(session));...
11d10 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 /* Session start
11d20 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 time (seconds s
11d30 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 ince epoch) */..
11d40 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 LAPPEND_LONG(int
11d50 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 erp, objPtr, "st
11d60 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 art_time", SSL_S
11d70 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 ESSION_get_time(
11d80 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 session));.../*
11d90 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 Timeout value -
11da0 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 SSL_CTX_get_time
11db0 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 out (in seconds)
11dc0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e */..LAPPEND_LON
11dd0 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 G(interp, objPtr
11de0 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c , "timeout", SSL
11df0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d _SESSION_get_tim
11e00 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a eout(session));.
11e10 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 ../* Session id
11e20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 - TLSv1.2 and be
11e30 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 low only */..ses
11e40 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 sion_id = SSL_SE
11e50 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 SSION_get_id(ses
11e60 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c sion, &ulen);..L
11e70 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e APPEND_BARRAY(in
11e80 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
11e90 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 ession_id", sess
11ea0 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a ion_id, (Tcl_Siz
11eb0 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 e) ulen);.../* S
11ec0 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a ession context *
11ed0 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 /..session_id =
11ee0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
11ef0 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 _id_context(sess
11f00 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 ion, &ulen);..LA
11f10 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 PPEND_BARRAY(int
11f20 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
11f30 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 ssion_context",
11f40 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c session_id, (Tcl
11f50 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 _Size) ulen);...
11f60 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 /* Session ticke
11f70 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 t - client only
11f80 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f */..SSL_SESSION_
11f90 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 get0_ticket(sess
11fa0 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
11fb0 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 en2);..LAPPEND_B
11fc0 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 ARRAY(interp, ob
11fd0 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 jPtr, "session_t
11fe0 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 icket", ticket,
11ff0 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
12000 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 ;.../* Session t
12010 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 icket lifetime h
12020 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 int (in seconds)
12030 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e */..LAPPEND_LON
12040 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 G(interp, objPtr
12050 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 , "lifetime", SS
12060 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
12070 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 cket_lifetime_hi
12080 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 nt(session));...
12090 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 /* Ticket app da
120a0 74 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 ta */..SSL_SESSI
120b0 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 ON_get0_ticket_a
120c0 70 70 64 61 74 61 28 73 65 73 73 69 6f 6e 2c 20 ppdata(session,
120d0 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b &ticket, &len2);
120e0 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
120f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12100 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 "ticket_app_dat
12110 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c a", ticket, (Tcl
12120 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 _Size) len2);...
12130 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 /* Get master ke
12140 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c y */..len2 = SSL
12150 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 _SESSION_get_mas
12160 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c ter_key(session,
12170 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 buffer, SSL_MAX
12180 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 _MASTER_KEY_LENG
12190 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 TH);..LAPPEND_BA
121a0 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a RRAY(interp, obj
121b0 50 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 Ptr, "master_key
121c0 22 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c 5f ", buffer, (Tcl_
121d0 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f Size) len2);.../
121e0 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 * Compression id
121f0 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e */..unsigned in
12200 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 t id = SSL_SESSI
12210 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f ON_get_compress_
12220 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 id(session);..LA
12230 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12240 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 , objPtr, "compr
12250 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d ession_id", id =
12260 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 = 1 ? "zlib" : "
12270 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 none", -1);.
12280 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 }.. /* Compre
12290 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ssion info */.
122a0 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c if (ssl != NUL
122b0 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 L) {.#ifdef HAVE
122c0 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e _SSL_COMPRESSION
122d0 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 ..const COMP_MET
122e0 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e HOD *comp, *expn
122f0 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 ;..comp = SSL_ge
12300 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 t_current_compre
12310 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 ssion(ssl);..exp
12320 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 n = SSL_get_curr
12330 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 ent_expansion(ss
12340 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 l);...LAPPEND_ST
12350 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
12360 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c , "compression",
12370 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 comp ? SSL_COMP
12380 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 _get_name(comp)
12390 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 : "none", -1);..
123a0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
123b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 rp, objPtr, "exp
123c0 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 ansion", expn ?
123d0 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d SSL_COMP_get_nam
123e0 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 e(expn) : "none"
123f0 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 , -1);.#else..LA
12400 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12410 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 , objPtr, "compr
12420 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c ession", "none",
12430 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 -1);..LAPPEND_S
12440 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12450 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 r, "expansion",
12460 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e "none", -1);.#en
12470 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f dif. }.. /
12480 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f * Server info */
12490 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 . {..long mod
124a0 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f e = SSL_CTX_get_
124b0 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f session_cache_mo
124c0 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 de(statePtr->ctx
124d0 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a );..char *msg;..
124e0 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f .if (mode & SSL_
124f0 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 SESS_CACHE_OFF)
12500 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 {.. msg = "of
12510 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 f";..} else if (
12520 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
12530 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a CACHE_CLIENT) {.
12540 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 . msg = "clie
12550 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 nt";..} else if
12560 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 (mode & SSL_SESS
12570 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b _CACHE_SERVER) {
12580 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 .. msg = "ser
12590 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 ver";..} else if
125a0 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
125b0 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a S_CACHE_BOTH) {.
125c0 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 . msg = "both
125d0 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 ";..} else {..
125e0 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e msg = "unknown
125f0 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 ";..}..LAPPEND_S
12600 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12610 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 r, "session_cach
12620 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 e_mode", msg, -1
12630 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
12640 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 CA List */.
12650 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 /* IF not a serv
12660 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f er, same as SSL_
12670 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 get0_peer_CA_lis
12680 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 6d t. If server sam
12690 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 e as SSL_CTX_get
126a0 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 _client_CA_list
126b0 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d */. listPtr =
126c0 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
126d0 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 0, NULL);. ST
126e0 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 ACK_OF(X509_NAME
126f0 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 ) *ca_list;.
12700 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 if ((ca_list = S
12710 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 SL_get_client_CA
12720 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e _list(ssl)) != N
12730 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 ULL) {..char buf
12740 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f fer[BUFSIZ];..fo
12750 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 r (int i = 0; i
12760 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e < sk_X509_NAME_n
12770 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b um(ca_list); i++
12780 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 ) {.. X509_NA
12790 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 ME *name = sk_X5
127a0 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 09_NAME_value(ca
127b0 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 _list, i);..
127c0 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 if (name) {...X5
127d0 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 09_NAME_oneline(
127e0 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 name, buffer, BU
127f0 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 FSIZ);...Tcl_Lis
12800 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
12810 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 t(interp, listPt
12820 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
12830 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 Obj(buffer, -1))
12840 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 ;.. }..}.
12850 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 }. LAPPEND_OB
12860 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 J(interp, objPtr
12870 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 , "caList", list
12880 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e Ptr);. LAPPEN
12890 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
128a0 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 jPtr, "caListCou
128b0 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d nt", sk_X509_NAM
128c0 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b E_num(ca_list));
128d0 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
128e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
128f0 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
12900 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
12910 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
12920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12950 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 -------. *. * Ve
12960 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 rsionObjCmd -- r
12970 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 eturn version st
12980 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 ring from OpenSS
12990 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 L.. *. * Results
129a0 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
129b0 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
129c0 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
129d0 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
129e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a20 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
12a30 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 .VersionObjCmd(C
12a40 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
12a50 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
12a60 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
12a70 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
12a80 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
12a90 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
12aa0 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 ;. (void) cli
12ab0 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 28 76 6f entData;. (vo
12ac0 69 64 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28 76 id) objc;. (v
12ad0 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20 20 oid) objv;..
12ae0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
12af0 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d );.. objPtr =
12b00 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
12b10 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f j(OPENSSL_VERSIO
12b20 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 N_TEXT, -1);.
12b30 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
12b40 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
12b50 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
12b60 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
12b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12bb0 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 ---. *. * MiscOb
12bc0 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d jCmd -- misc com
12bd0 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 mands. *. * Resu
12be0 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
12bf0 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
12c00 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
12c10 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
12c20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
12c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c60 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
12c70 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 int.MiscObjCmd(C
12c80 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
12c90 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
12ca0 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
12cb0 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
12cc0 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
12cd0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 static const ch
12ce0 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 ar *commands []
12cf0 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 = { "req", "strr
12d00 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 eq", NULL };.
12d10 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 enum command {
12d20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c C_REQ, C_STRREQ,
12d30 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 C_DUMMY };.
12d40 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 Tcl_Size cmd;.
12d50 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 int isStr;.
12d60 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 char buffer[163
12d70 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 84];. (void)
12d80 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
12d90 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
12da0 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
12db0 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 c < 2) {..Tcl_Wr
12dc0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
12dd0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 p, 1, objv, "sub
12de0 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 command ?args?")
12df0 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
12e00 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
12e10 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 f (Tcl_GetIndexF
12e20 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
12e30 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 bjv[1], commands
12e40 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 , "command", 0,
12e50 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 &cmd) != TCL_OK)
12e60 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
12e70 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
12e80 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 ERR_clear_error
12e90 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d ();.. isStr =
12ea0 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 (cmd == C_STRRE
12eb0 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 Q);. switch (
12ec0 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 (enum command) c
12ed0 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 md) {..case C_RE
12ee0 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 Q:..case C_STRRE
12ef0 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b Q: {.. EVP_PK
12f00 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 EY *pkey=NULL;..
12f10 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e X509 *cert=N
12f20 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e ULL;.. X509_N
12f30 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a AME *name=NULL;.
12f40 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c . Tcl_Obj **l
12f50 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53 istv;.. Tcl_S
12f60 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 20 20 ize listc;..
12f70 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 49 4f int i;... BIO
12f80 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 *out=NULL;...
12f90 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a char *k_C="",*
12fa0 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c k_ST="",*k_L="",
12fb0 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 *k_O="",*k_OU=""
12fc0 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 ,*k_CN="",*k_Ema
12fd0 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 il="";.. char
12fe0 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 *keyout,*pemout
12ff0 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 ,*str;.. int
13000 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 keysize,serial=0
13010 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 ,days=365;..#if
13020 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
13030 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
13040 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 000L.. BIGNUM
13050 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 *bne = NULL;..
13060 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 RSA *rsa = NU
13070 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 LL;.#else.. E
13080 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 VP_PKEY_CTX *ctx
13090 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a = NULL;.#endif.
130a0 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c .. if ((objc<
130b0 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 5) || (objc>6))
130c0 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {...Tcl_WrongNum
130d0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 Args(interp, 2,
130e0 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b objv, "keysize k
130f0 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 eyfile certfile
13100 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 ?info?");...retu
13110 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
13120 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 }... if (T
13130 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
13140 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d (interp, objv[2]
13150 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 , &keysize) != T
13160 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 CL_OK) {...retur
13170 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
13180 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d }.. keyout=
13190 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
131a0 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d jv[3]);.. pem
131b0 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e out=Tcl_GetStrin
131c0 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 g(objv[4]);..
131d0 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 if (isStr) {...
131e0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 Tcl_SetVar(inter
131f0 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a p,keyout,"",0);.
13200 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 ..Tcl_SetVar(int
13210 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 erp,pemout,"",0)
13220 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 ;.. }... i
13230 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 f (objc>=6) {...
13240 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 if (Tcl_ListObjG
13250 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 etElements(inter
13260 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 p, objv[5], &lis
13270 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 tc, &listv) != T
13280 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 CL_OK) {... r
13290 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
132a0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 ...}....if ((lis
132b0 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 tc%2) != 0) {...
132c0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
132d0 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d t(interp,"Inform
132e0 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 ation list must
132f0 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 have even number
13300 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e of arguments",N
13310 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 ULL);... retu
13320 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
13330 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c }...for (i=0; i<
13340 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 listc; i+=2) {..
13350 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 . str=Tcl_Get
13360 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 String(listv[i])
13370 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63 ;... if (strc
13380 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d mp(str,"days")==
13390 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 0) {....if (Tcl_
133a0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e GetIntFromObj(in
133b0 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c terp,listv[i+1],
133c0 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a &days)!=TCL_OK).
133d0 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
133e0 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d L_ERROR;... }
133f0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
13400 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d (str,"serial")==
13410 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 0) {....if (Tcl_
13420 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e GetIntFromObj(in
13430 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c terp,listv[i+1],
13440 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b &serial)!=TCL_OK
13450 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 ).... return
13460 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
13470 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
13480 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 mp(str,"C")==0)
13490 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 {....k_C=Tcl_Get
134a0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
134b0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
134c0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
134d0 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b "ST")==0) {....k
134e0 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e _ST=Tcl_GetStrin
134f0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
13500 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
13510 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d strcmp(str,"L")=
13520 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c =0) {....k_L=Tcl
13530 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
13540 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
13550 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
13560 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 str,"O")==0) {..
13570 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 ..k_O=Tcl_GetStr
13580 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
13590 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
135a0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 (strcmp(str,"OU
135b0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 ")==0) {....k_OU
135c0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
135d0 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
135e0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
135f0 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 cmp(str,"CN")==0
13600 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f ) {....k_CN=Tcl_
13610 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
13620 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
13630 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
13640 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 tr,"Email")==0)
13650 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c {....k_Email=Tcl
13660 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
13670 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
13680 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 else {....Tcl_Se
13690 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
136a0 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 Unknown paramete
136b0 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 r",NULL);....ret
136c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
136d0 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 . }...}..
136e0 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 }..#if OPENSSL_V
136f0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
13700 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 0x30000000L..
13710 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b bne = BN_new();
13720 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f .. rsa = RSA_
13730 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 new();.. pkey
13740 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 = EVP_PKEY_new(
13750 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 );.. if (bne
13760 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d == NULL || rsa =
13770 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d = NULL || pkey =
13780 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 = NULL || !BN_se
13790 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 t_word(bne,RSA_F
137a0 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 4) ||...!RSA_gen
137b0 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 erate_key_ex(rsa
137c0 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 , keysize, bne,
137d0 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b NULL) || !EVP_PK
137e0 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b EY_assign_RSA(pk
137f0 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 ey, rsa)) {...EV
13800 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 P_PKEY_free(pkey
13810 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 );.../* RSA_free
13820 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 (rsa); freed by
13830 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f EVP_PKEY_free */
13840 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b ...BN_free(bne);
13850 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 .#else.. pkey
13860 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 = EVP_RSA_gen((
13870 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 unsigned int) ke
13880 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 ysize);.. ctx
13890 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f = EVP_PKEY_CTX_
138a0 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a new(pkey,NULL);.
138b0 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d . if (pkey ==
138c0 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 NULL || ctx ==
138d0 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 NULL || !EVP_PKE
138e0 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 Y_keygen_init(ct
138f0 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 x) ||...!EVP_PKE
13900 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 Y_CTX_set_rsa_ke
13910 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b ygen_bits(ctx, k
13920 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f eysize) || !EVP_
13930 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c PKEY_keygen(ctx,
13940 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 &pkey)) {...EVP
13950 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
13960 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 ;...EVP_PKEY_CTX
13970 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 _free(ctx);.#end
13980 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 if...Tcl_SetResu
13990 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 lt(interp,"Error
139a0 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 generating priv
139b0 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a ate key",NULL);.
139c0 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
139d0 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 OR;.. } else
139e0 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b {...if (isStr) {
139f0 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e ... out=BIO_n
13a00 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b ew(BIO_s_mem());
13a10 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 ... PEM_write
13a20 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 _bio_PrivateKey(
13a30 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 out,pkey,NULL,NU
13a40 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b LL,0,NULL,NULL);
13a50 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 ... i=BIO_rea
13a60 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a d(out,buffer,siz
13a70 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a eof(buffer)-1);.
13a80 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 .. i=(i<0) ?
13a90 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 0 : i;... buf
13aa0 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 fer[i]='\0';...
13ab0 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e Tcl_SetVar(in
13ac0 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 terp,keyout,buff
13ad0 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f er,0);... BIO
13ae0 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 _flush(out);...
13af0 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 BIO_free(out)
13b00 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 ;...} else {...
13b10 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
13b20 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 IO_s_file());...
13b30 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 BIO_write_fi
13b40 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 lename(out,keyou
13b50 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 t);... PEM_wr
13b60 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b ite_bio_PrivateK
13b70 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c ey(out,pkey,NULL
13b80 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c ,NULL,0,NULL,NUL
13b90 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d L);... /* PEM
13ba0 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 _write_bio_RSAPr
13bb0 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 ivateKey(out, rs
13bc0 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 a, NULL, NULL, 0
13bd0 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a , NULL, NULL); *
13be0 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 /... BIO_free
13bf0 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a _all(out);.. .}.
13c00 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 ...if ((cert=X50
13c10 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 9_new())==NULL)
13c20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 {... Tcl_SetR
13c30 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 esult(interp,"Er
13c40 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 ror generating c
13c50 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65 ertificate reque
13c60 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 st",NULL);...
13c70 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 EVP_PKEY_free(p
13c80 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 key);.#if OPENSS
13c90 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
13ca0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
13cb0 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 . BN_free(bne
13cc0 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 );.#endif...
13cd0 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
13ce0 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 );...}....X509_s
13cf0 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c et_version(cert,
13d00 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 2);...ASN1_INTEG
13d10 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f ER_set(X509_get_
13d20 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 serialNumber(cer
13d30 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 t),serial);...X5
13d40 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 09_gmtime_adj(X5
13d50 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 09_getm_notBefor
13d60 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 e(cert),0);...X5
13d70 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 09_gmtime_adj(X5
13d80 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 09_getm_notAfter
13d90 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a (cert),(long)60*
13da0 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 60*24*days);...X
13db0 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 509_set_pubkey(c
13dc0 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 ert,pkey);....na
13dd0 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a me=X509_get_subj
13de0 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a ect_name(cert);.
13df0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
13e00 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
13e10 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 me,"C", MBSTRING
13e20 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
13e30 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
13e40 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 C, -1, -1, 0);..
13e50 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
13e60 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
13e70 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f ,"ST", MBSTRING_
13e80 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
13e90 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 gned char *) k_S
13ea0 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 T, -1, -1, 0);..
13eb0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
13ec0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
13ed0 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 ,"L", MBSTRING_A
13ee0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
13ef0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c ned char *) k_L,
13f00 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
13f10 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
13f20 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
13f30 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 O", MBSTRING_ASC
13f40 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
13f50 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d d char *) k_O, -
13f60 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
13f70 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
13f80 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 _by_txt(name,"OU
13f90 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
13fa0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
13fb0 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d char *) k_OU, -
13fc0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
13fd0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
13fe0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e _by_txt(name,"CN
13ff0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
14000 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
14010 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d char *) k_CN, -
14020 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
14030 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
14040 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d _by_txt(name,"Em
14050 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 ail", MBSTRING_A
14060 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
14070 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d ned char *) k_Em
14080 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b ail, -1, -1, 0);
14090 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 ....X509_set_sub
140a0 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e ject_name(cert,n
140b0 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 ame);....if (!X5
140c0 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 09_sign(cert,pke
140d0 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 y,EVP_sha256()))
140e0 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 {... X509_fr
140f0 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ee(cert);...
14100 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
14110 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c ey);.#if OPENSSL
14120 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
14130 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 < 0x30000000L...
14140 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 BN_free(bne)
14150 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 ;.#endif... T
14160 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
14170 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 erp,"Error signi
14180 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c ng certificate",
14190 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 NULL);... ret
141a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
141b0 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 .}....if (isStr)
141c0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
141d0 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 _new(BIO_s_mem()
141e0 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 );... PEM_wri
141f0 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c te_bio_X509(out,
14200 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 cert);... i=B
14210 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 IO_read(out,buff
14220 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 er,sizeof(buffer
14230 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 )-1);... i=(i
14240 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 <0) ? 0 : i;...
14250 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 buffer[i]='\0
14260 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 ';... Tcl_Set
14270 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 Var(interp,pemou
14280 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 t,buffer,0);...
14290 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 BIO_flush(out
142a0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
142b0 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 e(out);...} else
142c0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
142d0 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 _new(BIO_s_file(
142e0 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 ));... BIO_wr
142f0 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 ite_filename(out
14300 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 ,pemout);...
14310 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 PEM_write_bio_X5
14320 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 09(out,cert);...
14330 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c BIO_free_all
14340 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 (out);...}....X5
14350 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09_free(cert);..
14360 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 .EVP_PKEY_free(p
14370 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 key);.#if OPENSS
14380 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
14390 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
143a0 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 .BN_free(bne);.#
143b0 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a endif.. }..}.
143c0 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 .break;. defa
143d0 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 ult:..break;.
143e0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }. return TC
143f0 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a L_OK;.}.../*****
14400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
14410 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 ./* Init
14420 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
14430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
14440 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
14450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14480 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
14490 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a ls_Free --. *. *
144a0 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
144b0 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 cleans up when a
144c0 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
144d0 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 d channel. *.is
144e0 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 closed and its r
144f0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 eference count f
14500 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a alls below 1. *.
14510 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e * Results:. *.n
14520 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
14530 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 ffects:. *.Frees
14540 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 all the state.
14550 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
14560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14590 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
145a0 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a .Tls_Free(char *
145b0 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 blockPtr) {.
145c0 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
145d0 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b = (State *)block
145e0 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 Ptr;.. dprint
145f0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
14600 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 Tls_Clean(stat
14610 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 ePtr);. ckfre
14620 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c e(blockPtr);.}..
14630 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
14640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14670 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
14680 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a Tls_Clean --. *.
14690 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
146a0 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e e cleans up when
146b0 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
146c0 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 sed channel. *.i
146d0 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 s closed and its
146e0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
146f0 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 falls below 1.
14700 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 This should. *.
14710 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 be called synchr
14720 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 onously by the C
14730 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e loseProc, not in
14740 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c the. *.Eventual
14750 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e lyFree callback.
14760 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
14770 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.none. *. * Si
14780 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 de effects:. *.F
14790 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 rees all the sta
147a0 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d te. *. *--------
147b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
147c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
147d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
147e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
147f0 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 void Tls_Clean(S
14800 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 tate *statePtr)
14810 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 {. dprintf("C
14820 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
14830 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 . * we're as
14840 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 suming here that
14850 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 we're single-th
14860 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 readed. */.
14870 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
14880 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 >timer != (Tcl_T
14890 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 imerToken) NULL)
148a0 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 {..Tcl_DeleteTi
148b0 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 merHandler(state
148c0 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 Ptr->timer);..st
148d0 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 atePtr->timer =
148e0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
148f0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
14900 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 rotos) {..ckfree
14910 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
14920 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 s);..statePtr->p
14930 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 rotos = NULL;.
14940 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
14950 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a ePtr->bio) {../*
14960 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 This will call
14970 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 SSL_shutdown. Bu
14980 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 g 1414045 */..dp
14990 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f rintf("BIO_free_
149a0 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 all(%p)", stateP
149b0 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 tr->bio);..BIO_f
149c0 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 ree_all(statePtr
149d0 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 ->bio);..statePt
149e0 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 r->bio = NULL;.
149f0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
14a00 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 tePtr->ssl) {..d
14a10 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 printf("SSL_free
14a20 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d (%p)", statePtr-
14a30 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 >ssl);..SSL_free
14a40 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
14a50 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 ..statePtr->ssl
14a60 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
14a70 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
14a80 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f ctx) {..SSL_CTX_
14a90 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 free(statePtr->c
14aa0 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e tx);..statePtr->
14ab0 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
14ac0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
14ad0 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a tr->callback) {.
14ae0 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
14af0 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c t(statePtr->call
14b00 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 back);..statePtr
14b10 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c ->callback = NUL
14b20 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
14b30 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
14b40 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 ord) {..Tcl_Decr
14b50 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
14b60 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 r->password);..s
14b70 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
14b80 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a d = NULL;. }.
14b90 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
14ba0 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 ->vcmd) {..Tcl_D
14bb0 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ecrRefCount(stat
14bc0 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 ePtr->vcmd);..st
14bd0 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e atePtr->vcmd = N
14be0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
14bf0 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
14c00 6e 67 22 29 3b 0a 7d 0a 0c 0a 23 69 66 20 54 43 ng");.}...#if TC
14c10 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
14c20 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f > 8.#define MIN_
14c30 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65 VERSION "9.0".#e
14c40 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f lse.#define MIN_
14c50 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65 VERSION "8.5".#e
14c60 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ndif../*. *-----
14c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
14cb0 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d *. * Tls_Init --
14cc0 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 . *. *.This is a
14cd0 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c package initial
14ce0 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 ization procedur
14cf0 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c e, which is call
14d00 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 ed. *.by Tcl whe
14d10 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 n this package i
14d20 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f s to be added to
14d30 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e an interpreter.
14d40 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 . *. * Results:
14d50 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 Ssl configured
14d60 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a and loaded. *. *
14d70 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
14d80 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 *. create the ss
14d90 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 l command, initi
14da0 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 alize ssl contex
14db0 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d t. *. *---------
14dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 ----------. */.D
14e00 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 LLEXPORT int Tls
14e10 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 _Init(Tcl_Interp
14e20 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
14e30 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 const char tlsTc
14e40 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 lInitScript[] =
14e50 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e {.#include "tls.
14e60 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 tcl.h"..0x00.
14e70 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 };.. dprintf
14e80 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 ("Called");..#if
14e90 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 def USE_TCL_STUB
14ea0 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e S. if (Tcl_In
14eb0 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 itStubs(interp,
14ec0 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 MIN_VERSION, 0)
14ed0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
14ee0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
14ef0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 }.#endif. i
14f00 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 f (Tcl_PkgRequir
14f10 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c e(interp, "Tcl",
14f20 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 MIN_VERSION, 0)
14f30 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
14f40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
14f50 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c }.. if (Tl
14f60 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 sLibInit(0) != T
14f70 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 CL_OK) {..Tcl_Ap
14f80 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
14f90 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e p, "could not in
14fa0 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 itialize SSL lib
14fb0 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 20 rary", (char *)
14fc0 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
14fd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
14fe0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
14ff0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
15000 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 , "tls::ciphers"
15010 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c , CiphersObjCmd,
15020 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
15030 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
15040 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
15050 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
15060 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
15070 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 , "tls::connecti
15080 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 on", ConnectionI
15090 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 nfoObjCmd, (Clie
150a0 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
150b0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
150c0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
150d0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
150e0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
150f0 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 ::handshake", Ha
15100 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 ndshakeObjCmd, (
15110 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
15120 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15130 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
15140 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15150 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
15160 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 "tls::import", I
15170 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c mportObjCmd, (Cl
15180 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
15190 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
151a0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
151b0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
151c0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
151d0 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 ls::unimport", U
151e0 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 nimportObjCmd, (
151f0 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
15200 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15210 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
15220 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15230 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
15240 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 "tls::status", S
15250 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c tatusObjCmd, (Cl
15260 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
15270 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
15280 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
15290 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
152a0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
152b0 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 ls::version", Ve
152c0 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c rsionObjCmd, (Cl
152d0 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
152e0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
152f0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
15300 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
15310 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
15320 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f ls::misc", MiscO
15330 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
15340 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 ta) NULL, (Tcl_C
15350 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
15360 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
15370 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
15380 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 interp, "tls::pr
15390 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 otocols", Protoc
153a0 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 olsObjCmd, (Clie
153b0 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
153c0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
153d0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 *) NULL);..
153e0 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 if (interp) {..T
153f0 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 cl_Eval(interp,
15400 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 tlsTclInitScript
15410 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 );. }.. re
15420 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 turn Tcl_PkgProv
15430 69 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43 4b ide(interp, PACK
15440 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 AGE_NAME, PACKAG
15450 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f E_VERSION);.}../
15460 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
15470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
154a0 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d *.Tls_SafeInit -
154b0 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d -. *. *.--------
154c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
154d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
154e0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 --------*. *.Sta
154f0 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 ndard procedure
15500 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 required by 'loa
15510 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a d'.. *.Initializ
15520 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f es this extensio
15530 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 n for a safe int
15540 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d erpreter.. *.---
15550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
15580 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 *. *.Side effect
15590 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c s:. *..As of 'Tl
155a0 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 s_Init'. *. *.Re
155b0 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e sult:. *..A stan
155c0 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 dard Tcl error c
155d0 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ode.. *. *------
155e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
155f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15610 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 *. */.DLLEXPORT
15620 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 int Tls_SafeInit
15630 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
15640 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e erp) {. dprin
15650 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 tf("Called");.
15660 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 return(Tls_Ini
15670 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f t(interp));.}../
15680 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
15690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
156a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
156b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
156c0 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a *.TlsLibInit --.
156d0 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.----------
156e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
156f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15700 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 ------*. *.Initi
15710 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 alizes SSL libra
15720 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c ry once per appl
15730 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d ication. *.-----
15740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a -----------*. *.
15770 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a *.Side effects:
15780 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 . *..initializes
15790 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a SSL library. *.
157a0 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e *.Result:. *..n
157b0 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
157c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
157f0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
15800 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 TlsLibInit(int u
15810 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 ninitialize) {.
15820 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e static int in
15830 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 itialized = 0;.
15840 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 int status =
15850 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 TCL_OK;.#if defi
15860 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
15870 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
15880 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 TCL_THREADS).
15890 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b size_t num_lock
158a0 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 s;.#endif.. i
158b0 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 f (uninitialize)
158c0 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c {..if (!initial
158d0 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70 72 ized) {.. dpr
158e0 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 intf("Asked to u
158f0 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 ninitialize, but
15900 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 we are not init
15910 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 ialized");...
15920 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b return(TCL_OK);
15930 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 ..}...dprintf("A
15940 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 sked to uninitia
15950 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 lize");..#if def
15960 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
15970 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
15980 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 (TCL_THREADS)..T
15990 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e cl_MutexLock(&in
159a0 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f it_mx);...if (lo
159b0 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65 cks) {.. free
159c0 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f (locks);.. lo
159d0 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 cks = NULL;..
159e0 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b locksCount = 0;
159f0 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 ..}.#endif..init
15a00 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 ialized = 0;..#i
15a10 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
15a20 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
15a30 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
15a40 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c S)..Tcl_MutexUnl
15a50 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 ock(&init_mx);.#
15a60 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 54 endif...return(T
15a70 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 CL_OK);. }..
15a80 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a if (initializ
15a90 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 ed) {..dprintf("
15aa0 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e Called, but usin
15ab0 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 g cached value")
15ac0 3b 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 73 ;..return(status
15ad0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 );. }.. dp
15ae0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
15af0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
15b00 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
15b10 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
15b20 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d READS). Tcl_M
15b30 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d utexLock(&init_m
15b40 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 x);.#endif. i
15b50 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a nitialized = 1;.
15b60 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
15b70 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
15b80 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
15b90 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f EADS). num_lo
15ba0 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 cks = 1;. loc
15bb0 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 ksCount = (int)
15bc0 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c num_locks;. l
15bd0 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 ocks = malloc(si
15be0 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e zeof(*locks) * n
15bf0 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d um_locks);. m
15c00 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 emset(locks, 0,
15c10 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a sizeof(*locks) *
15c20 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e num_locks);.#en
15c30 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 dif.. /* Init
15c40 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 ialize BOTH libc
15c50 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c rypto and libssl
15c60 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c . */. OPENSSL
15c70 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 _init_ssl(OPENSS
15c80 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f L_INIT_LOAD_SSL_
15c90 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 STRINGS | OPENSS
15ca0 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 L_INIT_LOAD_CRYP
15cb0 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 TO_STRINGS..| OP
15cc0 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 ENSSL_INIT_ADD_A
15cd0 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 LL_CIPHERS | OPE
15ce0 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c NSSL_INIT_ADD_AL
15cf0 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 L_DIGESTS, NULL)
15d00 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 ;.. BIO_new_t
15d10 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 cl(NULL, 0);..#i
15d20 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 f 0. /*.
15d30 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f * XXX:TODO: Remo
15d40 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64 ve this code and
15d50 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 replace it with
15d60 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 a check. *
15d70 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f for enough entro
15d80 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 py and do not tr
15d90 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 y to create our
15da0 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69 own. * terri
15db0 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 ble entropy.
15dc0 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 */. /*.
15dd0 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f * Seed the rando
15de0 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 m number generat
15df0 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 or in the SSL li
15e00 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 brary,. * us
15e10 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 ing the do/while
15e20 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 construct becau
15e30 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f se of the bug no
15e40 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a te in the. *
15e50 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 OpenSSL FAQ at
15e60 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 http://www.opens
15e70 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 sl.org/support/f
15e80 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 aq.html#USER1.
15e90 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 *. * The
15ea0 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 crux of the prob
15eb0 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 lem is that Sola
15ec0 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 ris 7 does not h
15ed0 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 ave a. * /de
15ee0 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 v/random or /dev
15ef0 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 /urandom device
15f00 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 so it cannot gat
15f10 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 her enough.
15f20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 * entropy from t
15f30 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 he RAND_seed() w
15f40 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 hen TLS initiali
15f50 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a zes and refuses.
15f60 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 * to go fur
15f70 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 ther. Earlier ve
15f80 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 rsions of OpenSS
15f90 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 L carried on reg
15fa0 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f ardless.. */
15fb0 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 . srand((unsi
15fc0 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 gned int) time((
15fd0 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 time_t *) NULL))
15fe0 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 ;. do {..for
15ff0 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 (i = 0; i < 16;
16000 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f i++) {.. rnd_
16010 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 seed[i] = 1 + (c
16020 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 har) (255.0 * ra
16030 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 nd()/(RAND_MAX+1
16040 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 .0));..}..RAND_s
16050 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 eed(rnd_seed, si
16060 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b zeof(rnd_seed));
16070 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 . } while (RA
16080 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 ND_status() != 1
16090 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 );.#endif..#if d
160a0 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
160b0 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
160c0 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
160d0 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b .Tcl_MutexUnlock
160e0 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 (&init_mx);.#end
160f0 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 73 if.. return(s
16100 74 61 74 75 73 29 3b 0a 7d 0a tatus);.}.