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 4e 55 4c 4c 29 29 cl_Size *)NULL))
31f0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c != NULL) {..Tcl
3200: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3210: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3220: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
3230: 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 ingObj(msg, -1))
3240: 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ;.. } else {.
3250: 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e .listPtr = Tcl_N
3260: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
3270: 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65 72 72 L);..while ((err
3280: 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 = ERR_get_error
3290: 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 ()) != 0) {..
32a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
32b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
32c0: 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e , listPtr, Tcl_N
32d0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f ewStringObj(ERR_
32e0: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 reason_error_str
32f0: 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a ing(err), -1));.
3300: 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 .}..Tcl_ListObjA
3310: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3320: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73 erp, cmdPtr, lis
3330: 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 tPtr);. }..
3340: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
3350: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
3360: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
3370: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
3380: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
3390: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
33a0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
33b0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
33c0: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Ptr);.}.../*. *-
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 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 --. *. * KeyLogC
3420: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a allback --. *. *
3430: 09 57 72 69 74 65 20 72 65 63 65 69 76 65 64 20 .Write received
3440: 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 key data to log
3450: 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 file.. *. * Side
3460: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e effects:. *.non
3470: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
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 0a 20 2a 2f 0a 76 ----------. */.v
34c0: 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 oid KeyLogCallba
34d0: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 ck(const SSL *ss
34e0: 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c l, const char *l
34f0: 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 ine) {. char
3500: 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 *str = getenv(SS
3510: 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 LKEYLOGFILE);.
3520: 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 FILE *fd;..
3530: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
3540: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 72 ");.. if (str
3550: 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28 ) {..fd = fopen(
3560: 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 72 69 str, "a");..fpri
3570: 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c ntf(fd, "%s\n",l
3580: 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64 ine);..fclose(fd
3590: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a );. }.}.../*.
35a0: 20 2a 2d 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 0a 20 2a 0a 20 2a 20 50 61 73 73 -----. *. * Pass
35f0: 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d word Callback --
3600: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 . *. *.Called wh
3610: 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 66 6f en a password fo
3620: 72 20 61 20 70 72 69 76 61 74 65 20 6b 65 79 20 r a private key
3630: 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69 6e 67 20 loading/storing
3640: 61 20 50 45 4d 0a 20 2a 09 63 65 72 74 69 66 69 a PEM. *.certifi
3650: 63 61 74 65 20 77 69 74 68 20 65 6e 63 72 79 70 cate with encryp
3660: 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c tion. Evals call
3670: 62 61 63 6b 20 73 63 72 69 70 74 20 61 6e 64 20 back script and
3680: 72 65 74 75 72 6e 73 0a 20 2a 09 74 68 65 20 72 returns. *.the r
3690: 65 73 75 6c 74 20 61 73 20 74 68 65 20 70 61 73 esult as the pas
36a0: 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69 6e 20 sword string in
36b0: 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c buf.. *. * Resul
36c0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
36d0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
36e0: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
36f0: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
3700: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
3710: 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65 20 69 .Password size i
3720: 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20 66 6f n bytes or -1 fo
3730: 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 r an error.. *.
3740: 2a 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
3790: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c int.PasswordCall
37a0: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 back(char *buf,
37b0: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 77 int size, int rw
37c0: 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 74 flag, void *udat
37d0: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a a) {. State *
37e0: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 statePtr.= (Stat
37f0: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 e *) udata;.
3800: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
3810: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
3820: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
3830: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
3840: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 int code;.. d
3850: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
3860: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 ;.. /* If no
3870: 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64 65 callback, use de
3880: 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20 2a fault callback *
3890: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
38a0: 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 tr->password ==
38b0: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c NULL) {..if (Tcl
38c0: 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 _EvalEx(interp,
38d0: 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c "tls::password",
38e0: 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c -1, TCL_EVAL_GL
38f0: 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 OBAL) == TCL_OK)
3900: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65 {.. char *re
3910: 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c t = (char *) Tcl
3920: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 _GetStringResult
3930: 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 73 (interp);.. s
3940: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c trncpy(buf, ret,
3950: 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b (size_t) size);
3960: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e .. return (in
3970: 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 t)strlen(ret);..
3980: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 } else {.. re
3990: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 turn -1;..}.
39a0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 }.. /* Create
39b0: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c command to eval
39c0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
39d0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
39e0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 j(statePtr->pass
39f0: 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c word);. Tcl_L
3a00: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3a10: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3a20: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
3a30: 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64 22 2c gObj("password",
3a40: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
3a50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3a60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3a70: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
3a80: 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 j(rwflag));.
3a90: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
3aa0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
3ab0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
3ac0: 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a IntObj(size));..
3ad0: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
3ae0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
3af0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 terp);. Tcl_P
3b00: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
3b10: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
3b20: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
3b30: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
3b40: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
3b50: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
3b60: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 code = Tcl_Ev
3b70: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 alObjEx(interp,
3b80: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c cmdPtr, TCL_EVAL
3b90: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 _GLOBAL);. if
3ba0: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b (code != TCL_OK
3bb0: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ) {.#if (TCL_MAJ
3bc0: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
3bd0: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
3be0: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
3bf0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
3c00: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
3c10: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
3c20: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
3c30: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 code);.#endif.
3c40: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
3c50: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
3c60: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 );.. Tcl_Rele
3c70: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
3c80: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 statePtr);..
3c90: 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 /* If successfu
3ca0: 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70 61 73 l, pass back pas
3cb0: 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61 6e 64 sword string and
3cc0: 20 74 72 75 6e 63 61 74 65 20 69 66 20 74 6f 6f truncate if too
3cd0: 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 long */. if
3ce0: 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 (code == TCL_OK)
3cf0: 20 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c 65 6e {..Tcl_Size len
3d00: 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 ;..char *ret = (
3d10: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 char *) Tcl_GetS
3d20: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c tringFromObj(Tcl
3d30: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _GetObjResult(in
3d40: 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 terp), &len);..i
3d50: 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 f (len > (Tcl_Si
3d60: 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20 ze) size-1) {..
3d70: 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 len = (Tcl_Si
3d80: 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 ze) size-1;..}..
3d90: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 strncpy(buf, ret
3da0: 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b , (size_t) len);
3db0: 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 ..buf[len] = '\0
3dc0: 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 ';..Tcl_Release(
3dd0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
3de0: 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 28 69 erp);..return((i
3df0: 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a nt) len);. }.
3e00: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
3e10: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
3e20: 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e erp);. return
3e30: 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d -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 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 -. *. * Session
3e90: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 Callback for Cli
3ea0: 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 ents --. *. *.Ca
3eb0: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 lled when a new
3ec0: 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 session is added
3ed0: 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 to the cache. I
3ee0: 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 n TLS 1.3. *.thi
3ef0: 73 20 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 s may be receive
3f00: 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 d multiple times
3f10: 20 61 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 after the hands
3f20: 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 hake. For. *.ear
3f30: 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 lier versions, t
3f40: 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 his will be rece
3f50: 69 76 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 ived during the
3f60: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 handshake.. *.Th
3f70: 69 73 20 69 73 20 74 68 65 20 70 72 65 66 65 72 is is the prefer
3f80: 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 red way to obtai
3f90: 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 n a resumable se
3fa0: 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 ssion.. *. * Res
3fb0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
3fc0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
3fd0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
3fe0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
3ff0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
4000: 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f des:. *.0 = erro
4010: 72 20 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 r where session
4020: 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 will be immediat
4030: 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d ely removed from
4040: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 the internal ca
4050: 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 che.. *.1 = succ
4060: 65 73 73 20 77 68 65 72 65 20 61 70 70 20 72 65 ess where app re
4070: 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e tains session in
4080: 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 session cache,
4090: 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 and must call SS
40a0: 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 L_SESSION_free()
40b0: 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 when done.. *.
40c0: 2a 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
4110: 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 int.SessionCallb
4120: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
4130: 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 sl, SSL_SESSION
4140: 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 20 20 *session) {.
4150: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
4160: 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 = (State*)SSL_ge
4170: 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20 t_app_data((SSL
4180: 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f *)ssl);. Tcl_
4190: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d Interp *interp.=
41a0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
41b0: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
41c0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 cmdPtr;. cons
41d0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
41e0: 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 6f 6e *ticket;. con
41f0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
4200: 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 20 20 *session_id;.
4210: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 20 size_t len2;.
4220: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 unsigned int
4230: 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e ulen;.. dprin
4240: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
4250: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
4260: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 >callback == (Tc
4270: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
4280: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
4290: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 T_ERR_OK;. }
42a0: 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 else if (ssl ==
42b0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
42c0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
42d0: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 OACK;. }..
42e0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
42f0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
4300: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
4310: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
4320: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
4330: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4340: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4350: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
4360: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
4370: 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a session", -1));.
4380: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4390: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
43a0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
43b0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
43c0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
43d0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
43e0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 self), -1));..
43f0: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 /* Session id
4400: 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 */. session_i
4410: 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f d = SSL_SESSION_
4420: 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 get_id(session,
4430: 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f &ulen);. Tcl_
4440: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
4450: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
4460: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 Ptr, Tcl_NewByte
4470: 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e ArrayObj(session
4480: 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 _id, (Tcl_Size)
4490: 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 ulen));.. /*
44a0: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a Session ticket *
44b0: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f /. SSL_SESSIO
44c0: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 N_get0_ticket(se
44d0: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
44e0: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f &len2);. Tcl_
44f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
4500: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
4510: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 Ptr, Tcl_NewByte
4520: 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c ArrayObj(ticket,
4530: 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
4540: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 ));.. /* Life
4550: 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 time - number of
4560: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 seconds */.
4570: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
4580: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
4590: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 cmdPtr,..Tcl_Ne
45a0: 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 wLongObj((long)
45b0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
45c0: 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f ticket_lifetime_
45d0: 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b hint(session)));
45e0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
45f0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
4600: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
4610: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
4620: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b EvalCallback
4630: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
4640: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 r, cmdPtr);.
4650: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
4660: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 (cmdPtr);. re
4670: 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 turn 0;.}.../*.
4680: 2a 2d 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 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 ----. *. * ALPN
46d0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 Callback for Ser
46e0: 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c vers and NPN Cal
46f0: 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 lback for Client
4700: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f s --. *. *.Perfo
4710: 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 rm protocol (htt
4720: 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 p/1.1, h2, h3, e
4730: 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 tc.) selection f
4740: 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 or the. *.incomi
4750: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 ng connection. C
4760: 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c alled after Hell
4770: 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c o and server cal
4780: 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 lbacks.. *.Where
4790: 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 'out' is select
47a0: 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 ed protocol and
47b0: 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 'in' is the peer
47c0: 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 advertised list
47d0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
47e0: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
47f0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
4800: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
4810: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
4820: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
4830: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
4840: 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f R_OK: ALPN proto
4850: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 col selected. Th
4860: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
4870: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 tinues.. *.SSL_T
4880: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
4890: 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 FATAL: There was
48a0: 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 no overlap betw
48b0: 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 een the client's
48c0: 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 . *. supplied
48d0: 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 list and the se
48e0: 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 rver configurati
48f0: 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 on. The connecti
4900: 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 on will be abort
4910: 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 ed.. *.SSL_TLSEX
4920: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 T_ERR_NOACK: ALP
4930: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 N protocol not s
4940: 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 elected, e.g., b
4950: 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 ecause no ALPN.
4960: 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 *. protocols
4970: 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 are configured f
4980: 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 or this connecti
4990: 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 on. The connecti
49a0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
49b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
4a00: 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 c int.ALPNCallba
4a10: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 ck(const SSL *ss
4a20: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 l, const unsigne
4a30: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e d char **out, un
4a40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 signed char *out
4a50: 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 len,..const unsi
4a60: 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 gned char *in, u
4a70: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 nsigned int inle
4a80: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a n, void *arg) {.
4a90: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
4aa0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
4ab0: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 g;. Tcl_Inter
4ac0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
4ad0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
4ae0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
4af0: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c r;. int code,
4b00: 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e res;.. dprin
4b10: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
4b20: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 if (ssl == NU
4b30: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c LL || arg == NUL
4b40: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
4b50: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
4b60: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a K;. }.. /*
4b70: 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c Select protocol
4b80: 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f */. if (SSL_
4b90: 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 select_next_prot
4ba0: 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 o(out, outlen, s
4bb0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c tatePtr->protos,
4bc0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
4bd0: 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 s_len,..in, inle
4be0: 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 n) == OPENSSL_NP
4bf0: 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a N_NEGOTIATED) {.
4c00: 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 20 ./* Match found
4c10: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c */..res = SSL_TL
4c20: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
4c30: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50 } else {../* OP
4c40: 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 ENSSL_NPN_NO_OVE
4c50: 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61 RLAP = No overla
4c60: 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 20 p, so use first
4c70: 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74 item from client
4c80: 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a protocol list *
4c90: 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 /..res = SSL_TLS
4ca0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
4cb0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
4cc0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 atePtr->vcmd ==
4cd0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 (Tcl_Obj*)NULL)
4ce0: 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 {..return res;.
4cf0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
4d00: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
4d10: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 val */. cmdPt
4d20: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
4d30: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
4d40: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
4d50: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4d60: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4d70: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4d80: 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 Obj("alpn", -1))
4d90: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
4da0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
4db0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
4dc0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
4dd0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
4de0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
4df0: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
4e00: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4e10: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4e20: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
4e30: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f 75 NewStringObj(*ou
4e40: 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c t, -1));. Tcl
4e50: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4e60: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4e70: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f dPtr, Tcl_NewBoo
4e80: 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 leanObj(res == S
4e90: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
4ea0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c ));.. /* Eval
4eb0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
4ec0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
4ed0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
4ee0: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 );. if ((code
4ef0: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 = EvalCallback(
4f00: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
4f10: 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 , cmdPtr)) > 1)
4f20: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
4f30: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
4f40: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f } else if (co
4f50: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 de == 1) {..res
4f60: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 = SSL_TLSEXT_ERR
4f70: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 _OK;. } else
4f80: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
4f90: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 EXT_ERR_ALERT_FA
4fa0: 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 TAL;. }. T
4fb0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
4fc0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
4fd0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a urn res;.}.../*.
4fe0: 20 2a 2d 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 0a 20 2a 0a 20 2a 20 41 64 76 65 -----. *. * Adve
5030: 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 rtise Protocols
5040: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 Callback for Nex
5050: 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 t Protocol Negot
5060: 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 iation (NPN) in
5070: 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 ServerHello --.
5080: 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e *. *.called when
5090: 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e 65 a TLS server ne
50a0: 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73 75 eds a list of su
50b0: 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c pported protocol
50c0: 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 s for Next. *.Pr
50d0: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 otocol Negotiati
50e0: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 on.. *. * Result
50f0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
5100: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
5110: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
5120: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s:. *.SSL_TLSEXT
5130: 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f _ERR_OK: NPN pro
5140: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 tocol selected.
5150: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
5160: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c ontinues.. *.SSL
5170: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
5180: 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 K: NPN protocol
5190: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54 68 not selected. Th
51a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
51b0: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d tinues.. *. *---
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: 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f . */.#ifdef USE_
5210: 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e NPN.static int.N
5220: 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 PNCallback(const
5230: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 SSL *ssl, const
5240: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
5250: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 *out, unsigned i
5260: 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 nt *outlen, void
5270: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
5280: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
5290: 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 State*)arg;..
52a0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
52b0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c ");.. if (ssl
52c0: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 == NULL || arg
52d0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
52e0: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
52f0: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a R_NOACK;. }..
5300: 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f /* Set proto
5310: 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 cols list */.
5320: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
5330: 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b rotos != NULL) {
5340: 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 74 ..*out = statePt
5350: 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 r->protos;..*out
5360: 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d 3e len = statePtr->
5370: 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 protos_len;.
5380: 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d } else {..*out =
5390: 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 NULL;..*outlen
53a0: 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c = 0;..return SSL
53b0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
53c0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 K;. }. ret
53d0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
53e0: 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a RR_OK;.}.#endif.
53f0: 0c 0a 2f 2a 0a 20 2a 2d 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 0a 20 2a 0a 20 2a ----------. *. *
5440: 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f SNI Callback fo
5450: 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a r Servers --. *.
5460: 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65 *.Perform serve
5470: 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e r-side SNI hostn
5480: 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 ame selection af
5490: 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e ter receiving SN
54a0: 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 I extension. *.i
54b0: 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 n Client Hello.
54c0: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c Called after hel
54d0: 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 lo callback but
54e0: 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c before ALPN call
54f0: 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 back.. *. * Resu
5500: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
5510: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
5520: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
5530: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
5540: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
5550: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
5560: 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f T_ERR_OK: SNI ho
5570: 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74 stname is accept
5580: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
5590: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
55a0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
55b0: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 ALERT_FATAL: SNI
55c0: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 hostname is not
55d0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 accepted. The c
55e0: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 onnection. *.
55f0: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66 is aborted. Def
5600: 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69 ault for alert i
5610: 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 s SSL_AD_UNRECOG
5620: 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 NIZED_NAME.. *.S
5630: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
5640: 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 ERT_WARNING: SNI
5650: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 hostname is not
5660: 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69 accepted, warni
5670: 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 ng alert. *.
5680: 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 sent (not suppor
5690: 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e ted in TLSv1.3).
56a0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
56b0: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
56c0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
56d0: 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 CK: SNI hostname
56e0: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 is not accepted
56f0: 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c and not acknowl
5700: 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e edged,. *. e.
5710: 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e 6f g. if SNI has no
5720: 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 t been configure
5730: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f d. The connectio
5740: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a n continues.. *.
5750: 20 2a 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
57a0: 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b int.SNICallback
57b0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c (const SSL *ssl,
57c0: 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 int *alert, voi
57d0: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 d *arg) {. St
57e0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
57f0: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 (State*)arg;.
5800: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
5810: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
5820: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
5830: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
5840: 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a int code, res;.
5850: 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 char *server
5860: 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 name = NULL;..
5870: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
5880: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 d");.. if (ss
5890: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 l == NULL || arg
58a0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
58b0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
58c0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
58d0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 . /* Only wor
58e0: 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 ks for TLS 1.2 a
58f0: 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 nd earlier */.
5900: 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 servername = S
5910: 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d SL_get_servernam
5920: 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 e(ssl, TLSEXT_NA
5930: 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 METYPE_host_name
5940: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72 76 );. if (!serv
5950: 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 ername || server
5960: 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 name[0] == '\0')
5970: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
5980: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
5990: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
59a0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
59b0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
59c0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
59d0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
59e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
59f0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
5a00: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 val */. cmdPt
5a10: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
5a20: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
5a30: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
5a40: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
5a50: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
5a60: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
5a70: 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b Obj("sni", -1));
5a80: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
5a90: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
5aa0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
5ab0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
5ac0: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
5ad0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
5ae0: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 >self), -1));.
5af0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
5b00: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
5b10: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
5b20: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 ewStringObj(serv
5b30: 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a ername , -1));..
5b40: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
5b50: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
5b60: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
5b70: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
5b80: 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 if ((code = Ev
5b90: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 alCallback(inter
5ba0: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 p, statePtr, cmd
5bb0: 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 Ptr)) > 1) {..re
5bc0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
5bd0: 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 RR_ALERT_WARNING
5be0: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f ;..*alert = SSL_
5bf0: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f AD_UNRECOGNIZED_
5c00: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 NAME; /* Not sup
5c10: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e ported by TLS 1.
5c20: 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 3 */. } else
5c30: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b if (code == 1) {
5c40: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
5c50: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
5c60: 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 else {..res = S
5c70: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
5c80: 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 ERT_FATAL;..*ale
5c90: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 rt = SSL_AD_UNRE
5ca0: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f COGNIZED_NAME; /
5cb0: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 * Not supported
5cc0: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 by TLS 1.3 */.
5cd0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 }. Tcl_Decr
5ce0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
5cf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 ;. return res
5d00: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
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 0a 20 --------------.
5d50: 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f *. * ClientHello
5d60: 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 Handshake Callb
5d70: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 ack for Servers
5d80: 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 --. *. *.Used by
5d90: 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 server to exami
5da0: 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 ne the server na
5db0: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 me indication (S
5dc0: 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a NI) extension. *
5dd0: 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 .provided by the
5de0: 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 client in order
5df0: 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 to select an ap
5e00: 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 propriate certif
5e10: 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 icate to. *.pres
5e20: 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 ent, and make ot
5e30: 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f her configuratio
5e40: 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 n adjustments re
5e50: 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 levant to that s
5e60: 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e erver. *.name an
5e70: 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 d its configurat
5e80: 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 ion. This includ
5e90: 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 es swapping out
5ea0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 the associated.
5eb0: 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 *.SSL_CTX pointe
5ec0: 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 r, modifying the
5ed0: 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f server's list o
5ee0: 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 f permitted TLS
5ef0: 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 versions,. *.cha
5f00: 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 nging the server
5f10: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 's cipher list i
5f20: 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 n response to th
5f30: 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 e client's ciphe
5f40: 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09 r list, etc.. *.
5f50: 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e Called before SN
5f60: 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62 I and ALPN callb
5f70: 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 acks.. *. * Resu
5f80: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
5f90: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
5fa0: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
5fb0: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
5fc0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
5fd0: 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e es:. *.SSL_CLIEN
5fe0: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 T_HELLO_RETRY: s
5ff0: 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73 uspend the hands
6000: 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61 hake, and the ha
6010: 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e ndshake function
6020: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d will return imm
6030: 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f ediately. *.SSL_
6040: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6050: 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72 OR: failure, ter
6060: 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f minate connectio
6070: 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20 n. Set alert to
6080: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53 error code.. *.S
6090: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
60a0: 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 73 SUCCESS: success
60b0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
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 0a 20 2a 2f 0a 73 74 ---------. */.st
6100: 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 atic int.HelloCa
6110: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
6120: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 *ssl, int *aler
6130: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a t, void *arg) {.
6140: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
6150: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
6160: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 g;. Tcl_Inter
6170: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
6180: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
6190: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
61a0: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c r;. int code,
61b0: 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 res;. const
61c0: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 char *servername
61d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 ;. const unsi
61e0: 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 gned char *p;.
61f0: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 size_t len, re
6200: 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70 maining;.. dp
6210: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
6220: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
6230: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c tr->vcmd == (Tcl
6240: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 _Obj*)NULL) {..r
6250: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6260: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a _HELLO_SUCCESS;.
6270: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
6280: 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 4c sl == (const SSL
6290: 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d *)NULL || arg =
62a0: 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 20 = (void *)NULL)
62b0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c {..return SSL_CL
62c0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
62d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
62e0: 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 Get names */.
62f0: 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74 if (!SSL_client
6300: 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28 _hello_get0_ext(
6310: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45 ssl, TLSEXT_TYPE
6320: 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70 _server_name, &p
6330: 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c , &remaining) ||
6340: 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 remaining <= 2)
6350: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
6360: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 _R_SSLV3_ALERT_I
6370: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 LLEGAL_PARAMETER
6380: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
6390: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
63a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
63b0: 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67 Extract the leng
63c0: 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 th of the suppli
63d0: 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 ed list of names
63e0: 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28 . */. len = (
63f0: 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 *(p++) << 8);.
6400: 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b len += *(p++);
6410: 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 . if (len + 2
6420: 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b != remaining) {
6430: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 ..*alert = SSL_R
6440: 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c _SSLV3_ALERT_ILL
6450: 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a EGAL_PARAMETER;.
6460: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
6470: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
6480: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e }. remain
6490: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 ing = len;..
64a0: 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70 /* The list in p
64b0: 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73 ractice only has
64c0: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e a single elemen
64d0: 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f t, so we only co
64e0: 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 74 nsider the first
64f0: 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 one. */. if
6500: 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20 (remaining == 0
6510: 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58 || *p++ != TLSEX
6520: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f T_NAMETYPE_host_
6530: 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20 name) {..*alert
6540: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c = SSL_R_TLSV1_AL
6550: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 ERT_INTERNAL_ERR
6560: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f OR;..return SSL_
6570: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6580: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 OR;. }. re
6590: 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 maining--;..
65a0: 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 /* Now we can fi
65b0: 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 nally pull out t
65c0: 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 69 he byte array wi
65d0: 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f th the actual ho
65e0: 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 stname. */. i
65f0: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 f (remaining <=
6600: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 2) {..*alert = S
6610: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 SL_R_TLSV1_ALERT
6620: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b _INTERNAL_ERROR;
6630: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
6640: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
6650: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d . }. len =
6660: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a (*(p++) << 8);.
6670: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b len += *(p++
6680: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b );. if (len +
6690: 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20 2 > remaining)
66a0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
66b0: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e R_TLSV1_ALERT_IN
66c0: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 TERNAL_ERROR;..r
66d0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
66e0: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
66f0: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e }. remainin
6700: 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72 g = len;. ser
6710: 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 vername = (const
6720: 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20 char *)p;..
6730: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
6740: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 d to eval */.
6750: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
6760: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
6770: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 Ptr->vcmd);.
6780: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
6790: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
67a0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
67b0: 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f StringObj("hello
67c0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
67d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
67e0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
67f0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
6800: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
6810: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
6820: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
6830: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
6840: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
6850: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
6860: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
6870: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 Obj(servername,
6880: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 (Tcl_Size) len))
6890: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
68a0: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
68b0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
68c0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
68d0: 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d . if ((code =
68e0: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e EvalCallback(in
68f0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
6900: 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a cmdPtr)) > 1) {.
6910: 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e .res = SSL_CLIEN
6920: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 T_HELLO_RETRY;..
6930: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 *alert = SSL_R_T
6940: 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f LSV1_ALERT_USER_
6950: 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d CANCELLED;. }
6960: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d else if (code =
6970: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 1) {..res = SS
6980: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 L_CLIENT_HELLO_S
6990: 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c UCCESS;. } el
69a0: 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f se {..res = SSL_
69b0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
69c0: 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 OR;..*alert = SS
69d0: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f L_R_TLSV1_ALERT_
69e0: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a INTERNAL_ERROR;.
69f0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
6a00: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
6a10: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 r);. return r
6a20: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a es;.}.../*******
6a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f *************/./
6a40: 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 * Commands
6a50: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a */./*********
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a ***********/../*
6a70: 0a 20 2a 2d 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 0a 20 2a 0a 20 2a 20 43 69 70 ------. *. * Cip
6ac0: 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 hersObjCmd -- li
6ad0: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 st available cip
6ae0: 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 hers. *. *.This
6af0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
6b00: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
6b10: 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 the "tls::cipher
6b20: 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f s" command. *.to
6b30: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 list available
6b40: 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 ciphers, based u
6b50: 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c pon protocol sel
6b60: 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 ected.. *. * Res
6b70: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
6b80: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c ard Tcl result l
6b90: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ist.. *. * Side
6ba0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 effects:. *.cons
6bb0: 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 tructs and destr
6bc0: 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 oys SSL context
6bd0: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 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 0a 20 --------------.
6c20: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 */.static const
6c30: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b char *protocols[
6c40: 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 ] = {.."ssl2", "
6c50: 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 ssl3", "tls1", "
6c60: 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 tls1.1", "tls1.2
6c70: 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c ", "tls1.3", NUL
6c80: 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 L.};.enum protoc
6c90: 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c ol {. TLS_SSL
6ca0: 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 2, TLS_SSL3, TLS
6cb0: 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f _TLS1, TLS_TLS1_
6cc0: 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 1, TLS_TLS1_2, T
6cd0: 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e LS_TLS1_3, TLS_N
6ce0: 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 ONE.};..static i
6cf0: 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 nt.CiphersObjCmd
6d00: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
6d10: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
6d20: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
6d30: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
6d40: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
6d50: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
6d60: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 tr = NULL;. S
6d70: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 SL_CTX *ctx = NU
6d80: 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c LL;. SSL *ssl
6d90: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 = NULL;. STA
6da0: 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 CK_OF(SSL_CIPHER
6db0: 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 ) *sk;. char
6dc0: 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d *cp, buf[BUFSIZ]
6dd0: 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c ;. int index,
6de0: 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 verbose = 0, us
6df0: 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b e_supported = 0;
6e00: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d . const SSL_M
6e10: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a ETHOD *method;..
6e20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
6e30: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
6e40: 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f (objc < 2) || (o
6e50: 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c bjc > 4)) {..Tcl
6e60: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
6e70: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
6e80: 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 protocol ?verbos
6e90: 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 e? ?supported?")
6ea0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
6eb0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
6ec0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 f (Tcl_GetIndexF
6ed0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
6ee0: 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c bjv[1], protocol
6ef0: 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 s, "protocol", 0
6f00: 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c , &index) != TCL
6f10: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
6f20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
6f30: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 if ((objc >
6f40: 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 2) && Tcl_GetBoo
6f50: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 leanFromObj(inte
6f60: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 rp, objv[2], &ve
6f70: 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b rbose) != TCL_OK
6f80: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
6f90: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
6fa0: 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 if ((objc > 3)
6fb0: 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 && Tcl_GetBoolea
6fc0: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c nFromObj(interp,
6fd0: 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 objv[3], &use_s
6fe0: 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c upported) != TCL
6ff0: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
7000: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
7010: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
7020: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 rror();.. swi
7030: 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f tch ((enum proto
7040: 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 col)index) {..ca
7050: 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 se TLS_SSL2:.#if
7060: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
7070: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 _NUMBER >= 0x101
7080: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 00000L || define
7090: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 d(NO_SSL2) || de
70a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
70b0: 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f _SSL2).. Tcl_
70c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
70d0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
70e0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
70f0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
7100: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
7110: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7120: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
7130: 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f od = SSLv2_metho
7140: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
7150: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c if..case TLS_SSL
7160: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 3:.#if defined(N
7170: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e O_SSL3) || defin
7180: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
7190: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L3) || defined(O
71a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d PENSSL_NO_SSL3_M
71b0: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
71c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
71d0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
71e0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
71f0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
7200: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
7210: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7220: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
7230: 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f od = SSLv3_metho
7240: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
7250: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
7260: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 1:.#if defined(N
7270: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e O_TLS1) || defin
7280: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7290: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f S1) || defined(O
72a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d PENSSL_NO_TLS1_M
72b0: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
72c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
72d0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
72e0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
72f0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
7300: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
7310: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7320: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
7330: 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f od = TLSv1_metho
7340: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
7350: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
7360: 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 1_1:.#if defined
7370: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 (NO_TLS1_1) || d
7380: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7390: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 O_TLS1_1) || def
73a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
73b0: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 TLS1_1_METHOD)..
73c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
73d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
73e0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
73f0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
7400: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
7410: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
7420: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
7430: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 method = TLS
7440: 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 v1_1_method(); b
7450: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
7460: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 se TLS_TLS1_2:.#
7470: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
7480: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
7490: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
74a0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
74b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
74c0: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 _METHOD).. Tc
74d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
74e0: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
74f0: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
7500: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
7510: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
7520: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
7530: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 R;.#else.. me
7540: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d thod = TLSv1_2_m
7550: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a ethod(); break;.
7560: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 #endif..case TLS
7570: 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 _TLS1_3:.#if def
7580: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
7590: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
75a0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 SL_NO_TLS1_3)..
75b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
75c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
75d0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
75e0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
75f0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
7600: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
7610: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
7620: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f method = TLS_
7630: 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 53 method();.. S
7640: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 SL_CTX_set_min_p
7650: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
7660: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
7670: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
7680: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 set_max_proto_ve
7690: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f rsion(ctx, TLS1_
76a0: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 3_VERSION);..
76b0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
76c0: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65 default:.. me
76d0: 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f thod = TLS_metho
76e0: 64 28 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b d();.. break;
76f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 . }.. ctx
7700: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 = SSL_CTX_new(me
7710: 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 63 thod);. if (c
7720: 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 tx == NULL) {..T
7730: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
7740: 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 interp, REASON()
7750: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
7760: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
7770: 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c }.. ssl = SSL
7780: 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 _new(ctx);. i
7790: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 f (ssl == NULL)
77a0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
77b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 ult(interp, REAS
77c0: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 ON(), NULL);..SS
77d0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
77e0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
77f0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
7800: 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f * Use list and o
7810: 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 rder as would be
7820: 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e sent in a Clien
7830: 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 tHello or all av
7840: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 ailable ciphers
7850: 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 */. if (use_s
7860: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 upported) {..sk
7870: 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f = SSL_get1_suppo
7880: 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c rted_ciphers(ssl
7890: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
78a0: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 .sk = SSL_get_ci
78b0: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 phers(ssl);.
78c0: 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d }.. if (sk !=
78d0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 NULL) {..if (!v
78e0: 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f erbose) {.. o
78f0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
7900: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
7910: 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 .. for (int i
7920: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c = 0; i < sk_SSL
7930: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b _CIPHER_num(sk);
7940: 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 i++) {...const
7950: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 SSL_CIPHER *c =
7960: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 sk_SSL_CIPHER_va
7970: 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 lue(sk, i);...if
7980: 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e (c == NULL) con
7990: 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 tinue;..../* cip
79a0: 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e her name or (NON
79b0: 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c E) */...cp = SSL
79c0: 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 _CIPHER_get_name
79d0: 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d (c);...if (cp ==
79e0: 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 NULL) break;...
79f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
7a00: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
7a10: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
7a20: 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 StringObj(cp, -1
7a30: 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 ));.. }...} e
7a40: 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 lse {.. objPt
7a50: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e r = Tcl_NewStrin
7a60: 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 gObj("",0);..
7a70: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b for (int i = 0;
7a80: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 i < sk_SSL_CIPH
7a90: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 ER_num(sk); i++)
7aa0: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 {...const SSL_C
7ab0: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 IPHER *c = sk_SS
7ac0: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 L_CIPHER_value(s
7ad0: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d k, i);...if (c =
7ae0: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 = NULL) continue
7af0: 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 ;..../* textual
7b00: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 description of t
7b10: 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 he cipher */...i
7b20: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 f (SSL_CIPHER_de
7b30: 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 scription(c, buf
7b40: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 , sizeof(buf)) !
7b50: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 = NULL) {...
7b60: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 Tcl_AppendToObj(
7b70: 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 54 63 objPtr, buf, (Tc
7b80: 6c 5f 53 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 l_Size) strlen(b
7b90: 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b uf));...} else {
7ba0: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ... Tcl_Appen
7bb0: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 dToObj(objPtr, "
7bc0: 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a UNKNOWN\n", 8);.
7bd0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 ..}.. }..}..i
7be0: 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 f (use_supported
7bf0: 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f ) {.. sk_SSL_
7c00: 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b CIPHER_free(sk);
7c10: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 ..}. }. SS
7c20: 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 L_free(ssl);.
7c30: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
7c40: 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 x);.. Tcl_Set
7c50: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
7c60: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 , objPtr);. r
7c70: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
7c80: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
7c90: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ntData;.}.../*.
7ca0: 2a 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 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f ----. *. * Proto
7cf0: 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 colsObjCmd -- li
7d00: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f st available pro
7d10: 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 tocols. *. *.Thi
7d20: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
7d30: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
7d40: 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 s the "tls::prot
7d50: 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 ocols" command.
7d60: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 *.to list availa
7d70: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 ble protocols..
7d80: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
7d90: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
7da0: 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a result list.. *.
7db0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
7dc0: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 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 2d ----------------
7e10: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
7e20: 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 .ProtocolsObjCmd
7e30: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
7e40: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
7e50: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
7e60: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
7e70: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
7e80: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
7e90: 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 tr;.. dprintf
7ea0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
7eb0: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 if (objc != 1)
7ec0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
7ed0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
7ee0: 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 bjv, "");..retur
7ef0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
7f00: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 }.. ERR_clea
7f10: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 r_error();..
7f20: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
7f30: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
7f40: 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 ;..#if OPENSSL_V
7f50: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
7f60: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 0x10100000L && !
7f70: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
7f80: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
7f90: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 NSSL_NO_SSL2).
7fa0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
7fb0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
7fc0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
7fd0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
7fe0: 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c ocols[TLS_SSL2],
7ff0: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 -1));.#endif.#i
8000: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
8010: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
8020: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
8030: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
8040: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 NSSL_NO_SSL3_MET
8050: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 HOD). Tcl_Lis
8060: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
8070: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
8080: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
8090: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
80a0: 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 _SSL3], -1));.#e
80b0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
80c0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 d(NO_TLS1) && !d
80d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
80e0: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
80f0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
8100: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 LS1_METHOD).
8110: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
8120: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
8130: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
8140: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 StringObj(protoc
8150: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d ols[TLS_TLS1], -
8160: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
8170: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
8180: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
8190: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
81a0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
81b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
81c0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c _METHOD). Tcl
81d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
81e0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
81f0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
8200: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
8210: 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 [TLS_TLS1_1], -1
8220: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
8230: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
8240: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
8250: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
8260: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8270: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f ENSSL_NO_TLS1_2_
8280: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f METHOD). Tcl_
8290: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
82a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
82b0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
82c0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
82d0: 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 TLS_TLS1_2], -1)
82e0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
82f0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
8300: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8310: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
8320: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
8330: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
8340: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
8350: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
8360: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 rotocols[TLS_TLS
8370: 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 1_3], -1));.#end
8380: 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f if.. Tcl_SetO
8390: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
83a0: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
83b0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
83c0: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
83d0: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a tData;.}.../*. *
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 2d 2d ----------------
8420: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 ---. *. * Handsh
8430: 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a akeObjCmd --. *.
8440: 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 *.This command
8450: 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 is used to verif
8460: 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 y whether the ha
8470: 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c ndshake is compl
8480: 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 ete. *.or not..
8490: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
84a0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
84b0: 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 result. 1 means
84c0: 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 handshake comple
84d0: 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 te, 0 means pend
84e0: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ing.. *. * Side
84f0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
8500: 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 force SSL negoti
8510: 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c ation to take pl
8520: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ace.. *. *------
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 2d 2d 2d 2d 2d 0a 20 2a -------------. *
8570: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e /.static int Han
8580: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 dshakeObjCmd(Cli
8590: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
85a0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
85b0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
85c0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
85d0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
85e0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
85f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 /* The c
8600: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 hannel to set a
8610: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 mode on. */.
8620: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
8630: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e /* clien
8640: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
8650: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f socket */. co
8660: 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 nst char *errStr
8670: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 = NULL;. int
8680: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e ret = 1;. in
8690: 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 t err = 0;..
86a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
86b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
86c0: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 != 2) {..Tcl_Wr
86d0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
86e0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
86f0: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 nnel");..return(
8700: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
8710: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
8720: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 _error();.. c
8730: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
8740: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
8750: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
8760: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f j(objv[1], (Tcl_
8770: 53 69 7a 65 20 2a 29 4e 55 4c 4c 29 2c 20 4e 55 Size *)NULL), NU
8780: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
8790: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
87a0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
87b0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
87c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b }.. /* Mak
87d0: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
87e0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
87f0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
8800: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
8810: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
8820: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
8830: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
8840: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
8850: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
8860: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
8870: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
8880: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
8890: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
88a0: 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 "\": not a T
88b0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
88c0: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f L);..Tcl_SetErro
88d0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
88e0: 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 LS", "HANDSHAKE"
88f0: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e , "CHANNEL", "IN
8900: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 VALID", (char *)
8910: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 NULL);..return(
8920: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
8930: 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d }. statePtr =
8940: 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 (State *)Tcl_Ge
8950: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 tChannelInstance
8960: 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 Data(chan);..
8970: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e dprintf("Callin
8980: 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e g Tls_WaitForCon
8990: 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 nect");. ret
89a0: 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e = Tls_WaitForCon
89b0: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 nect(statePtr, &
89c0: 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 err, 1);. dpr
89d0: 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f intf("Tls_WaitFo
89e0: 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 rConnect returne
89f0: 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 d: %i", ret);..
8a00: 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 if (ret < 0 &
8a10: 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c & ((statePtr->fl
8a20: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 ags & TLS_TCL_AS
8a30: 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 YNC) && (err ==
8a40: 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 EAGAIN))) {..dpr
8a50: 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 intf("Async set
8a60: 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e and err = EAGAIN
8a70: 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 ");..ret = 0;.
8a80: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 } else if (ret
8a90: 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 < 0) {..long re
8aa0: 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 sult;..errStr =
8ab0: 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 statePtr->err;..
8ac0: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 Tcl_ResetResult(
8ad0: 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 interp);..Tcl_Se
8ae0: 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 tErrno(err);...i
8af0: 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a f (!errStr || (*
8b00: 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a errStr == 0)) {.
8b10: 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 . errStr = Tc
8b20: 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 l_PosixError(int
8b30: 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 erp);..}...Tcl_A
8b40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
8b50: 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 rp, "handshake f
8b60: 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 ailed: ", errStr
8b70: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
8b80: 3b 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d ;..if ((result =
8b90: 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f SSL_get_verify_
8ba0: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d result(statePtr-
8bb0: 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 >ssl)) != X509_V
8bc0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f _OK) {.. Tcl_
8bd0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
8be0: 65 72 70 2c 20 22 20 64 75 65 20 74 6f 3a 20 22 erp, " due to: "
8bf0: 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 , X509_verify_ce
8c00: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 rt_error_string(
8c10: 72 65 73 75 6c 74 29 2c 20 28 63 68 61 72 20 2a result), (char *
8c20: 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c ) NULL);..}..Tcl
8c30: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
8c40: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 terp, "TLS", "HA
8c50: 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45 NDSHAKE", "FAILE
8c60: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
8c70: 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65 L);..dprintf("Re
8c80: 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f turning TCL_ERRO
8c90: 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 R with handshake
8ca0: 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 failed: %s", er
8cb0: 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 54 rStr);..return(T
8cc0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
8cd0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72 else {..if (err
8ce0: 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 != 0) {.. dp
8cf0: 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 rintf("Got an er
8d00: 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c ror with a compl
8d10: 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 eted handshake:
8d20: 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b err = %i", err);
8d30: 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 ..}..ret = 1;.
8d40: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
8d50: 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f ("Returning TCL_
8d60: 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 25 OK with data \"%
8d70: 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 i\"", ret);.
8d80: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
8d90: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
8da0: 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 IntObj(ret));.
8db0: 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 return(TCL_OK)
8dc0: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
8dd0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f clientData;.}../
8de0: 2a 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d -------. *. * Im
8e30: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a portObjCmd --. *
8e40: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
8e50: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f re is invoked to
8e60: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 process the "ss
8e70: 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a l" command. *. *
8e80: 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 .The ssl command
8e90: 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 pushes SSL over
8ea0: 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 a (newly connec
8eb0: 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a ted) tcp socket.
8ec0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
8ed0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
8ee0: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
8ef0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
8f00: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 May modify the b
8f10: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f ehavior of an IO
8f20: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
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 2d 2d 2d 2d 2d ----------------
8f70: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
8f80: 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 t.ImportObjCmd(C
8f90: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
8fa0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
8fb0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
8fc0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
8fd0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
8fe0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
8ff0: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
9000: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
9010: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 on. */. Stat
9020: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a e *statePtr;../*
9030: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f client state fo
9040: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a r ssl socket */.
9050: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 SSL_CTX *ctx
9060: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
9070: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 . Tcl_Obj *sc
9080: 72 69 70 74 09 20 20 20 20 20 20 20 20 3d 20 4e ript. = N
9090: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
90a0: 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 20 20 *password.
90b0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 = NULL;. T
90c0: 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 20 20 20 cl_Obj *vcmd.
90d0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
90e0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 Tcl_DString upp
90f0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
9100: 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e tion, upperChann
9110: 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 elBlocking, uppe
9120: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
9130: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f , upperChannelEO
9140: 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 FChar;. int i
9150: 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 dx;. Tcl_Size
9160: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c len;. int fl
9170: 61 67 73 09 09 20 20 20 20 20 20 20 20 3d 20 54 ags.. = T
9180: 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 LS_TCL_INIT;.
9190: 20 69 6e 74 20 73 65 72 76 65 72 09 09 20 20 20 int server..
91a0: 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20 = 0;./* is
91b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d connection incom
91c0: 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f ing or outgoing?
91d0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 */. char *ke
91e0: 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 yfile. =
91f0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
9200: 63 65 72 74 66 69 6c 65 09 20 20 20 20 20 20 20 certfile.
9210: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 = NULL;. uns
9220: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20 igned char *key
9230: 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 .= NULL;. Tc
9240: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 20 20 l_Size key_len
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d =
9260: 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 0;. unsigned
9270: 20 63 68 61 72 20 2a 63 65 72 74 20 20 20 20 20 char *cert
9280: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
9290: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 Tcl_Size cert_le
92a0: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 n
92b0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a = 0;. char *
92c0: 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20 ciphers.
92d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
92e0: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 09 20 *ciphersuites.
92f0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
9300: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 char *CAfile.
9310: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
9320: 20 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 09 char *CAdir.
9330: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
9340: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 . char *DHpar
9350: 61 6d 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ams. = NU
9360: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f LL;. char *mo
9370: 64 65 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e del.. = N
9380: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 ULL;. char *s
9390: 65 72 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20 ervername.
93a0: 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 = NULL;./* hos
93b0: 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72 tname for Server
93c0: 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e Name Indication
93d0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e */. const un
93e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 signed char *ses
93f0: 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a sion_id = NULL;.
9400: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 Tcl_Obj *alp
9410: 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 n..= NULL;. i
9420: 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c nt ssl2 = 0, ssl
9430: 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 3 = 0;. int t
9440: 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 ls1 = 1, tls1_1
9450: 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c = 1, tls1_2 = 1,
9460: 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 tls1_3 = 1;.
9470: 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 int proto = 0,
9480: 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 level = -1;.
9490: 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 int verify = 0,
94a0: 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 require = 0, req
94b0: 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 uest = 1, post_h
94c0: 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 andshake = 0;..
94d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
94e0: 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e ed");..#if defin
94f0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 ed(NO_TLS1) || d
9500: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
9510: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 O_TLS1). tls1
9520: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
9530: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
9540: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
9550: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
9560: 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 ). tls1_1 = 0
9570: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
9580: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
9590: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
95a0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 SL_NO_TLS1_2).
95b0: 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 tls1_2 = 0;.#e
95c0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
95d0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 (NO_TLS1_3) || d
95e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
95f0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c O_TLS1_3). tl
9600: 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 s1_3 = 0;.#endif
9610: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c .. if (objc <
9620: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
9630: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
9640: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
9650: 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 l ?options?");..
9660: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
9670: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
9680: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
9690: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
96a0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
96b0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
96c0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
96d0: 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 4c (Tcl_Size *)NUL
96e0: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 L), NULL);. i
96f0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
9700: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
9710: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
9720: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
9730: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
9740: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
9750: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
9760: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
9770: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
9780: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 an);.. for (i
9790: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 dx = 2; idx < ob
97a0: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 jc; idx++) {..ch
97b0: 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 ar *opt = Tcl_Ge
97c0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
97d0: 62 6a 76 5b 69 64 78 5d 2c 20 28 54 63 6c 5f 53 bjv[idx], (Tcl_S
97e0: 69 7a 65 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 09 69 ize *)NULL);...i
97f0: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 f (opt[0] != '-'
9800: 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ).. break;...
9810: 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 OPTOBJ("-alpn",
9820: 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 alpn);..OPTSTR("
9830: 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 29 3b -cadir", CAdir);
9840: 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c ..OPTSTR("-cafil
9850: 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 e", CAfile);..OP
9860: 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 TBYTE("-cert", c
9870: 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a ert, cert_len);.
9880: 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 69 .OPTSTR("-certfi
9890: 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a le", certfile);.
98a0: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 .OPTSTR("-cipher
98b0: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 ", ciphers);..OP
98c0: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c TSTR("-ciphers",
98d0: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 ciphers);..OPTS
98e0: 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 65 TR("-ciphersuite
98f0: 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 s", ciphersuites
9900: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d );..OPTOBJ("-com
9910: 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a mand", script);.
9920: 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 61 .OPTSTR("-dhpara
9930: 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a ms", DHparams);.
9940: 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c .OPTBYTE("-key",
9950: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a key, key_len);.
9960: 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c .OPTSTR("-keyfil
9970: 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f e", keyfile);..O
9980: 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 PTSTR("-model",
9990: 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 model);..OPTOBJ(
99a0: 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73 "-password", pas
99b0: 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c sword);..OPTBOOL
99c0: 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b ("-post_handshak
99d0: 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 e", post_handsha
99e0: 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d ke);..OPTBOOL("-
99f0: 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 73 request", reques
9a00: 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 t);..OPTBOOL("-r
9a10: 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 equire", require
9a20: 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 );..OPTINT("-sec
9a30: 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 6c 65 76 uritylevel", lev
9a40: 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d el);..OPTBOOL("-
9a50: 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 72 29 server", server)
9a60: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76 ;..OPTSTR("-serv
9a70: 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e ername", servern
9a80: 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ame);..OPTSTR("-
9a90: 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 session_id", ses
9aa0: 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f sion_id);..OPTBO
9ab0: 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 OL("-ssl2", ssl2
9ac0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 );..OPTBOOL("-ss
9ad0: 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 l3", ssl3);..OPT
9ae0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c BOOL("-tls1", tl
9af0: 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d s1);..OPTBOOL("-
9b00: 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 tls1.1", tls1_1)
9b10: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
9b20: 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 1.2", tls1_2);..
9b30: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 OPTBOOL("-tls1.3
9b40: 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 ", tls1_3);..OPT
9b50: 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 6f OBJ("-validateco
9b60: 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 mmand", vcmd);..
9b70: 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 OPTOBJ("-vcmd",
9b80: 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 vcmd);...OPTBAD(
9b90: 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e "option", "-alpn
9ba0: 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c , -cadir, -cafil
9bb0: 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 e, -cert, -certf
9bc0: 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 ile, -cipher, -c
9bd0: 69 70 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f iphersuites, -co
9be0: 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 mmand, -dhparams
9bf0: 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 , -key, -keyfile
9c00: 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 , -model, -passw
9c10: 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 ord, -post_hands
9c20: 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 hake, -request,
9c30: 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72 -require, -secur
9c40: 69 74 79 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 itylevel, -serve
9c50: 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 r, -servername,
9c60: 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 -session_id, -ss
9c70: 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 l2, -ssl3, -tls1
9c80: 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 , -tls1.1, -tls1
9c90: 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 .2, -tls1.3, or
9ca0: 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 -validatecommand
9cb0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c ");...return TCL
9cc0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
9cd0: 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09 09 if (request)..
9ce0: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 verify |= SSL_VE
9cf0: 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 RIFY_CLIENT_ONCE
9d00: 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 | SSL_VERIFY_PE
9d10: 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 ER;. if (requ
9d20: 65 73 74 20 26 26 20 72 65 71 75 69 72 65 29 09 est && require).
9d30: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 verify |= SSL_VE
9d40: 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f RIFY_FAIL_IF_NO_
9d50: 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 PEER_CERT;. i
9d60: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f f (request && po
9d70: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 st_handshake).ve
9d80: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 rify |= SSL_VERI
9d90: 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b FY_POST_HANDSHAK
9da0: 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 E;. if (verif
9db0: 79 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20 y == 0)..verify
9dc0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e = SSL_VERIFY_NON
9dd0: 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d E;.. proto |=
9de0: 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f (ssl2 ? TLS_PRO
9df0: 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 TO_SSL2 : 0);.
9e00: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 proto |= (ssl3
9e10: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c ? TLS_PROTO_SSL
9e20: 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 3 : 0);. prot
9e30: 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 o |= (tls1 ? TLS
9e40: 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 _PROTO_TLS1 : 0)
9e50: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
9e60: 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f tls1_1 ? TLS_PRO
9e70: 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a TO_TLS1_1 : 0);.
9e80: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
9e90: 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f s1_2 ? TLS_PROTO
9ea0: 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 _TLS1_2 : 0);.
9eb0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
9ec0: 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _3 ? TLS_PROTO_T
9ed0: 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 LS1_3 : 0);..
9ee0: 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c /* reset to NUL
9ef0: 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e L if blank strin
9f00: 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 g provided */.
9f10: 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a if (cert && !*
9f20: 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63 cert).. c
9f30: 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ert. = NU
9f40: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 LL;. if (key
9f50: 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 && !*key)..
9f60: 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d key. =
9f70: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
9f80: 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 ertfile && !*cer
9f90: 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 tfile) c
9fa0: 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a ertfile.= NULL;.
9fb0: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 if (keyfile
9fc0: 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b && !*keyfile)..k
9fd0: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d eyfile. =
9fe0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
9ff0: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 iphers && !*ciph
a000: 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70 ers). cip
a010: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e hers. = N
a020: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 ULL;. if (cip
a030: 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 hersuites && !*c
a040: 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70 iphersuites) cip
a050: 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e hersuites = N
a060: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 ULL;. if (CAf
a070: 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 ile && !*CAfile)
a080: 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 . CAfile.
a090: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a0a0: 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26 if (CAdir &&
a0b0: 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 20 !*CAdir).
a0c0: 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20 20 CAdir.
a0d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
a0e0: 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 DHparams && !*DH
a0f0: 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 params).
a100: 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 DHparams
a110: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 = NULL;.. /*
a120: 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f new SSL state */
a130: 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d . statePtr..=
a140: 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c (State *) ckall
a150: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 oc((unsigned) si
a160: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 zeof(State));.
a170: 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 memset(statePt
a180: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 r, 0, sizeof(Sta
a190: 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 te));.. state
a1a0: 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 Ptr->flags.= fla
a1b0: 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 gs;. statePtr
a1c0: 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 ->interp.= inter
a1d0: 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d p;. statePtr-
a1e0: 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 >vflags.= verify
a1f0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
a200: 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f err.= "";.. /
a210: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 * allocate scrip
a220: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 t */. if (scr
a230: 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 ipt) {..(void) T
a240: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
a250: 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e Obj(script, &len
a260: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
a270: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 statePtr->ca
a280: 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b llback = script;
a290: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
a2a0: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
a2b0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 >callback);..}.
a2c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
a2d0: 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a ocate password *
a2e0: 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f /. if (passwo
a2f0: 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 rd) {..(void) Tc
a300: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
a310: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 bj(password, &le
a320: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
a330: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 . statePtr->p
a340: 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f assword = passwo
a350: 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 rd;.. Tcl_Inc
a360: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
a370: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 tr->password);..
a380: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
a390: 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 allocate validat
a3a0: 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 e command */.
a3b0: 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 if (vcmd) {..(v
a3c0: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 oid) Tcl_GetStri
a3d0: 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 ngFromObj(vcmd,
a3e0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 &len);..if (len)
a3f0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 {.. statePtr
a400: 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 ->vcmd = vcmd;..
a410: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
a420: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 ount(statePtr->v
a430: 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a cmd);..}. }..
a440: 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d if (model !=
a450: 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f NULL) {..int mo
a460: 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 de;../* Get the
a470: 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 "model" context
a480: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 */..chan = Tcl_G
a490: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
a4a0: 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b , model, &mode);
a4b0: 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 ..if (chan == (T
a4c0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
a4d0: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 ) {.. Tls_Fre
a4e0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
a4f0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
a500: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
a510: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 ../*.. * Make su
a520: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
a530: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
a540: 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 nnel.. */..chan
a550: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
a560: 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 nel(chan);..if (
a570: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
a580: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
a590: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
a5a0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
a5b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
a5c0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
a5d0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
a5e0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
a5f0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
a600: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 nel", NULL);..
a610: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
a620: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
a630: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 , "IMPORT", "CHA
a640: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
a650: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
a660: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
a670: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
a680: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
a690: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 TCL_ERROR;..}..c
a6a0: 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 tx = ((State *)T
a6b0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
a6c0: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 tanceData(chan))
a6d0: 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 ->ctx;. } els
a6e0: 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 e {..if ((ctx =
a6f0: 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 CTX_Init(statePt
a700: 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f r, server, proto
a710: 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66 , keyfile, certf
a720: 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 ile, key, cert,
a730: 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e 2c 0a 09 (int) key_len,..
a740: 20 20 20 20 28 69 6e 74 29 20 63 65 72 74 5f 6c (int) cert_l
a750: 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c en, CAdir, CAfil
a760: 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 e, ciphers, ciph
a770: 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c ersuites, level,
a780: 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e DHparams)) == N
a790: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f ULL) {.. Tls_
a7a0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
a7b0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
a7c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
a7d0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 .}. }.. st
a7e0: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 atePtr->ctx = ct
a7f0: 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 x;.. /*.
a800: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b * We need to mak
a810: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 e sure that the
a820: 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e channel works in
a830: 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65 binary (for the
a840: 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69 . * encrypti
a850: 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f on not to get go
a860: 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a ofed up).. *
a870: 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f We only want to
a880: 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66 adjust the buff
a890: 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 ering in pre-v2
a8a0: 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a channels, where.
a8b0: 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e * each chan
a8c0: 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b nel in the stack
a8d0: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20 maintained its
a8e0: 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20 own buffers..
a8f0: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 */. Tcl_DSt
a900: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
a910: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
a920: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 n);. Tcl_DStr
a930: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
a940: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a annelBlocking);.
a950: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
a960: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
a970: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 lEOFChar);. T
a980: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
a990: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
a9a0: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 ding);. Tcl_G
a9b0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
a9c0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
a9d0: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 eofchar", &upper
a9e0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
a9f0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
aa00: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
aa10: 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 , chan, "-encodi
aa20: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e ng", &upperChann
aa30: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 elEncoding);.
aa40: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
aa50: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
aa60: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f an, "-translatio
aa70: 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 n", &upperChanne
aa80: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 lTranslation);.
aa90: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
aaa0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
aab0: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 chan, "-blocking
aac0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
aad0: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 Blocking);. T
aae0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
aaf0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
ab00: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
ab10: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 , "binary");.
ab20: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
ab30: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
ab40: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c an, "-blocking",
ab50: 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 "true");. dp
ab60: 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 rintf("Consuming
ab70: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 Tcl channel %s"
ab80: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
ab90: 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 Name(chan));.
aba0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 statePtr->self
abb0: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e = Tcl_StackChann
abc0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 el(interp, Tls_C
abd0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 hannelType(), (C
abe0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
abf0: 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 Ptr, (TCL_READAB
ac00: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c LE | TCL_WRITABL
ac10: 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 E), chan);. d
ac20: 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 printf("Created
ac30: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 channel named %s
ac40: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
ac50: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
ac60: 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 self));. if (
ac70: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
ac80: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
ac90: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 NULL) {../*.. *
aca0: 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 No use of Tcl_Ev
acb0: 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 entuallyFree bec
acc0: 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 ause no possible
acd0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 Tcl_Preserve...
ace0: 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 */..Tls_Free((c
acf0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
ad00: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
ad10: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
ad20: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
ad30: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
ad40: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 tePtr->self, "-t
ad50: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c ranslation", Tcl
ad60: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
ad70: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
ad80: 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 lation));. Tc
ad90: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
ada0: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 on(interp, state
adb0: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 Ptr->self, "-enc
adc0: 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 oding", Tcl_DStr
add0: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 ingValue(&upperC
ade0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 hannelEncoding))
adf0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
ae00: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
ae10: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
ae20: 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 f, "-eofchar", T
ae30: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
ae40: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
ae50: 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f Char));. Tcl_
ae60: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
ae70: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
ae80: 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b r->self, "-block
ae90: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e ing", Tcl_DStrin
aea0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
aeb0: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a nnelBlocking));.
aec0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 . /*. * S
aed0: 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f SL Initializatio
aee0: 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 n. */. st
aef0: 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 atePtr->ssl = SS
af00: 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e L_new(statePtr->
af10: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 ctx);. if (!s
af20: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a tatePtr->ssl) {.
af30: 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 ./* SSL library
af40: 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 error */..Tcl_Ap
af50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
af60: 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e p, "couldn't con
af70: 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 struct ssl sessi
af80: 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c on: ", REASON(),
af90: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
afa0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
afb0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
afc0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
afd0: 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22 "INIT", "FAILED"
afe0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
aff0: 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 ;..Tls_Free((cha
b000: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
b010: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
b020: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
b030: 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 Set host server
b040: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 name */. if
b050: 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 (servername) {..
b060: 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76 /* Sets the serv
b070: 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 er name indicati
b080: 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 on (SNI) in Clie
b090: 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f ntHello extensio
b0a0: 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 n */../* Per RFC
b0b0: 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 6066, hostname
b0c0: 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 is a ASCII encod
b0d0: 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 ed string, thoug
b0e0: 68 20 52 46 43 20 34 33 36 36 20 73 61 79 73 20 h RFC 4366 says
b0f0: 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 UTF-8. */..if (!
b100: 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 SSL_set_tlsext_h
b110: 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 ost_name(statePt
b120: 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 r->ssl, serverna
b130: 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20 me) && require)
b140: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
b150: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
b160: 22 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f 73 "setting TLS hos
b170: 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e t name extension
b180: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 failed", (char
b190: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b1a0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
b1b0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
b1c0: 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 IMPORT", "SNI",
b1d0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
b1e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b1f0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
b200: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
b210: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
b220: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 R;..}.../* Set h
b230: 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 ostname for peer
b240: 20 63 65 72 74 69 66 69 63 61 74 65 20 68 6f 73 certificate hos
b250: 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 69 tname verificati
b260: 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 on in clients...
b270: 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c Don't use SSL
b280: 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 _set1_host since
b290: 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 it has limitati
b2a0: 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 ons. */..if (!SS
b2b0: 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 L_add1_host(stat
b2c0: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 ePtr->ssl, serve
b2d0: 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 rname)) {.. T
b2e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
b2f0: 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 interp, "setting
b300: 20 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66 DNS host name f
b310: 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 ailed", (char *)
b320: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c NULL);.. Tcl
b330: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
b340: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
b350: 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 PORT", "HOSTNAME
b360: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
b370: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b380: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
b390: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
b3a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
b3b0: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a RROR;..}. }..
b3c0: 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 /* Resume se
b3d0: 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 ssion id */.
b3e0: 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 if (session_id &
b3f0: 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e & strlen(session
b400: 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f _id) <= SSL_MAX_
b410: 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 SID_CTX_LENGTH)
b420: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 {../* SSL_set_se
b430: 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 ssion() */..if (
b440: 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 !SSL_SESSION_set
b450: 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 1_id_context(SSL
b460: 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 _get_session(sta
b470: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73 tePtr->ssl), ses
b480: 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e sion_id, (unsign
b490: 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 ed int) strlen(s
b4a0: 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 ession_id))) {..
b4b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
b4c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 sult(interp, "Re
b4d0: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 sume session id
b4e0: 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 22 ", session_id, "
b4f0: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 failed", (char
b500: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b510: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
b520: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
b530: 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f IMPORT", "SESSIO
b540: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 N", "FAILED", (c
b550: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
b560: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
b570: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
b580: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
b590: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
b5a0: 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 . /* Enable A
b5b0: 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 pplication-Layer
b5c0: 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 Protocol Negoti
b5d0: 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 ation. Examples
b5e0: 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 are: http/1.0,..
b5f0: 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 http/1.1, h2, h3
b600: 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 , ftp, imap, pop
b610: 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 3, xmpp-client,
b620: 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 xmpp-server, mqt
b630: 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a t, irc, etc. */.
b640: 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a if (alpn) {.
b650: 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43 ./* Convert a TC
b660: 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 L list into a pr
b670: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 otocol-list in w
b680: 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 ire-format */..u
b690: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 nsigned char *pr
b6a0: 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 otos, *p;..unsig
b6b0: 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c ned int protos_l
b6c0: 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a en = 0;..Tcl_Siz
b6d0: 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a e cnt, i;..int j
b6e0: 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 ;..Tcl_Obj **lis
b6f0: 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 t;...if (Tcl_Lis
b700: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 tObjGetElements(
b710: 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 interp, alpn, &c
b720: 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43 nt, &list) != TC
b730: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 L_OK) {.. Tls
b740: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
b750: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
b760: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
b770: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 ..}.../* Determi
b780: 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 ne the memory re
b790: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 quired for the p
b7a0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a rotocol-list */.
b7b0: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c .for (i = 0; i <
b7c0: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 cnt; i++) {..
b7d0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 Tcl_GetStringF
b7e0: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 romObj(list[i],
b7f0: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 &len);.. if (
b800: 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 len > 255) {...T
b810: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
b820: 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 interp, "ALPN pr
b830: 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20 otocol name too
b840: 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 long", (char *)
b850: 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 NULL);...Tcl_Set
b860: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
b870: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
b880: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c ", "ALPN", "FAIL
b890: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
b8a0: 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 LL);...Tls_Free(
b8b0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
b8c0: 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c r);...return TCL
b8d0: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 _ERROR;.. }..
b8e0: 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b protos_len +
b8f0: 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e 3b = 1 + (int) len;
b900: 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 ..}.../* Build t
b910: 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 he complete prot
b920: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 ocol-list */..pr
b930: 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 otos = ckalloc(p
b940: 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 rotos_len);../*
b950: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 protocol-lists c
b960: 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20 onsist of 8-bit
b970: 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c length-prefixed,
b980: 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f byte strings */
b990: 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70 20 ..for (j = 0, p
b9a0: 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e = protos; j < cn
b9b0: 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 63 t; j++) {.. c
b9c0: 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 har *str = Tcl_G
b9d0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
b9e0: 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a list[j], &len);.
b9f0: 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 . *p++ = (uns
ba00: 69 67 6e 65 64 20 63 68 61 72 29 20 6c 65 6e 3b igned char) len;
ba10: 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 .. memcpy(p,
ba20: 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 str, (size_t) le
ba30: 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 n);.. p += le
ba40: 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 n;..}.../* SSL_s
ba50: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d et_alpn_protos m
ba60: 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 akes a copy of t
ba70: 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 he protocol-list
ba80: 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 */../* Note: Th
ba90: 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 is functions rev
baa0: 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72 6e erses the return
bab0: 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f value conventio
bac0: 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 n */..if (SSL_se
bad0: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 t_alpn_protos(st
bae0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f atePtr->ssl, pro
baf0: 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 tos, protos_len)
bb00: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
bb10: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
bb20: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73 65 74 , "failed to set
bb30: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 22 ALPN protocols"
bb40: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
bb50: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
bb60: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
bb70: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
bb80: 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 "ALPN", "FAILED
bb90: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
bba0: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 );.. Tls_Free
bbb0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
bbc0: 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 tr);.. ckfree
bbd0: 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 (protos);.. r
bbe0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
bbf0: 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 ..}.../* Store p
bc00: 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f rotocols list */
bc10: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
bc20: 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 os = protos;..st
bc30: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c atePtr->protos_l
bc40: 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b en = protos_len;
bc50: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 . } else {..s
bc60: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
bc70: 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 = NULL;..statePt
bc80: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 r->protos_len =
bc90: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0;. }.. /*
bca0: 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c . * SSL Call
bcb0: 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 backs. */.
bcc0: 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 SSL_set_app_da
bcd0: 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ta(statePtr->ssl
bce0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
bcf0: 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 tr);./* point ba
bd00: 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 ck to us */.
bd10: 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 SSL_set_verify(s
bd20: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 tatePtr->ssl, ve
bd30: 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c rify, VerifyCall
bd40: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 back);. SSL_s
bd50: 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b et_info_callback
bd60: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
bd70: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a InfoCallback);..
bd80: 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 /* Callback
bd90: 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72 for observing pr
bda0: 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 otocol messages
bdb0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 */.#ifndef OPENS
bdc0: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a SL_NO_SSL_TRACE.
bdd0: 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f /* void SSL_
bde0: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c CTX_set_msg_call
bdf0: 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 back_arg(statePt
be00: 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 r->ctx, (void *)
be10: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76 statePtr);. v
be20: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f oid SSL_CTX_set_
be30: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 msg_callback(sta
be40: 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 tePtr->ctx, Mess
be50: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f ageCallback); */
be60: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 . SSL_set_msg
be70: 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 _callback_arg(st
be80: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f atePtr->ssl, (vo
be90: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
bea0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f SSL_set_msg_
beb0: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
bec0: 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 r->ssl, MessageC
bed0: 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 allback);.#endif
bee0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
bef0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 Tcl_Channel BIO
bf00: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 Handler */. s
bf10: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d tatePtr->p_bio.=
bf20: 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 BIO_new_tcl(sta
bf30: 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f tePtr, BIO_NOCLO
bf40: 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 SE);. statePt
bf50: 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 r->bio.= BIO_new
bf60: 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a (BIO_f_ssl());..
bf70: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20 if (server)
bf80: 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c {../* Server cal
bf90: 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 lbacks */..SSL_C
bfa0: 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 TX_set_tlsext_se
bfb0: 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 rvername_arg(sta
bfc0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 tePtr->ctx, (voi
bfd0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 d *)statePtr);..
bfe0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 SSL_CTX_set_tlse
bff0: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 xt_servername_ca
c000: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d llback(statePtr-
c010: 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 >ctx, SNICallbac
c020: 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 k);..SSL_CTX_set
c030: 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 _client_hello_cb
c040: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c050: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 HelloCallback, (
c060: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
c070: 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d ;..if (statePtr-
c080: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 >protos != NULL)
c090: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f {.. SSL_CTX_
c0a0: 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f set_alpn_select_
c0b0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 cb(statePtr->ctx
c0c0: 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 , ALPNCallback,
c0d0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
c0e0: 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 );.#ifdef USE_NP
c0f0: 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f N.. if (tls1_
c100: 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 2 == 0 && tls1_3
c110: 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 == 0) {...SSL_C
c120: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 TX_set_next_prot
c130: 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62 os_advertised_cb
c140: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c150: 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f NPNCallback, (vo
c160: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
c170: 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d . }.#endif..}
c180: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 .../* Enable ser
c190: 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74 ver to send cert
c1a0: 20 72 65 71 75 65 73 74 20 61 66 74 65 72 20 68 request after h
c1b0: 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e andshake (TLS 1.
c1c0: 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 3 only) */../* A
c1d0: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e write operation
c1e0: 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65 must take place
c1f0: 20 66 6f 72 20 74 68 65 20 43 65 72 74 69 66 69 for the Certifi
c200: 63 61 74 65 20 52 65 71 75 65 73 74 20 74 6f 20 cate Request to
c210: 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74 be.. sent to t
c220: 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 he client, this
c230: 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68 can be done with
c240: 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b SSL_do_handshak
c250: 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 e(). */..if (req
c260: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e uest && post_han
c270: 64 73 68 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 dshake && tls1_3
c280: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 ) {.. SSL_ver
c290: 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f ify_client_post_
c2a0: 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 handshake(stateP
c2b0: 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f tr->ssl);..}.../
c2c0: 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 * set automatic
c2d0: 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 curve selection
c2e0: 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 */..SSL_set_ecdh
c2f0: 5f 61 75 74 6f 28 73 74 61 74 65 50 74 72 2d 3e _auto(statePtr->
c300: 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 ssl, 1);.../* Se
c310: 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f t server mode */
c320: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
c330: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 s |= TLS_TCL_SER
c340: 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 VER;..SSL_set_ac
c350: 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 cept_state(state
c360: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
c370: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 else {../* Clie
c380: 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a nt callbacks */.
c390: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 #ifdef USE_NPN..
c3a0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 if (statePtr->pr
c3b0: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 otos != NULL &&
c3c0: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 tls1_2 == 0 && t
c3d0: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 ls1_3 == 0) {..
c3e0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e SSL_CTX_set_n
c3f0: 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 ext_proto_select
c400: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
c410: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c x, ALPNCallback,
c420: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
c430: 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 r);..}.#endif...
c440: 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69 /* Session cachi
c450: 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 ng */..SSL_CTX_s
c460: 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 et_session_cache
c470: 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e _mode(statePtr->
c480: 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 ctx, SSL_SESS_CA
c490: 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c CHE_CLIENT | SSL
c4a0: 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 _SESS_CACHE_NO_I
c4b0: 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a NTERNAL_STORE);.
c4c0: 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 .SSL_CTX_sess_se
c4d0: 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 t_new_cb(statePt
c4e0: 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 r->ctx, SessionC
c4f0: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 allback);.../* E
c500: 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 nable post hands
c510: 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74 hake Authenticat
c520: 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 ion extension. T
c530: 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 LS 1.3 only, not
c540: 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 http/2. */..if
c550: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 (request && post
c560: 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 _handshake) {..
c570: 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f SSL_set_post_
c580: 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73 handshake_auth(s
c590: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 tatePtr->ssl, 1)
c5a0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c ;..}.../* Set cl
c5b0: 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 ient mode */..SS
c5c0: 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 L_set_connect_st
c5d0: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ate(statePtr->ss
c5e0: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 l);. }. SS
c5f0: 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 L_set_bio(stateP
c600: 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 tr->ssl, statePt
c610: 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 r->p_bio, stateP
c620: 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 tr->p_bio);.
c630: 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 BIO_set_ssl(stat
c640: 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 ePtr->bio, state
c650: 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f Ptr->ssl, BIO_NO
c660: 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a CLOSE);.. /*.
c670: 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 * End of SS
c680: 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 L Init. */.
c690: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
c6a0: 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 rning %s", Tcl_G
c6b0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
c6c0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a atePtr->self));.
c6d0: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
c6e0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 t(interp, (char
c6f0: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *) Tcl_GetChanne
c700: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
c710: 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 self), TCL_VOLAT
c720: 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 ILE);.. retur
c730: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e n TCL_OK;..clien
c740: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
c750: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ta;.}.../*. *---
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 2d 2d 2d 2d 2d 2d 2d ----------------
c7a0: 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f . *. * UnimportO
c7b0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 bjCmd --. *. *.T
c7c0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
c7d0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f invoked to remo
c7e0: 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 ve the topmost c
c7f0: 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 hannel filter..
c800: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
c810: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
c820: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
c830: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d de effects:. *.M
c840: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 ay modify the be
c850: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 havior of an IO
c860: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d channel.. *. *--
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 2d 2d 2d 2d 2d 2d ----------------
c8b0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
c8c0: 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 .UnimportObjCmd(
c8d0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
c8e0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
c8f0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
c900: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
c910: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
c920: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
c930: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e an;../* The chan
c940: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
c950: 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 e on. */.. dp
c960: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
c970: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
c980: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
c990: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
c9a0: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
c9b0: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 el");..return TC
c9c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
c9d0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
c9e0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
c9f0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 , Tcl_GetString(
ca00: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b objv[1]), NULL);
ca10: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
ca20: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
ca30: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
ca40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
ca50: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
ca60: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
ca70: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
ca80: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
ca90: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
caa0: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 nel(chan);..
cab0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
cac0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
cad0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
cae0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
caf0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
cb00: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
cb10: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
cb20: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
cb30: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
cb40: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 nel", NULL);..
cb50: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
cb60: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
cb70: 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 , "UNIMPORT", "C
cb80: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
cb90: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
cba0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
cbb0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
cbc0: 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 if (Tcl_Unstac
cbd0: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c kChannel(interp,
cbe0: 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 chan) == TCL_ER
cbf0: 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ROR) {..return T
cc00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
cc10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
cc20: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 OK;..clientData
cc30: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a = clientData;.}.
cc40: 0c 0a 2f 2a 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
cc90: 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e CTX_Init -- con
cca0: 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 struct a SSL_CTX
ccb0: 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 instance. *. *
ccc0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 Results:. *.A va
ccd0: 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 lid SSL_CTX inst
cce0: 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a ance or NULL.. *
ccf0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
cd00: 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 :. *.constructs
cd10: 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 SSL context (CTX
cd20: 29 0a 20 2a 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
cd70: 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a tatic SSL_CTX *.
cd80: 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a CTX_Init(State *
cd90: 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 statePtr, int is
cda0: 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 Server, int prot
cdb0: 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 o, char *keyfile
cdc0: 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 , char *certfile
cdd0: 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ,. unsigned c
cde0: 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e har *key, unsign
cdf0: 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69 ed char *cert, i
ce00: 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 nt key_len, int
ce10: 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a cert_len, char *
ce20: 43 41 64 69 72 2c 0a 20 20 20 20 63 68 61 72 20 CAdir,. char
ce30: 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 *CAfile, char *c
ce40: 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 iphers, char *ci
ce50: 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 phersuites, int
ce60: 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 level, char *DHp
ce70: 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c arams) {. Tcl
ce80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 _Interp *interp
ce90: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
cea0: 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 rp;. SSL_CTX
ceb0: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *ctx = NULL;.
cec0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b Tcl_DString ds;
ced0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
cee0: 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 ds1;. int of
cef0: 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c f = 0;. int l
cf00: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b oad_private_key;
cf10: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d . const SSL_M
cf20: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a ETHOD *method;..
cf30: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
cf40: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
cf50: 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 !proto) {..Tcl_A
cf60: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
cf70: 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 rp, "no valid pr
cf80: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 otocol selected"
cf90: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
cfa0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
cfb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 }.. /* cr
cfc0: 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 eate SSL context
cfd0: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f */.#if OPENSSL_
cfe0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e VERSION_NUMBER >
cff0: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c = 0x10100000L ||
d000: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 defined(NO_SSL2
d010: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
d020: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 NSSL_NO_SSL2).
d030: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
d040: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 oto, TLS_PROTO_S
d050: 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 SL2)) {..Tcl_App
d060: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
d070: 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c , "SSL2 protocol
d080: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
d090: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d0a0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
d0b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
d0c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
d0d0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
d0e0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 SSL_NO_SSL3).
d0f0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
d100: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 to, TLS_PROTO_SS
d110: 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 L3)) {..Tcl_Appe
d120: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
d130: 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 "SSL3 protocol
d140: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
d150: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
d160: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
d170: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 }.#endif.#if d
d180: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
d190: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
d1a0: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 SL_NO_TLS1).
d1b0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
d1c0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
d1d0: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 1)) {..Tcl_Appen
d1e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
d1f0: 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f "TLS 1.0 protoco
d200: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
d210: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
d220: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
d230: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
d240: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
d250: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
d260: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
d270: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
d280: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
d290: 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 TO_TLS1_1)) {..T
d2a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d2b0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 interp, "TLS 1.1
d2c0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
d2d0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
d2e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
d2f0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
d300: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
d310: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 (NO_TLS1_2) || d
d320: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d330: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 O_TLS1_2). if
d340: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
d350: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
d360: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 2)) {..Tcl_Appen
d370: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
d380: 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f "TLS 1.2 protoco
d390: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
d3a0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
d3b0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
d3c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
d3d0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
d3e0: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _3) || defined(O
d3f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
d400: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
d410: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
d420: 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 TO_TLS1_3)) {..T
d430: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d440: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 interp, "TLS 1.3
d450: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
d460: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
d470: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
d480: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
d490: 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f ndif. if (pro
d4a0: 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 to == 0) {../* U
d4b0: 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f se full range */
d4c0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 ..SSL_CTX_set_mi
d4d0: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 n_proto_version(
d4e0: 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 ctx, 0);..SSL_CT
d4f0: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f X_set_max_proto_
d500: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b version(ctx, 0);
d510: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 . }.. swit
d520: 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 ch (proto) {.#if
d530: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
d540: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
d550: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 0000L && !define
d560: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 d(NO_SSL2) && !d
d570: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d580: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 O_SSL2). case
d590: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a TLS_PROTO_SSL2:
d5a0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
d5b0: 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 ver ? SSLv2_serv
d5c0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 er_method() : SS
d5d0: 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f Lv2_client_metho
d5e0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
d5f0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
d600: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 (NO_SSL3) && !de
d610: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d620: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
d630: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
d640: 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 L3_METHOD). c
d650: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 ase TLS_PROTO_SS
d660: 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 L3:..method = is
d670: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 Server ? SSLv3_s
d680: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
d690: 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 SSLv3_client_me
d6a0: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
d6b0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
d6c0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 ned(NO_TLS1) &&
d6d0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
d6e0: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 _NO_TLS1) && !de
d6f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d700: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 _TLS1_METHOD).
d710: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
d720: 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d _TLS1:..method =
d730: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
d740: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 1_server_method(
d750: 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 ) : TLSv1_client
d760: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
d770: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
d780: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
d790: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d7a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
d7b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d7c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d NSSL_NO_TLS1_1_M
d7d0: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 ETHOD). case
d7e0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
d7f0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 :..method = isSe
d800: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 rver ? TLSv1_1_s
d810: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
d820: 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f TLSv1_1_client_
d830: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
d840: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
d850: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
d860: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d870: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 NSSL_NO_TLS1_2)
d880: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
d890: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 SSL_NO_TLS1_2_ME
d8a0: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 THOD). case T
d8b0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a LS_PROTO_TLS1_2:
d8c0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
d8d0: 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 ver ? TLSv1_2_se
d8e0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 rver_method() :
d8f0: 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d TLSv1_2_client_m
d900: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
d910: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
d920: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
d930: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
d940: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
d950: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
d960: 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 O_TLS1_3:../* Us
d970: 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 e the generic me
d980: 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 thod and constra
d990: 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 int range after
d9a0: 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 context is creat
d9b0: 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 ed */..method =
d9c0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 isServer ? TLS_s
d9d0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
d9e0: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 TLS_client_meth
d9f0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
da00: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 ndif. default
da10: 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 :../* Negotiate
da20: 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c highest availabl
da30: 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f e SSL/TLS versio
da40: 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 n */..method = i
da50: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 sServer ? TLS_se
da60: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 rver_method() :
da70: 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f TLS_client_metho
da80: 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c d();.#if OPENSSL
da90: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
daa0: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 < 0x10100000L &&
dab0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
dac0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
dad0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
dae0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
daf0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
db00: 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 O_SSL2) ? 0 :
db10: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 SSL_OP_NO_SSLv2)
db20: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
db30: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
db40: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
db50: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 SL_NO_SSL3)..off
db60: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f |= (ENABLED(pro
db70: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 to, TLS_PROTO_SS
db80: 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f L3) ? 0 : SSL_
db90: 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 OP_NO_SSLv3);.#e
dba0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
dbb0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 d(NO_TLS1) && !d
dbc0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
dbd0: 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 O_TLS1)..off |=
dbe0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
dbf0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 TLS_PROTO_TLS1)
dc00: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ? 0 : SSL_OP_N
dc10: 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 O_TLSv1);.#endif
dc20: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
dc30: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
dc40: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
dc50: 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 TLS1_1)..off |=
dc60: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
dc70: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
dc80: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ) ? 0 : SSL_OP_N
dc90: 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 O_TLSv1_1);.#end
dca0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
dcb0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
dcc0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
dcd0: 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c O_TLS1_2)..off |
dce0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
dcf0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
dd00: 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 _2) ? 0 : SSL_OP
dd10: 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 _NO_TLSv1_2);.#e
dd20: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
dd30: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 d(NO_TLS1_3) &&
dd40: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
dd50: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 _NO_TLS1_3)..off
dd60: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f |= (ENABLED(pro
dd70: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
dd80: 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f S1_3) ? 0 : SSL_
dd90: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a OP_NO_TLSv1_3);.
dda0: 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 #endif..break;.
ddb0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
ddc0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
ddd0: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ctx = SSL_CTX_
dde0: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 new(method);.
ddf0: 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 if (!ctx) {..re
de00: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 turn(NULL);.
de10: 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e }.. if (geten
de20: 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 v(SSLKEYLOGFILE)
de30: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 ) {..SSL_CTX_set
de40: 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b _keylog_callback
de50: 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c (ctx, KeyLogCall
de60: 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 back);. }..#i
de70: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
de80: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
de90: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
dea0: 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 1_3). if (pro
deb0: 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f to == TLS_PROTO_
dec0: 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 TLS1_3) {..SSL_C
ded0: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f TX_set_min_proto
dee0: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
def0: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 S1_3_VERSION);..
df00: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f SSL_CTX_set_max_
df10: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
df20: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f x, TLS1_3_VERSIO
df30: 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 N);. }.#endif
df40: 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 .. /* Force c
df50: 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 ipher selection
df60: 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20 order by server
df70: 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 */. if (!isSe
df80: 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 rver) {..SSL_CTX
df90: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 _set_options(ctx
dfa0: 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f , SSL_OP_CIPHER_
dfb0: 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 SERVER_PREFERENC
dfc0: 45 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f E);. }..#if O
dfd0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
dfe0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
dff0: 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 00L. OpenSSL_
e000: 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 add_all_algorith
e010: 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 ms(); /* Load ci
e020: 70 68 65 72 73 20 61 6e 64 20 64 69 67 65 73 74 phers and digest
e030: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 s */.#endif..
e040: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 SSL_CTX_set_app
e050: 5f 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 _data(ctx, (void
e060: 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 *)interp);./* re
e070: 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 member the inter
e080: 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 preter */. SS
e090: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e L_CTX_set_option
e0a0: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c s(ctx, SSL_OP_AL
e0b0: 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 L);./* all SSL b
e0c0: 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a ug workarounds *
e0d0: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 /. SSL_CTX_se
e0e0: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 t_options(ctx, S
e0f0: 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 SL_OP_NO_COMPRES
e100: 53 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 6c SION);./* disabl
e110: 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 e compression ev
e120: 65 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 en if supported
e130: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
e140: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
e150: 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c off);../* disabl
e160: 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 e protocol versi
e170: 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 ons */.#if OPENS
e180: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
e190: 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a R < 0x10101000L.
e1a0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
e1b0: 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f mode(ctx, SSL_MO
e1c0: 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 DE_AUTO_RETRY);.
e1d0: 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 /* handle new ha
e1e0: 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b ndshakes in back
e1f0: 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65 ground. On by de
e200: 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c fault in OpenSSL
e210: 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 1.1.1. */.#endi
e220: 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 f. SSL_CTX_se
e230: 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a ss_set_cache_siz
e240: 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 e(ctx, 128);..
e250: 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 /* Set user de
e260: 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 fined ciphers, c
e270: 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e ipher suites, an
e280: 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c d security level
e290: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 */. if ((cip
e2a0: 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 hers != NULL) &&
e2b0: 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 !SSL_CTX_set_ci
e2c0: 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 pher_list(ctx, c
e2d0: 69 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f iphers)) {..Tcl_
e2e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
e2f0: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 erp, "Set cipher
e300: 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c s failed: No val
e310: 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 id ciphers", (ch
e320: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 ar *) NULL);..SS
e330: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
e340: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
e350: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 }. if ((ci
e360: 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 phersuites != NU
e370: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f LL) && !SSL_CTX_
e380: 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 set_ciphersuites
e390: 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 (ctx, ciphersuit
e3a0: 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 es)) {..Tcl_Appe
e3b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
e3c0: 20 22 53 65 74 20 63 69 70 68 65 72 20 73 75 69 "Set cipher sui
e3d0: 74 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 tes failed: No v
e3e0: 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 alid ciphers", (
e3f0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
e400: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
e410: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
e420: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
e430: 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 et security leve
e440: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 l */. if (lev
e450: 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c el > -1 && level
e460: 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f < 6) {../* SSL_
e470: 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 set_security_lev
e480: 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 el */..SSL_CTX_s
e490: 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 et_security_leve
e4a0: 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 l(ctx, level);.
e4b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 }.. /* set
e4c0: 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 some callbacks
e4d0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
e4e0: 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 et_default_passw
e4f0: 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f d_cb(ctx, Passwo
e500: 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 rdCallback);.
e510: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 SSL_CTX_set_def
e520: 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 ault_passwd_cb_u
e530: 73 65 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f serdata(ctx, (vo
e540: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
e550: 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 . /* read a D
e560: 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 iffie-Hellman pa
e570: 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f rameters file, o
e580: 72 20 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d r use the built-
e590: 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 in one */.#ifdef
e5a0: 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 OPENSSL_NO_DH.
e5b0: 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 if (DHparams
e5c0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f != NULL) {..Tcl_
e5d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
e5e0: 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74 erp, "DH paramet
e5f0: 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 er support not a
e600: 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 vailable", (char
e610: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f *) NULL);..SSL_
e620: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
e630: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
e640: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 }.#else. {..
e650: 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 DH* dh;..if (DHp
e660: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b arams != NULL) {
e670: 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a .. BIO *bio;.
e680: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
e690: 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20 Init(&ds);..
e6a0: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 bio = BIO_new_fi
e6b0: 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c le(F2N(DHparams,
e6c0: 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 &ds), "r");..
e6d0: 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 if (!bio) {...
e6e0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
e6f0: 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 &ds);...Tcl_Appe
e700: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
e710: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 "Could not find
e720: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 DH parameters f
e730: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ile", (char *) N
e740: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
e750: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
e760: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
e770: 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f ... dh = PEM_
e780: 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d read_bio_DHparam
e790: 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c s(bio, NULL, NUL
e7a0: 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 L, NULL);.. B
e7b0: 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 IO_free(bio);..
e7c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
e7d0: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 ee(&ds);.. if
e7e0: 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 (!dh) {...Tcl_A
e7f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
e800: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 rp, "Could not r
e810: 65 61 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 ead DH parameter
e820: 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 s from file", (c
e830: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
e840: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
e850: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
e860: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 53 53 ;.. }.. SS
e870: 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 L_CTX_set_tmp_dh
e880: 28 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 20 (ctx, dh);..
e890: 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 0a 09 7d DH_free(dh);...}
e8a0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20 else {.. /*
e8b0: 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 Use well known D
e8c0: 48 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 H parameters tha
e8d0: 74 20 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20 t have built-in
e8e0: 73 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53 support in OpenS
e8f0: 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21 SL */.. if (!
e900: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61 SSL_CTX_set_dh_a
e910: 75 74 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09 uto(ctx, 1)) {..
e920: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
e930: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 t(interp, "Could
e940: 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20 not enable set
e950: 44 48 20 61 75 74 6f 3a 20 22 2c 20 52 45 41 53 DH auto: ", REAS
e960: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
e970: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
e980: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
e990: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
e9a0: 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 ..}. }.#endif
e9b0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 .. /* set our
e9c0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
e9d0: 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 load_private
e9e0: 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 _key = 0;. if
e9f0: 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 (certfile != NU
ea00: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 LL) {..load_priv
ea10: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 ate_key = 1;...T
ea20: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
ea30: 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 ds);...if (SSL_C
ea40: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 TX_use_certifica
ea50: 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e te_file(ctx, F2N
ea60: 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c (certfile, &ds),
ea70: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 SSL_FILETYPE_PE
ea80: 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 M) <= 0) {..
ea90: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
eaa0: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 &ds);.. Tcl_A
eab0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
eac0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
ead0: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 et certificate f
eae0: 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c ile ", certfile,
eaf0: 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 ": ",.... R
eb00: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
eb10: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 ) NULL);.. SS
eb20: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
eb30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
eb40: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 L;..}. } else
eb50: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c if (cert != NUL
eb60: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 L) {..load_priva
eb70: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 te_key = 1;..if
eb80: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 (SSL_CTX_use_cer
eb90: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 tificate_ASN1(ct
eba0: 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 x, cert_len, cer
ebb0: 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 t) <= 0) {..
ebc0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
ebd0: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 &ds);.. Tcl_A
ebe0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
ebf0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
ec00: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 et certificate:
ec10: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f ",.... REASO
ec20: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
ec30: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
ec40: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
ec50: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 return NULL;..
ec60: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 }. } else {..
ec70: 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72 certfile = (char
ec80: 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 *)X509_get_defau
ec90: 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a lt_cert_file();.
eca0: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 ..if (SSL_CTX_us
ecb0: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 e_certificate_fi
ecc0: 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65 le(ctx, certfile
ecd0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 , SSL_FILETYPE_P
ece0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 EM) <= 0) {.#if
ecf0: 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 0.. Tcl_DStri
ed00: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 ngFree(&ds);..
ed10: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
ed20: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 lt(interp, "unab
ed30: 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c le to use defaul
ed40: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 t certificate fi
ed50: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 le ", certfile,
ed60: 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 ": ",.... RE
ed70: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
ed80: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
ed90: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
eda0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
edb0: 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 ;.#endif..}.
edc0: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 }.. /* set ou
edd0: 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f r private key */
ede0: 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 . if (load_pr
edf0: 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 ivate_key) {..if
ee00: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c (keyfile == NUL
ee10: 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c L && key == NULL
ee20: 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 ) {.. keyfile
ee30: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a = certfile;..}.
ee40: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d ..if (keyfile !=
ee50: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a NULL) {.. /*
ee60: 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 get the private
ee70: 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 key associated
ee80: 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 with this certif
ee90: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 icate */.. if
eea0: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c (keyfile == NUL
eeb0: 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d L) {...keyfile =
eec0: 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 certfile;..
eed0: 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f }... if (SSL_
eee0: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b CTX_use_PrivateK
eef0: 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e ey_file(ctx, F2N
ef00: 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 (keyfile, &ds),
ef10: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
ef20: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f ) <= 0) {...Tcl_
ef30: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
ef40: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 ;.../* flush the
ef50: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 passphrase whic
ef60: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 h might be left
ef70: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f in the result */
ef80: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
ef90: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 (interp, NULL, T
efa0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 CL_STATIC);...Tc
efb0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
efc0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
efd0: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 o set public key
efe0: 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 file ", keyfile
eff0: 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20 20 , " ",....
f000: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 REASON(), (ch
f010: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
f020: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f030: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
f040: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
f050: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
f060: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 );...} else if (
f070: 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 key != NULL) {..
f080: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f if (SSL_CTX_
f090: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 use_PrivateKey_A
f0a0: 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 SN1(EVP_PKEY_RSA
f0b0: 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c , ctx, key,key_l
f0c0: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 en) <= 0) {...Tc
f0d0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
f0e0: 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 s);.../* flush t
f0f0: 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 he passphrase wh
f100: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 ich might be lef
f110: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 t in the result
f120: 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 */...Tcl_SetResu
f130: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c lt(interp, NULL,
f140: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 TCL_STATIC);...
f150: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
f160: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
f170: 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b to set public k
f180: 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c ey: ", REASON(),
f190: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
f1a0: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
f1b0: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e ctx);...return N
f1c0: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 ULL;.. }..}..
f1d0: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 /* Now we know t
f1e0: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 hat a key and ce
f1f0: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 rt have been set
f200: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 against.. * the
f210: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
f220: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 .if (!SSL_CTX_ch
f230: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 eck_private_key(
f240: 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c ctx)) {.. Tcl
f250: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
f260: 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b terp, "private k
f270: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 ey does not matc
f280: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 h the certificat
f290: 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 e public key",..
f2a0: 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 .. (char *)
f2b0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
f2c0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
f2d0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
f2e0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
f2f0: 2a 20 53 65 74 20 76 65 72 69 66 69 63 61 74 69 * Set verificati
f300: 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 on CAs */. Tc
f310: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 l_DStringInit(&d
f320: 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 s);. Tcl_DStr
f330: 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 ingInit(&ds1);.
f340: 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6f /* There is o
f350: 6e 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 ne default direc
f360: 74 6f 72 79 2c 20 6f 6e 65 20 64 65 66 61 75 6c tory, one defaul
f370: 74 20 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 65 20 t file, and one
f380: 64 65 66 61 75 6c 74 20 73 74 6f 72 65 2e 0a 09 default store...
f390: 54 68 65 20 64 65 66 61 75 6c 74 20 43 41 20 63 The default CA c
f3a0: 65 72 74 69 66 69 63 61 74 65 73 20 64 69 72 65 ertificates dire
f3b0: 63 74 6f 72 79 20 28 61 6e 64 20 64 65 66 61 75 ctory (and defau
f3c0: 6c 74 20 73 74 6f 72 65 29 20 69 73 20 69 6e 20 lt store) is in
f3d0: 74 68 65 20 4f 70 65 6e 53 53 4c 0a 09 63 65 72 the OpenSSL..cer
f3e0: 74 73 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74 ts directory. It
f3f0: 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 can be overridd
f400: 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 en by the SSL_CE
f410: 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 RT_DIR env var.
f420: 54 68 65 0a 09 64 65 66 61 75 6c 74 20 43 41 20 The..default CA
f430: 63 65 72 74 69 66 69 63 61 74 65 73 20 66 69 6c certificates fil
f440: 65 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74 e is called cert
f450: 2e 70 65 6d 20 69 6e 20 74 68 65 20 64 65 66 61 .pem in the defa
f460: 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 09 64 69 72 ult OpenSSL..dir
f470: 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 62 ectory. It can b
f480: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 e overridden by
f490: 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c the SSL_CERT_FIL
f4a0: 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 09 2f E env var. */../
f4b0: 2a 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65 * int SSL_CTX_se
f4c0: 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 t_default_verify
f4d0: 5f 64 69 72 28 53 53 4c 5f 43 54 58 20 2a 63 74 _dir(SSL_CTX *ct
f4e0: 78 29 20 61 6e 64 20 69 6e 74 20 53 53 4c 5f 43 x) and int SSL_C
f4f0: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 TX_set_default_v
f500: 65 72 69 66 79 5f 66 69 6c 65 28 53 53 4c 5f 43 erify_file(SSL_C
f510: 54 58 20 2a 63 74 78 29 20 2a 2f 0a 20 20 20 20 TX *ctx) */.
f520: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 if (!SSL_CTX_loa
f530: 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f d_verify_locatio
f540: 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 ns(ctx, F2N(CAfi
f550: 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 le, &ds), F2N(CA
f560: 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 dir, &ds1)) ||..
f570: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 !SSL_CTX_set_def
f580: 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 ault_verify_path
f590: 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a s(ctx)) {.#if 0.
f5a0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
f5b0: 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 (&ds);..Tcl_DStr
f5c0: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 ingFree(&ds1);..
f5d0: 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 /* Don't current
f5e0: 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20 ly care if this
f5f0: 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 fails */..Tcl_Ap
f600: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f610: 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 p, "SSL default
f620: 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c verify paths: ",
f630: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
f640: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f *) NULL);..SSL_
f650: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
f660: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e return NULL;.#en
f670: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f dif. }.. /
f680: 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 * https://source
f690: 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f forge.net/p/tls/
f6a0: 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 20 bugs/57/ */.
f6b0: 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 /* XXX:TODO: Let
f6c0: 20 74 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 the user supply
f6d0: 20 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 values here ins
f6e0: 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e tead of somethin
f6f0: 67 20 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e g that exists on
f700: 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 the filesystem
f710: 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c */. if (CAfil
f720: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53 54 e != NULL) {..ST
f730: 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 ACK_OF(X509_NAME
f740: 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 ) *certNames = S
f750: 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 SL_load_client_C
f760: 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c A_file(F2N(CAfil
f770: 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 20 28 63 e, &ds));..if (c
f780: 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c ertNames != NULL
f790: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 ) {.. SSL_CTX
f7a0: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c _set_client_CA_l
f7b0: 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d ist(ctx, certNam
f7c0: 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 es);..}. }..
f7d0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
f7e0: 65 65 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c ee(&ds);. Tcl
f7f0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
f800: 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 1);. return c
f810: 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d tx;.}.../*. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f860: 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a . *. * StatusObj
f870: 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 Cmd -- return ce
f880: 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f rtificate for co
f890: 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a nnected peer.. *
f8a0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
f8b0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
f8c0: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
f8d0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
f8e0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
f930: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 .static int.Stat
f940: 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 usObjCmd(ClientD
f950: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
f960: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
f970: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
f980: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
f990: 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65 v[]) {. State
f9a0: 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 *statePtr;.
f9b0: 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 X509 *peer;.
f9c0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
f9d0: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
f9e0: 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 chan;. char
f9f0: 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 *channelName, *c
fa00: 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 iphers;. int
fa10: 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 mode;. const
fa20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
fa30: 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e roto;. unsign
fa40: 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 ed int len;.
fa50: 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 0a 20 int nid, res;..
fa60: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
fa70: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
fa80: 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 bjc < 2 || objc
fa90: 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 > 3 || (objc ==
faa0: 33 20 26 26 20 21 73 74 72 63 6d 70 28 54 63 6c 3 && !strcmp(Tcl
fab0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
fac0: 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 1]), "-local")))
fad0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
fae0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
faf0: 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 objv, "?-local?
fb00: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
fb10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
fb20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.. /* Get
fb30: 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 channel Id */.
fb40: 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 channelName =
fb50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
fb60: 6d 4f 62 6a 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 mObj(objv[(objc
fb70: 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d 2c 20 == 2 ? 1 : 2)],
fb80: 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c (Tcl_Size *) NUL
fb90: 4c 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 L);. chan = T
fba0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
fbb0: 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d terp, channelNam
fbc0: 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 e, &mode);. i
fbd0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
fbe0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
fbf0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
fc00: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
fc10: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
fc20: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
fc30: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
fc40: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
fc50: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
fc60: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c an);. if (Tcl
fc70: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
fc80: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
fc90: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
fca0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
fcb0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
fcc0: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
fcd0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
fce0: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 n),..."\": not a
fcf0: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
fd00: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 ULL);..Tcl_SetEr
fd10: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
fd20: 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c "TLS", "STATUS",
fd30: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
fd40: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
fd50: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
fd60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
fd70: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
fd80: 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 State *) Tcl_Get
fd90: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
fda0: 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 ata(chan);..
fdb0: 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61 /* Get certifica
fdc0: 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 te for peer or s
fdd0: 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f elf */. if (o
fde0: 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 bjc == 2) {..pee
fdf0: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 r = SSL_get_peer
fe00: 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 _certificate(sta
fe10: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
fe20: 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 } else {..peer
fe30: 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 = SSL_get_certif
fe40: 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e icate(statePtr->
fe50: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ssl);. }.
fe60: 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 74 /* Get X509 cert
fe70: 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a ificate info */.
fe80: 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a if (peer) {.
fe90: 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 .objPtr = Tls_Ne
fea0: 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c wX509Obj(interp,
feb0: 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a peer);..if (obj
fec0: 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 c == 2) {.. X
fed0: 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 509_free(peer);.
fee0: 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c . peer = NULL
fef0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
ff00: 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f {..objPtr = Tcl_
ff10: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
ff20: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 LL);. }..
ff30: 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a /* Peer name */.
ff40: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
ff50: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ff60: 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f "peername", SSL_
ff70: 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 get0_peername(st
ff80: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 atePtr->ssl), -1
ff90: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 );. LAPPEND_I
ffa0: 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
ffb0: 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f r, "sbits", SSL_
ffc0: 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 get_cipher_bits(
ffd0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e statePtr->ssl, N
ffe0: 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 ULL));.. ciph
fff0: 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c ers = (char*)SSL
10000 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 _get_cipher(stat
10010 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
10020 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
10030 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
10040 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d her", ciphers, -
10050 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 1);.. /* Veri
10060 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 fy the X509 cert
10070 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 ificate presente
10080 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f d by the peer */
10090 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
100a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
100b0 20 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c "verifyResult",
100c0 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 ..X509_verify_ce
100d0 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 rt_error_string(
100e0 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 SSL_get_verify_r
100f0 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e esult(statePtr->
10100 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 ssl)), -1);..
10110 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 /* Verify mode
10120 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 */. mode = SS
10130 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 L_get_verify_mod
10140 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
10150 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 ;. if (mode &
10160 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e & SSL_VERIFY_NON
10170 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 E) {..LAPPEND_ST
10180 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
10190 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 , "verifyMode",
101a0 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 "none", -1);.
101b0 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f } else {..Tcl_O
101c0 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d bj *listObjPtr =
101d0 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
101e0 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 0, NULL);..if (m
101f0 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
10200 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 Y_PEER) {.. T
10210 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10220 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10230 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f listObjPtr, Tcl_
10240 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 NewStringObj("pe
10250 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 er", -1));..}..i
10260 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 f (mode && SSL_V
10270 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f ERIFY_FAIL_IF_NO
10280 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 _PEER_CERT) {..
10290 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
102a0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
102b0 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 rp, listObjPtr,
102c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
102d0 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 ("fail if no pee
102e0 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 r cert", -1));..
102f0 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 }..if (mode && S
10300 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 SL_VERIFY_CLIENT
10310 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 _ONCE) {.. Tc
10320 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10330 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
10340 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e istObjPtr, Tcl_N
10350 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 ewStringObj("cli
10360 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b ent once", -1));
10370 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 ..}..if (mode &&
10380 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 SSL_VERIFY_POST
10390 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 _HANDSHAKE) {..
103a0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
103b0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
103c0 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 rp, listObjPtr,
103d0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
103e0 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 ("post handshake
103f0 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 ", -1));..}..LAP
10400 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c PEND_OBJ(interp,
10410 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 objPtr, "verify
10420 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 Mode", listObjPt
10430 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a r). }.. /*
10440 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 Verify mode dep
10450 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e th */. LAPPEN
10460 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
10470 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 jPtr, "verifyDep
10480 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 th", SSL_get_ver
10490 69 66 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 ify_depth(stateP
104a0 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 tr->ssl));..
104b0 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 /* Report the se
104c0 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
104d0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
104e0 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a he negotiation *
104f0 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 /. SSL_get0_a
10500 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 lpn_selected(sta
10510 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f tePtr->ssl, &pro
10520 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c to, &len);. L
10530 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
10540 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e p, objPtr, "alpn
10550 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f ", (char *)proto
10560 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e , (Tcl_Size) len
10570 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 );. LAPPEND_S
10580 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10590 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 r, "protocol", S
105a0 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 SL_get_version(s
105b0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d tatePtr->ssl), -
105c0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 1);.. /* Vali
105d0 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 d for non-RSA si
105e0 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 gnature and TLS
105f0 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 1.3 */. if (o
10600 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 bjc == 2) {..res
10610 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f = SSL_get_peer_
10620 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 signature_nid(st
10630 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
10640 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b d);. } else {
10650 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
10660 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 signature_nid(st
10670 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
10680 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 d);. }. if
10690 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 (!res) {nid = 0
106a0 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 ;}. LAPPEND_S
106b0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
106c0 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 r, "signatureHas
106d0 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a hAlgorithm", OBJ
106e0 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 _nid2ln(nid), -1
106f0 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
10700 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 == 2) {..res =
10710 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 SSL_get_peer_sig
10720 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 nature_type_nid(
10730 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
10740 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 nid);. } else
10750 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 {..res = SSL_ge
10760 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 t_signature_type
10770 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 _nid(statePtr->s
10780 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d sl, &nid);. }
10790 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b . if (!res) {
107a0 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 nid = 0;}. LA
107b0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
107c0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 , objPtr, "signa
107d0 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e tureType", OBJ_n
107e0 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b id2ln(nid), -1);
107f0 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
10800 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
10810 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
10820 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
10830 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
10840 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10890 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 -. *. * Connecti
108a0 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 onInfoObjCmd --
108b0 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f return connectio
108c0 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e n info from Open
108d0 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c SSL.. *. * Resul
108e0 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 ts:. *.A list of
108f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f connection info
10900 0a 20 20 2a 0a 20 2a 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 2d 2d 2d ----------------
10940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
10950 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 static int Conne
10960 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 ctionInfoObjCmd(
10970 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
10980 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
10990 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
109a0 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
109b0 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
109c0 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
109d0 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e an;../* The chan
109e0 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
109f0 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 e on */. Stat
10a00 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a e *statePtr;../*
10a10 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f client state fo
10a20 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a r ssl socket */.
10a30 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
10a40 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 Ptr, *listPtr;.
10a50 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 const SSL *ss
10a60 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c l;. const SSL
10a70 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b _CIPHER *cipher;
10a80 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 . const SSL_S
10a90 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b ESSION *session;
10aa0 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d . const EVP_M
10ab0 44 20 2a 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28 D *md;.. if (
10ac0 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 objc != 2) {..Tc
10ad0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
10ae0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
10af0 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 "channel");..ret
10b00 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
10b10 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 }.. chan
10b20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
10b30 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 (interp, Tcl_Get
10b40 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 StringFromObj(ob
10b50 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 jv[1], (Tcl_Size
10b60 20 2a 29 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b *)NULL), NULL);
10b70 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
10b80 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
10b90 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 ULL) {..return(T
10ba0 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
10bb0 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
10bc0 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
10bd0 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
10be0 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
10bf0 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
10c00 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
10c10 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
10c20 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
10c30 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
10c40 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
10c50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
10c60 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
10c70 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
10c80 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 ame(chan),..
10c90 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
10ca0 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a hannel", NULL);.
10cb0 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
10cc0 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
10cd0 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 "CONNECTION", "
10ce0 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c CHANNEL", "INVAL
10cf0 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ID", (char *) NU
10d00 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c LL);..return(TCL
10d10 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a _ERROR);. }..
10d20 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
10d30 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
10d40 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f ULL);.. /* Co
10d50 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f nnection info */
10d60 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 . statePtr =
10d70 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 (State *)Tcl_Get
10d80 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
10d90 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 ata(chan);. s
10da0 73 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 sl = statePtr->s
10db0 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 sl;. if (ssl
10dc0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 != NULL) {../* c
10dd0 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 onnection state
10de0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
10df0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10e00 22 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 "state", SSL_sta
10e10 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 te_string_long(s
10e20 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 sl), -1);.../* G
10e30 65 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 et SNI requested
10e40 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a server name */.
10e50 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
10e60 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
10e70 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 rvername", SSL_g
10e80 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 et_servername(ss
10e90 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 l, TLSEXT_NAMETY
10ea0 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d PE_host_name), -
10eb0 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 1);.../* Get pro
10ec0 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e tocol */..LAPPEN
10ed0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
10ee0 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 jPtr, "protocol"
10ef0 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f , SSL_get_versio
10f00 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f n(ssl), -1);.../
10f10 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 * Renegotiation
10f20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 allowed */..LAPP
10f30 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
10f40 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f objPtr, "renego
10f50 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 tiation_allowed"
10f60 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 , SSL_get_secure
10f70 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 _renegotiation_s
10f80 75 70 70 6f 72 74 28 73 73 6c 29 29 3b 0a 0a 09 upport(ssl));...
10f90 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 20 /* Get security
10fa0 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e level */..LAPPEN
10fb0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
10fc0 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74 79 5f jPtr, "security_
10fd0 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f level", SSL_get_
10fe0 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 security_level(s
10ff0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 sl));.../* Sessi
11000 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 on info */..LAPP
11010 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
11020 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
11030 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 n_reused", SSL_s
11040 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 ession_reused(ss
11050 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 l));.../* Is ser
11060 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 ver info */..LAP
11070 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 PEND_BOOL(interp
11080 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 , objPtr, "is_se
11090 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 rver", SSL_is_se
110a0 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a rver(ssl));.../*
110b0 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 Is DTLS */..LAP
110c0 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 PEND_BOOL(interp
110d0 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 , objPtr, "is_dt
110e0 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 ls", SSL_is_dtls
110f0 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 (ssl));. }..
11100 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 /* Cipher inf
11110 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 o */. cipher
11120 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e = SSL_get_curren
11130 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 t_cipher(ssl);.
11140 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d if (cipher !=
11150 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 NULL) {..char b
11160 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d uf[BUFSIZ] = {0}
11170 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 ;..int bits, alg
11180 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 _bits;.../* Ciph
11190 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 er name */..LAPP
111a0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
111b0 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 objPtr, "cipher"
111c0 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 , SSL_CIPHER_get
111d0 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d _name(cipher), -
111e0 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 1);.../* RFC nam
111f0 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 e of cipher */..
11200 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11210 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 rp, objPtr, "sta
11220 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c ndard_name", SSL
11230 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 _CIPHER_standard
11240 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d _name(cipher), -
11250 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 1);.../* OpenSSL
11260 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 name of cipher
11270 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
11280 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11290 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 "openssl_name",
112a0 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e OPENSSL_cipher_n
112b0 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 ame(SSL_CIPHER_s
112c0 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 tandard_name(cip
112d0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a her)), -1);.../*
112e0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72 65 number of secre
112f0 74 20 62 69 74 73 20 75 73 65 64 20 66 6f 72 20 t bits used for
11300 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 cipher */..bits
11310 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 = SSL_CIPHER_get
11320 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 61 _bits(cipher, &a
11330 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 lg_bits);..LAPPE
11340 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
11350 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f 62 bjPtr, "secret_b
11360 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 its", bits);..LA
11370 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
11380 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 , objPtr, "algor
11390 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f ithm_bits", alg_
113a0 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 bits);../* alg_b
113b0 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65 its is actual ke
113c0 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49 y secret bits. I
113d0 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73 f use bits and s
113e0 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d ecret (algorithm
113f0 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09 ) bits differ,..
11400 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 the rest of t
11410 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65 he bits are fixe
11420 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 d, i.e. for limi
11430 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65 ted export ciphe
11440 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a rs (bits < 56) *
11450 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 /.../* Indicates
11460 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 which SSL/TLS p
11470 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 rotocol version
11480 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 74 68 first defined th
11490 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 e cipher */..LAP
114a0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
114b0 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 objPtr, "min_ve
114c0 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 rsion", SSL_CIPH
114d0 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 ER_get_version(c
114e0 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f ipher), -1);.../
114f0 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a * Cipher NID */.
11500 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
11510 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 erp, objPtr, "ci
11520 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72 20 pherNID", (char
11530 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c *)OBJ_nid2ln(SSL
11540 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70 68 _CIPHER_get_ciph
11550 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c er_nid(cipher)),
11560 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 -1);..LAPPEND_S
11570 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11580 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c 20 r, "digestNID",
11590 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 (char *)OBJ_nid2
115a0 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ln(SSL_CIPHER_ge
115b0 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69 70 t_digest_nid(cip
115c0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 her)), -1);..LAP
115d0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
115e0 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 objPtr, "keyExc
115f0 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 72 hangeNID", (char
11600 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 *)OBJ_nid2ln(SS
11610 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f L_CIPHER_get_kx_
11620 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
11630 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
11640 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11650 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e "authenticationN
11660 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a ID", (char *)OBJ
11670 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 _nid2ln(SSL_CIPH
11680 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 ER_get_auth_nid(
11690 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a cipher)), -1);..
116a0 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74 68 ./* message auth
116b0 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 entication code
116c0 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 41 44 - Cipher is AEAD
116d0 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 (e.g. GCM or Ch
116e0 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 aCha20/Poly1305)
116f0 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 or not */../* A
11700 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e 63 uthenticated Enc
11710 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73 73 ryption with ass
11720 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 41 45 ociated data (AE
11730 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 AD) check */..LA
11740 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
11750 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 p, objPtr, "ciph
11760 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 4c er_is_aead", SSL
11770 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64 28 _CIPHER_is_aead(
11780 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 cipher));.../* D
11790 69 67 65 73 74 20 75 73 65 64 20 64 75 72 69 6e igest used durin
117a0 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 g the SSL/TLS ha
117b0 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73 69 ndshake when usi
117c0 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e 20 2a ng the cipher. *
117d0 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 /..md = SSL_CIPH
117e0 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 ER_get_handshake
117f0 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 29 3b _digest(cipher);
11800 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
11810 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 terp, objPtr, "h
11820 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 22 andshake_digest"
11830 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 , (char *)EVP_MD
11840 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a _name(md), -1);.
11850 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c ../* Get OpenSSL
11860 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f -specific ID, no
11870 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 t IANA ID */..LA
11880 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
11890 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 , objPtr, "ciphe
118a0 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c r_id", (int) SSL
118b0 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63 _CIPHER_get_id(c
118c0 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 ipher));.../* Tw
118d0 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 20 69 o-byte ID used i
118e0 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 n the TLS protoc
118f0 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 ol of the given
11900 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 cipher */..LAPPE
11910 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
11920 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c bjPtr, "protocol
11930 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f _id", (int) SSL_
11940 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f CIPHER_get_proto
11950 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29 3b col_id(cipher));
11960 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 .../* Textual de
11970 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 scription of the
11980 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 cipher */..if (
11990 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 SSL_CIPHER_descr
119a0 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 iption(cipher, b
119b0 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 uf, sizeof(buf))
119c0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
119d0 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
119e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 erp, objPtr, "de
119f0 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c scription", buf,
11a00 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a -1);..}. }..
11a10 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 /* Session i
11a20 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 nfo */. sessi
11a30 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 on = SSL_get_ses
11a40 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 sion(ssl);. i
11a50 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 f (session != NU
11a60 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 LL) {..const uns
11a70 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b igned char *tick
11a80 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 et;..size_t len2
11a90 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 ;..unsigned int
11aa0 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 ulen;..const uns
11ab0 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 igned char *sess
11ac0 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a ion_id, *proto;.
11ad0 09 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c .char buffer[SSL
11ae0 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f _MAX_MASTER_KEY_
11af0 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 LENGTH];.../* Re
11b00 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 port the selecte
11b10 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 d protocol as a
11b20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c result of the AL
11b30 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a PN negotiation *
11b40 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 /..SSL_SESSION_g
11b50 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 et0_alpn_selecte
11b60 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 d(session, &prot
11b70 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 o, &len2);..LAPP
11b80 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11b90 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 objPtr, "alpn",
11ba0 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 (char *) proto,
11bb0 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
11bc0 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 ;.../* Report th
11bd0 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
11be0 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
11bf0 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 of the NPN negot
11c00 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 iation */.#ifdef
11c10 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 USE_NPN..SSL_ge
11c20 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 t0_next_proto_ne
11c30 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 gotiated(ssl, &p
11c40 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c roto, &ulen);..L
11c50 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11c60 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 p, objPtr, "npn"
11c70 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f , (char *) proto
11c80 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 , (Tcl_Size) ule
11c90 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 n);.#endif.../*
11ca0 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f Resumable sessio
11cb0 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f n */..LAPPEND_BO
11cc0 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
11cd0 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 r, "resumable",
11ce0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 SSL_SESSION_is_r
11cf0 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e esumable(session
11d00 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e ));.../* Session
11d10 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 start time (sec
11d20 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 onds since epoch
11d30 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f ) */..LAPPEND_LO
11d40 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NG(interp, objPt
11d50 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c r, "start_time",
11d60 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
11d70 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b _time(session));
11d80 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 .../* Timeout va
11d90 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 lue - SSL_CTX_ge
11da0 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 t_timeout (in se
11db0 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 conds) */..LAPPE
11dc0 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
11dd0 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 objPtr, "timeout
11de0 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 ", SSL_SESSION_g
11df0 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 et_timeout(sessi
11e00 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 on));.../* Sessi
11e10 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 on id - TLSv1.2
11e20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a and below only *
11e30 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 /..session_id =
11e40 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
11e50 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 id(session, &ule
11e60 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 n);..LAPPEND_BAR
11e70 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 RAY(interp, objP
11e80 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 tr, "session_id"
11e90 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 , session_id, (T
11ea0 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a cl_Size) ulen);.
11eb0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e ../* Session con
11ec0 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e text */..session
11ed0 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f _id = SSL_SESSIO
11ee0 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 N_get0_id_contex
11ef0 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e t(session, &ulen
11f00 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
11f10 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
11f20 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 r, "session_cont
11f30 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 ext", session_id
11f40 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 , (Tcl_Size) ule
11f50 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e n);.../* Session
11f60 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 ticket - client
11f70 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 only */..SSL_SE
11f80 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 SSION_get0_ticke
11f90 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b t(session, &tick
11fa0 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 et, &len2);..LAP
11fb0 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 PEND_BARRAY(inte
11fc0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
11fd0 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 sion_ticket", ti
11fe0 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 cket, (Tcl_Size)
11ff0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 len2);.../* Ses
12000 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 sion ticket life
12010 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 time hint (in se
12020 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 conds) */..LAPPE
12030 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
12040 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d objPtr, "lifetim
12050 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f e", SSL_SESSION_
12060 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 get_ticket_lifet
12070 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e ime_hint(session
12080 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 ));.../* Ticket
12090 61 70 70 20 64 61 74 61 20 2a 2f 0a 09 53 53 4c app data */..SSL
120a0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 _SESSION_get0_ti
120b0 63 6b 65 74 5f 61 70 70 64 61 74 61 28 73 65 73 cket_appdata(ses
120c0 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 sion, &ticket, &
120d0 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f len2);..LAPPEND_
120e0 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f BARRAY(interp, o
120f0 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 bjPtr, "ticket_a
12100 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 pp_data", ticket
12110 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e , (Tcl_Size) len
12120 32 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 2);.../* Get mas
12130 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 ter key */..len2
12140 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
12150 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 et_master_key(se
12160 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 ssion, buffer, S
12170 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 SL_MAX_MASTER_KE
12180 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 Y_LENGTH);..LAPP
12190 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 END_BARRAY(inter
121a0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 p, objPtr, "mast
121b0 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c er_key", buffer,
121c0 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
121d0 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 );.../* Compress
121e0 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 ion id */..unsig
121f0 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c ned int id = SSL
12200 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d _SESSION_get_com
12210 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e press_id(session
12220 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
12230 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12240 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 "compression_id"
12250 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 , id == 1 ? "zli
12260 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 b" : "none", -1)
12270 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
12280 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f Compression info
12290 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 */. if (ssl
122a0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 != NULL) {.#ifde
122b0 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 f HAVE_SSL_COMPR
122c0 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f ESSION..const CO
122d0 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c MP_METHOD *comp,
122e0 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 *expn;..comp =
122f0 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f SSL_get_current_
12300 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 compression(ssl)
12310 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 ;..expn = SSL_ge
12320 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 t_current_expans
12330 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 ion(ssl);...LAPP
12340 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12350 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 objPtr, "compres
12360 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 sion", comp ? SS
12370 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 L_COMP_get_name(
12380 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 comp) : "none",
12390 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 -1);..LAPPEND_ST
123a0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
123b0 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 , "expansion", e
123c0 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 xpn ? SSL_COMP_g
123d0 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 et_name(expn) :
123e0 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c "none", -1);.#el
123f0 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 se..LAPPEND_STR(
12400 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12410 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 "compression", "
12420 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 none", -1);..LAP
12430 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
12440 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 objPtr, "expans
12450 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 ion", "none", -1
12460 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
12470 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 . /* Server i
12480 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f nfo */. {..lo
12490 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 ng mode = SSL_CT
124a0 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 X_get_session_ca
124b0 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 che_mode(statePt
124c0 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a r->ctx);..char *
124d0 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 msg;...if (mode
124e0 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
124f0 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 _OFF) {.. msg
12500 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 = "off";..} els
12510 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c e if (mode & SSL
12520 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 _SESS_CACHE_CLIE
12530 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d NT) {.. msg =
12540 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c "client";..} el
12550 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
12560 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 L_SESS_CACHE_SER
12570 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 VER) {.. msg
12580 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 = "server";..} e
12590 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 lse if (mode & S
125a0 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f SL_SESS_CACHE_BO
125b0 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d TH) {.. msg =
125c0 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 "both";..} else
125d0 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75 {.. msg = "u
125e0 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 nknown";..}..LAP
125f0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
12600 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
12610 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d n_cache_mode", m
12620 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a sg, -1);. }..
12630 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a /* CA List *
12640 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 /. /* IF not
12650 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61 a server, same a
12660 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f s SSL_get0_peer_
12670 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76 CA_list. If serv
12680 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 er same as SSL_C
12690 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 TX_get_client_CA
126a0 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 _list */. lis
126b0 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 tPtr = Tcl_NewLi
126c0 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
126d0 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 STACK_OF(X50
126e0 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 9_NAME) *ca_list
126f0 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69 ;. if ((ca_li
12700 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 st = SSL_get_cli
12710 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 ent_CA_list(ssl)
12720 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 ) != NULL) {..ch
12730 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a ar buffer[BUFSIZ
12740 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d ];..for (int i =
12750 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 0; i < sk_X509_
12760 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 NAME_num(ca_list
12770 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 ); i++) {.. X
12780 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 509_NAME *name =
12790 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 sk_X509_NAME_va
127a0 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b lue(ca_list, i);
127b0 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 .. if (name)
127c0 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e {...X509_NAME_on
127d0 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 eline(name, buff
127e0 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 er, BUFSIZ);...T
127f0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
12800 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
12810 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 listPtr, Tcl_New
12820 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 StringObj(buffer
12830 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 , -1));.. }..
12840 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 }. }. LAPP
12850 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
12860 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 objPtr, "caList"
12870 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 , listPtr);.
12880 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
12890 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c rp, objPtr, "caL
128a0 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 istCount", sk_X5
128b0 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 09_NAME_num(ca_l
128c0 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ist));.. Tcl_
128d0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
128e0 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
128f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
12900 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
12910 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
12920 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12960 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 -------. *. * Ve
12970 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 rsionObjCmd -- r
12980 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 eturn version st
12990 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 ring from OpenSS
129a0 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 L.. *. * Results
129b0 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
129c0 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
129d0 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
129e0 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a30 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
12a40 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 .VersionObjCmd(C
12a50 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
12a60 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
12a70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
12a80 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
12a90 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
12aa0 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
12ab0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
12ac0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f Called");.. o
12ad0 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 bjPtr = Tcl_NewS
12ae0 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c tringObj(OPENSSL
12af0 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d _VERSION_TEXT, -
12b00 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 1);. Tcl_SetO
12b10 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
12b20 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 objPtr);.. r
12b30 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
12b40 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
12b50 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 ntData;..objc =
12b60 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 objc;..objv = ob
12b70 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d jv;.}.../*. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12bc0 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d . *. * MiscObjCm
12bd0 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e d -- misc comman
12be0 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 ds. *. * Results
12bf0 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
12c00 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
12c10 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
12c20 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c70 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
12c80 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 .MiscObjCmd(Clie
12c90 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
12ca0 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
12cb0 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
12cc0 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
12cd0 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 objv[]) {. st
12ce0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
12cf0 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b *commands [] = {
12d00 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 "req", "strreq"
12d10 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e , NULL };. en
12d20 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 um command { C_R
12d30 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f EQ, C_STRREQ, C_
12d40 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c DUMMY };. Tcl
12d50 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 _Size cmd;. i
12d60 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 nt isStr;. ch
12d70 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d ar buffer[16384]
12d80 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
12d90 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
12da0 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 f (objc < 2) {..
12db0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
12dc0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
12dd0 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 , "subcommand ?a
12de0 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 rgs?");..return
12df0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
12e00 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
12e10 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 IndexFromObj(int
12e20 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f erp, objv[1], co
12e30 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 mmands, "command
12e40 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 ", 0, &cmd) != T
12e50 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
12e60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
12e70 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
12e80 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 _error();.. i
12e90 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 sStr = (cmd == C
12ea0 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 _STRREQ);. sw
12eb0 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d itch ((enum comm
12ec0 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 and) cmd) {..cas
12ed0 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 e C_REQ:..case C
12ee0 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 _STRREQ: {..
12ef0 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e EVP_PKEY *pkey=N
12f00 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a ULL;.. X509 *
12f10 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 cert=NULL;..
12f20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d X509_NAME *name=
12f30 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f NULL;.. Tcl_O
12f40 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 bj **listv;..
12f50 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b Tcl_Size listc;
12f60 0a 09 20 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 .. int i;...
12f70 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c BIO *out=NULL
12f80 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f ;... char *k_
12f90 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b C="",*k_ST="",*k
12fa0 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b _L="",*k_O="",*k
12fb0 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c _OU="",*k_CN="",
12fc0 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 *k_Email="";..
12fd0 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a char *keyout,*
12fe0 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 pemout,*str;..
12ff0 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 int keysize,se
13000 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b rial=0,days=365;
13010 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
13020 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
13030 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 x30000000L..
13040 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 BIGNUM *bne = NU
13050 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 LL;.. RSA *rs
13060 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a a = NULL;.#else.
13070 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 . EVP_PKEY_CT
13080 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 X *ctx = NULL;.#
13090 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 endif... if (
130a0 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a (objc<5) || (obj
130b0 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 c>6)) {...Tcl_Wr
130c0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
130d0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 p, 2, objv, "key
130e0 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 size keyfile cer
130f0 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a tfile ?info?");.
13100 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
13110 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 OR;.. }...
13120 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 if (Tcl_GetIntF
13130 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
13140 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 bjv[2], &keysize
13150 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
13160 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
13170 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b R;.. }.. k
13180 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 eyout=Tcl_GetStr
13190 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 ing(objv[3]);..
131a0 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 pemout=Tcl_Ge
131b0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 tString(objv[4])
131c0 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72 ;.. if (isStr
131d0 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 ) {...Tcl_SetVar
131e0 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 (interp,keyout,"
131f0 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 ",0);...Tcl_SetV
13200 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 ar(interp,pemout
13210 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a ,"",0);.. }..
13220 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 . if (objc>=6
13230 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 ) {...if (Tcl_Li
13240 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 stObjGetElements
13250 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d (interp, objv[5]
13260 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 , &listc, &listv
13270 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
13280 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
13290 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 ERROR;...}....if
132a0 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 ((listc%2) != 0
132b0 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 ) {... Tcl_Se
132c0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
132d0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 Information list
132e0 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 must have even
132f0 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 number of argume
13300 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 nts",NULL);...
13310 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
13320 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 OR;...}...for (i
13330 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d =0; i<listc; i+=
13340 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 2) {... str=T
13350 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
13360 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 tv[i]);... if
13370 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 (strcmp(str,"da
13380 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 ys")==0) {....if
13390 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
133a0 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
133b0 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 [i+1],&days)!=TC
133c0 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 L_OK).... ret
133d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
133e0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
133f0 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 strcmp(str,"seri
13400 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 al")==0) {....if
13410 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
13420 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
13430 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d [i+1],&serial)!=
13440 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 TCL_OK).... r
13450 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
13460 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
13470 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 (strcmp(str,"C"
13480 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 )==0) {....k_C=T
13490 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
134a0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
134b0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
134c0 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 p(str,"ST")==0)
134d0 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 {....k_ST=Tcl_Ge
134e0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
134f0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
13500 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
13510 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"L")==0) {....k
13520 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _L=Tcl_GetString
13530 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
13540 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
13550 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d trcmp(str,"O")==
13560 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 0) {....k_O=Tcl_
13570 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
13580 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
13590 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
135a0 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 tr,"OU")==0) {..
135b0 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 ..k_OU=Tcl_GetSt
135c0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
135d0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
135e0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 f (strcmp(str,"C
135f0 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 N")==0) {....k_C
13600 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 N=Tcl_GetString(
13610 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
13620 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
13630 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 rcmp(str,"Email"
13640 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 )==0) {....k_Ema
13650 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 il=Tcl_GetString
13660 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
13670 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 } else {....
13680 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
13690 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 terp,"Unknown pa
136a0 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a rameter",NULL);.
136b0 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
136c0 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d ROR;... }...}
136d0 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 .. }..#if OPE
136e0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
136f0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
13700 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f L.. bne = BN_
13710 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 new();.. rsa
13720 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 = RSA_new();..
13730 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 pkey = EVP_PKE
13740 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 Y_new();.. if
13750 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (bne == NULL ||
13760 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 rsa == NULL ||
13770 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 pkey == NULL ||
13780 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 !BN_set_word(bne
13790 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 ,RSA_F4) ||...!R
137a0 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f SA_generate_key_
137b0 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c ex(rsa, keysize,
137c0 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 bne, NULL) || !
137d0 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f EVP_PKEY_assign_
137e0 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 RSA(pkey, rsa))
137f0 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 {...EVP_PKEY_fre
13800 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 e(pkey);.../* RS
13810 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 A_free(rsa); fre
13820 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 ed by EVP_PKEY_f
13830 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 ree */...BN_free
13840 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 (bne);.#else..
13850 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 pkey = EVP_RSA
13860 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 _gen((unsigned i
13870 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 nt) keysize);..
13880 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 ctx = EVP_PKE
13890 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e Y_CTX_new(pkey,N
138a0 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 ULL);.. if (p
138b0 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 key == NULL || c
138c0 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 tx == NULL || !E
138d0 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 VP_PKEY_keygen_i
138e0 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 nit(ctx) ||...!E
138f0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f VP_PKEY_CTX_set_
13900 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 rsa_keygen_bits(
13910 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c ctx, keysize) ||
13920 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 !EVP_PKEY_keyge
13930 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b n(ctx, &pkey)) {
13940 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
13950 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b (pkey);...EVP_PK
13960 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 EY_CTX_free(ctx)
13970 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 ;.#endif...Tcl_S
13980 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
13990 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e "Error generatin
139a0 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e g private key",N
139b0 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 ULL);...return T
139c0 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
139d0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 else {...if (is
139e0 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 Str) {... out
139f0 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d =BIO_new(BIO_s_m
13a00 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d em());... PEM
13a10 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 _write_bio_Priva
13a20 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e teKey(out,pkey,N
13a30 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c ULL,NULL,0,NULL,
13a40 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 NULL);... i=B
13a50 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 IO_read(out,buff
13a60 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 er,sizeof(buffer
13a70 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 )-1);... i=(i
13a80 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 <0) ? 0 : i;...
13a90 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 buffer[i]='\0
13aa0 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 ';... Tcl_Set
13ab0 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
13ac0 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 t,buffer,0);...
13ad0 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 BIO_flush(out
13ae0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
13af0 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 e(out);...} else
13b00 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
13b10 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 _new(BIO_s_file(
13b20 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 ));... BIO_wr
13b30 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 ite_filename(out
13b40 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 ,keyout);...
13b50 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 PEM_write_bio_Pr
13b60 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 ivateKey(out,pke
13b70 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 y,NULL,NULL,0,NU
13b80 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 LL,NULL);...
13b90 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f /* PEM_write_bio
13ba0 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f _RSAPrivateKey(o
13bb0 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e ut, rsa, NULL, N
13bc0 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 ULL, 0, NULL, NU
13bd0 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 LL); */... BI
13be0 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
13bf0 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 .. .}....if ((ce
13c00 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d rt=X509_new())==
13c10 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 NULL) {... Tc
13c20 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
13c30 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 rp,"Error genera
13c40 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ting certificate
13c50 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b request",NULL);
13c60 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f ... EVP_PKEY_
13c70 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
13c80 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
13c90 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
13ca0 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 000L... BN_fr
13cb0 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
13cc0 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c .. return(TCL
13cd0 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 _ERROR);...}....
13ce0 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e X509_set_version
13cf0 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 (cert,2);...ASN1
13d00 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 _INTEGER_set(X50
13d10 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 9_get_serialNumb
13d20 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 er(cert),serial)
13d30 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f ;...X509_gmtime_
13d40 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f adj(X509_getm_no
13d50 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 tBefore(cert),0)
13d60 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f ;...X509_gmtime_
13d70 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f adj(X509_getm_no
13d80 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f tAfter(cert),(lo
13d90 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 ng)60*60*24*days
13da0 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 );...X509_set_pu
13db0 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b bkey(cert,pkey);
13dc0 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 ....name=X509_ge
13dd0 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 t_subject_name(c
13de0 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 ert);....X509_NA
13df0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
13e00 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 txt(name,"C", MB
13e10 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
13e20 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
13e30 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c *) k_C, -1, -1,
13e40 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
13e50 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
13e60 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 t(name,"ST", MBS
13e70 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
13e80 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
13e90 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c *) k_ST, -1, -1,
13ea0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
13eb0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
13ec0 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 t(name,"L", MBST
13ed0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
13ee0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
13ef0 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 ) k_L, -1, -1, 0
13f00 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
13f10 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
13f20 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 name,"O", MBSTRI
13f30 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
13f40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
13f50 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b k_O, -1, -1, 0);
13f60 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
13f70 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
13f80 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e me,"OU", MBSTRIN
13f90 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
13fa0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
13fb0 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _OU, -1, -1, 0);
13fc0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
13fd0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
13fe0 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e me,"CN", MBSTRIN
13ff0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
14000 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
14010 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _CN, -1, -1, 0);
14020 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
14030 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
14040 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 me,"Email", MBST
14050 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
14060 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
14070 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d ) k_Email, -1, -
14080 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 1, 0);....X509_s
14090 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 et_subject_name(
140a0 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 cert,name);....i
140b0 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 f (!X509_sign(ce
140c0 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 rt,pkey,EVP_sha2
140d0 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 56())) {... X
140e0 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 509_free(cert);.
140f0 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 .. EVP_PKEY_f
14100 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
14110 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
14120 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
14130 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 00L... BN_fre
14140 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 e(bne);.#endif..
14150 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
14160 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 lt(interp,"Error
14170 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 signing certifi
14180 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 cate",NULL);...
14190 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
141a0 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 ROR;...}....if (
141b0 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f isStr) {... o
141c0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
141d0 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 _mem());... P
141e0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 EM_write_bio_X50
141f0 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 9(out,cert);...
14200 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 i=BIO_read(ou
14210 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 t,buffer,sizeof(
14220 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 buffer)-1);...
14230 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 i=(i<0) ? 0 :
14240 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b i;... buffer[
14250 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 i]='\0';... T
14260 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
14270 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 ,pemout,buffer,0
14280 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 );... BIO_flu
14290 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 sh(out);... B
142a0 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 IO_free(out);...
142b0 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f } else {... o
142c0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
142d0 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 _file());...
142e0 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
142f0 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a me(out,pemout);.
14300 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
14310 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 bio_X509(out,cer
14320 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 t);... BIO_fr
14330 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d ee_all(out);...}
14340 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 ....X509_free(ce
14350 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f rt);...EVP_PKEY_
14360 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
14370 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
14380 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
14390 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 000L...BN_free(b
143a0 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 ne);.#endif..
143b0 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 }..}..break;.
143c0 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 default:..brea
143d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 k;. }. ret
143e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
143f0 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
14400 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a Data;.}.../*****
14410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
14420 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 ./* Init
14430 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
14440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
14450 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14490 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
144a0 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a ls_Free --. *. *
144b0 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
144c0 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 cleans up when a
144d0 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
144e0 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 d channel. *.is
144f0 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 closed and its r
14500 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 eference count f
14510 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a alls below 1. *.
14520 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e * Results:. *.n
14530 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
14540 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 ffects:. *.Frees
14550 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 all the state.
14560 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145a0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
145b0 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a .Tls_Free(char *
145c0 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 blockPtr) {.
145d0 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
145e0 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b = (State *)block
145f0 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 Ptr;.. dprint
14600 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
14610 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 Tls_Clean(stat
14620 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 ePtr);. ckfre
14630 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c e(blockPtr);.}..
14640 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d ----------------
14680 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
14690 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a Tls_Clean --. *.
146a0 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
146b0 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e e cleans up when
146c0 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
146d0 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 sed channel. *.i
146e0 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 s closed and its
146f0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
14700 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 falls below 1.
14710 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 This should. *.
14720 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 be called synchr
14730 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 onously by the C
14740 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e loseProc, not in
14750 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c the. *.Eventual
14760 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e lyFree callback.
14770 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
14780 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.none. *. * Si
14790 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 de effects:. *.F
147a0 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 rees all the sta
147b0 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d te. *. *--------
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 2d 2d 2d 2d 2d ----------------
147f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
14800 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 void Tls_Clean(S
14810 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 tate *statePtr)
14820 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 {. dprintf("C
14830 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
14840 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 . * we're as
14850 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 suming here that
14860 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 we're single-th
14870 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 readed. */.
14880 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
14890 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 >timer != (Tcl_T
148a0 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 imerToken) NULL)
148b0 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 {..Tcl_DeleteTi
148c0 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 merHandler(state
148d0 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 Ptr->timer);..st
148e0 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 atePtr->timer =
148f0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
14900 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
14910 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 rotos) {..ckfree
14920 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
14930 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 s);..statePtr->p
14940 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 rotos = NULL;.
14950 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
14960 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a ePtr->bio) {../*
14970 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 This will call
14980 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 SSL_shutdown. Bu
14990 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 g 1414045 */..dp
149a0 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f rintf("BIO_free_
149b0 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 all(%p)", stateP
149c0 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 tr->bio);..BIO_f
149d0 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 ree_all(statePtr
149e0 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 ->bio);..statePt
149f0 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 r->bio = NULL;.
14a00 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
14a10 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 tePtr->ssl) {..d
14a20 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 printf("SSL_free
14a30 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d (%p)", statePtr-
14a40 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 >ssl);..SSL_free
14a50 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
14a60 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 ..statePtr->ssl
14a70 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
14a80 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
14a90 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f ctx) {..SSL_CTX_
14aa0 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 free(statePtr->c
14ab0 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e tx);..statePtr->
14ac0 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
14ad0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
14ae0 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a tr->callback) {.
14af0 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
14b00 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c t(statePtr->call
14b10 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 back);..statePtr
14b20 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c ->callback = NUL
14b30 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
14b40 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
14b50 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 ord) {..Tcl_Decr
14b60 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
14b70 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 r->password);..s
14b80 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
14b90 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a d = NULL;. }.
14ba0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
14bb0 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 ->vcmd) {..Tcl_D
14bc0 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ecrRefCount(stat
14bd0 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 ePtr->vcmd);..st
14be0 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e atePtr->vcmd = N
14bf0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
14c00 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
14c10 6e 67 22 29 3b 0a 7d 0a 0c 0a 23 69 66 20 54 43 ng");.}...#if TC
14c20 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
14c30 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f > 8.#define MIN_
14c40 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65 VERSION "9.0".#e
14c50 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f lse.#define MIN_
14c60 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65 VERSION "8.5".#e
14c70 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ndif../*. *-----
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 2d 2d ----------------
14cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
14cc0 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d *. * Tls_Init --
14cd0 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 . *. *.This is a
14ce0 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c package initial
14cf0 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 ization procedur
14d00 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c e, which is call
14d10 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 ed. *.by Tcl whe
14d20 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 n this package i
14d30 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f s to be added to
14d40 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e an interpreter.
14d50 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 . *. * Results:
14d60 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 Ssl configured
14d70 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a and loaded. *. *
14d80 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
14d90 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 *. create the ss
14da0 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 l command, initi
14db0 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 alize ssl contex
14dc0 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d t. *. *---------
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 2d 2d 2d 2d 2d 2d ----------------
14e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 ----------. */.D
14e10 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 LLEXPORT int Tls
14e20 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 _Init(Tcl_Interp
14e30 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
14e40 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 const char tlsTc
14e50 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 lInitScript[] =
14e60 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e {.#include "tls.
14e70 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 tcl.h"..0x00.
14e80 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 };.. dprintf
14e90 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 ("Called");..#if
14ea0 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 def USE_TCL_STUB
14eb0 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e S. if (Tcl_In
14ec0 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 itStubs(interp,
14ed0 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 MIN_VERSION, 0)
14ee0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
14ef0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
14f00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 }.#endif. i
14f10 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 f (Tcl_PkgRequir
14f20 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c e(interp, "Tcl",
14f30 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 MIN_VERSION, 0)
14f40 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
14f50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
14f60 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c }.. if (Tl
14f70 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 sLibInit(0) != T
14f80 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 CL_OK) {..Tcl_Ap
14f90 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
14fa0 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e p, "could not in
14fb0 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 itialize SSL lib
14fc0 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 20 rary", (char *)
14fd0 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
14fe0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
14ff0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
15000 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
15010 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 , "tls::ciphers"
15020 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c , CiphersObjCmd,
15030 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
15040 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
15050 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
15060 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
15070 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
15080 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 tls::connection"
15090 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f , ConnectionInfo
150a0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
150b0 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
150c0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
150d0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
150e0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
150f0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 terp, "tls::hand
15100 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b shake", Handshak
15110 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 eObjCmd, (Client
15120 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
15130 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
15140 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
15150 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
15160 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 nterp, "tls::imp
15170 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 ort", ImportObjC
15180 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
15190 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
151a0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
151b0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
151c0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
151d0 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 , "tls::unimport
151e0 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d ", UnimportObjCm
151f0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
15200 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
15210 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
15220 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
15230 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
15240 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 "tls::status",
15250 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 StatusObjCmd, (C
15260 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
15270 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
15280 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
15290 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
152a0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
152b0 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 ::version", Vers
152c0 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 ionObjCmd, (Clie
152d0 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
152e0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
152f0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
15300 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
15310 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d (interp, "tls::m
15320 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 isc", MiscObjCmd
15330 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
15340 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15350 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
15360 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15370 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
15380 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 "tls::protocols"
15390 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d , ProtocolsObjCm
153a0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
153b0 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
153c0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
153d0 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 29 . if (interp)
153e0 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 {..Tcl_Eval(int
153f0 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 erp, tlsTclInitS
15400 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 cript);. }..
15410 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b return Tcl_Pk
15420 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c gProvide(interp,
15430 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 PACKAGE_NAME, P
15440 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b ACKAGE_VERSION);
15450 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
15460 2d 2d 2d 2d 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 2a ---------------*
15490 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 . *. *.Tls_SafeI
154a0 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d nit --. *. *.---
154b0 2d 2d 2d 2d 2d 2d 2d 2d 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 2a 0a 20 -------------*.
154e0 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 *.Standard proce
154f0 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79 dure required by
15500 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 'load'.. *.Init
15510 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 ializes this ext
15520 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 ension for a saf
15530 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 e interpreter..
15540 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
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 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 --*. *. *.Side e
15580 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f ffects:. *..As o
15590 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a f 'Tls_Init'. *.
155a0 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 *.Result:. *..A
155b0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 standard Tcl er
155c0 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d ror code.. *. *-
155d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 -----*. */.DLLEX
15610 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 PORT int Tls_Saf
15620 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 eInit(Tcl_Interp
15630 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
15640 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
15650 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 6c );. return(Tl
15660 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b s_Init(interp));
15670 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
15680 2d 2d 2d 2d 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 2a ---------------*
156b0 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 . *. *.TlsLibIni
156c0 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d t --. *. *.-----
156d0 2d 2d 2d 2d 2d 2d 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 2a 0a 20 2a 09 -----------*. *.
15700 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 Initializes SSL
15710 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 library once per
15720 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 application. *.
15730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 *. *. *.Side eff
15770 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 ects:. *..initia
15780 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 lizes SSL librar
15790 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a y. *. *.Result:.
157a0 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d *..none. *. *--
157b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 ----*. */.static
157f0 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 int TlsLibInit(
15800 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 int uninitialize
15810 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 ) {. static i
15820 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d nt initialized =
15830 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 0;. int stat
15840 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 us = TCL_OK;.#if
15850 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
15860 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
15870 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
15880 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d ). size_t num
15890 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a _locks;.#endif..
158a0 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 if (uninitia
158b0 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e lize) {..if (!in
158c0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 itialized) {..
158d0 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 dprintf("Asked
158e0 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 to uninitialize
158f0 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 , but we are not
15900 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a initialized");.
15910 0a 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c .. return(TCL
15920 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e _OK);..}...dprin
15930 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 tf("Asked to uni
15940 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 nitialize");..#i
15950 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
15960 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
15970 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
15980 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 S)..Tcl_MutexLoc
15990 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 k(&init_mx);...i
159a0 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 f (locks) {..
159b0 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 free(locks);..
159c0 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b locks = NULL;
159d0 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 .. locksCount
159e0 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a = 0;..}.#endif.
159f0 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 .initialized = 0
15a00 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
15a10 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
15a20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
15a30 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 HREADS)..Tcl_Mut
15a40 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d exUnlock(&init_m
15a50 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 x);.#endif...ret
15a60 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 urn(TCL_OK);.
15a70 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 }.. if (init
15a80 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 ialized) {..dpri
15a90 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 ntf("Called, but
15aa0 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 using cached va
15ab0 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 28 73 lue");..return(s
15ac0 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 tatus);. }..
15ad0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
15ae0 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e ed");..#if defin
15af0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
15b00 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
15b10 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 CL_THREADS).
15b20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 Tcl_MutexLock(&i
15b30 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a nit_mx);.#endif.
15b40 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 initialized
15b50 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 = 1;..#if define
15b60 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
15b70 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
15b80 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e L_THREADS). n
15b90 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 um_locks = 1;.
15ba0 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 locksCount = (
15bb0 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a int) num_locks;.
15bc0 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c locks = mall
15bd0 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 oc(sizeof(*locks
15be0 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a ) * num_locks);.
15bf0 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 memset(locks
15c00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 , 0, sizeof(*loc
15c10 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 ks) * num_locks)
15c20 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a ;.#endif.. /*
15c30 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 Initialize BOTH
15c40 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c libcrypto and l
15c50 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 ibssl. */. OP
15c60 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f ENSSL_init_ssl(O
15c70 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 PENSSL_INIT_LOAD
15c80 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f _SSL_STRINGS | O
15c90 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 PENSSL_INIT_LOAD
15ca0 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a _CRYPTO_STRINGS.
15cb0 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f .| OPENSSL_INIT_
15cc0 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 ADD_ALL_CIPHERS
15cd0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 | OPENSSL_INIT_A
15ce0 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 DD_ALL_DIGESTS,
15cf0 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f NULL);.. BIO_
15d00 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 new_tcl(NULL, 0)
15d10 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a ;..#if 0. /*.
15d20 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a * XXX:TODO:
15d30 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 Remove this cod
15d40 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 e and replace it
15d50 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 with a check.
15d60 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 * for enough
15d70 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e entropy and do n
15d80 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 ot try to create
15d90 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 our own. *
15da0 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 terrible entropy
15db0 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a . */. /*.
15dc0 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 * Seed the
15dd0 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 random number ge
15de0 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 nerator in the S
15df0 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 SL library,.
15e00 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f * using the do/
15e10 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 while construct
15e20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 because of the b
15e30 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 ug note in the.
15e40 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 * OpenSSL FA
15e50 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e Q at http://www.
15e60 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 openssl.org/supp
15e70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 ort/faq.html#USE
15e80 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a R1. *. *
15e90 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 The crux of the
15ea0 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 problem is that
15eb0 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 Solaris 7 does
15ec0 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 not have a.
15ed0 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 * /dev/random or
15ee0 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 /dev/urandom de
15ef0 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f vice so it canno
15f00 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a t gather enough.
15f10 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 * entropy f
15f20 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 rom the RAND_see
15f30 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 d() when TLS ini
15f40 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 tializes and ref
15f50 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 uses. * to g
15f60 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 o further. Earli
15f70 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f er versions of O
15f80 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f penSSL carried o
15f90 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 n regardless..
15fa0 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 */. srand(
15fb0 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 (unsigned int) t
15fc0 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e ime((time_t *) N
15fd0 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a ULL));. do {.
15fe0 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c .for (i = 0; i <
15ff0 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 16; i++) {..
16000 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 rnd_seed[i] = 1
16010 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 + (char) (255.0
16020 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f * rand()/(RAND_
16030 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 MAX+1.0));..}..R
16040 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 AND_seed(rnd_see
16050 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 d, sizeof(rnd_se
16060 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c ed));. } whil
16070 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 e (RAND_status()
16080 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a != 1);.#endif..
16090 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
160a0 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
160b0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
160c0 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 ADS)..Tcl_MutexU
160d0 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b nlock(&init_mx);
160e0 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e .#endif...return
160f0 28 73 74 61 74 75 73 29 3b 0a 7d 0a (status);.}.