0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61 (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69 some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68 ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32 pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72 ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79 poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53 right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29 *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61 2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68 st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64 * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61 dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64 .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74 ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 full fileevent
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 Also work done
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68 ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 e impetus to do
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 pts.h".#include
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 rsa.h>.#include
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61 <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72 10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76 "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69 1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72 dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29 #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74 r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69 _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 ar *key,...char
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 tes, int level,
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 mask))..#define
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 54 68 72 65 61 64 2d 53 61 66 /*. * Thread-Saf
0780: 65 20 54 4c 53 20 43 6f 64 65 0a 20 2a 2f 0a 0a e TLS Code. */..
0790: 23 69 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 #ifdef TCL_THREA
07a0: 44 53 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 53 DS.#define OPENS
07b0: 53 4c 5f 54 48 52 45 41 44 5f 44 45 46 49 4e 45 SL_THREAD_DEFINE
07c0: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e S.#include <open
07d0: 73 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e 66 2e ssl/opensslconf.
07e0: 68 3e 0a 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 h>..#ifdef OPENS
07f0: 53 4c 5f 54 48 52 45 41 44 53 0a 23 69 6e 63 6c SL_THREADS.#incl
0800: 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 79 ude <openssl/cry
0810: 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 pto.h>.#include
0820: 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a <openssl/ssl.h>.
0830: 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65 64 20 ./*. * Threaded
0840: 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75 69 72 operation requir
0850: 65 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c 6c 62 es locking callb
0860: 61 63 6b 73 0a 20 2a 20 42 61 73 65 64 20 66 72 acks. * Based fr
0870: 6f 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79 70 74 om /crypto/crypt
0880: 6c 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53 53 4c lib.c of OpenSSL
0890: 20 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c 2e 0a and NSOpenSSL..
08a0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f */..static Tcl_
08b0: 4d 75 74 65 78 20 2a 6c 6f 63 6b 73 20 3d 20 4e Mutex *locks = N
08c0: 55 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 ULL;.static int
08d0: 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a locksCount = 0;.
08e0: 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 static Tcl_Mutex
08f0: 20 69 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64 69 66 init_mx;.#endif
0900: 20 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 /* OPENSSL_THRE
0910: 41 44 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a ADS */.#endif /*
0920: 20 54 43 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a TCL_THREADS */.
0930: 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
0940: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 61 6c ********/./* Cal
0950: 6c 62 61 63 6b 73 20 20 20 20 20 20 20 20 2a 2f lbacks */
0960: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
0970: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d ******/../*. *--
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09c0: 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 43 61 6c -. *. * Eval Cal
09d0: 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 20 2d 2d lback Command --
09e0: 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63 61 6c 6c . *. *.Eval call
09f0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 back command and
0a00: 20 63 61 74 63 68 20 61 6e 79 20 65 72 72 6f 72 catch any error
0a10: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
0a20: 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e 64 20 . *.0 = Command
0a30: 72 65 74 75 72 6e 65 64 20 66 61 69 6c 20 6f 72 returned fail or
0a40: 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 eval returned T
0a50: 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 20 3d 20 CL_ERROR. *.1 =
0a60: 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 Command returned
0a70: 20 73 75 63 63 65 73 73 20 6f 72 20 65 76 61 6c success or eval
0a80: 20 72 65 74 75 72 6e 65 64 20 54 43 4c 5f 4f 4b returned TCL_OK
0a90: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
0aa0: 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75 61 74 65 cts:. *.Evaluate
0ab0: 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 s callback comma
0ac0: 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d nd. *. *--------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
0b10: 73 74 61 74 69 63 20 69 6e 74 0a 45 76 61 6c 43 static int.EvalC
0b20: 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 6e 74 65 allback(Tcl_Inte
0b30: 72 70 20 2a 69 6e 74 65 72 70 2c 20 53 74 61 74 rp *interp, Stat
0b40: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 54 63 6c e *statePtr, Tcl
0b50: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29 20 7b 0a _Obj *cmdPtr) {.
0b60: 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 6f 6b int code, ok
0b70: 20 3d 20 30 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 = 0;.. Tcl_P
0b80: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
0b90: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
0ba0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
0bb0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
0bc0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 ePtr);.. /* E
0bd0: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 val callback wit
0be0: 68 20 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b h success for ok
0bf0: 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 or return value
0c00: 20 31 2c 20 66 61 69 6c 20 66 6f 72 20 65 72 72 1, fail for err
0c10: 6f 72 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c or or return val
0c20: 75 65 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c 5f ue 0 */. Tcl_
0c30: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 ResetResult(inte
0c40: 72 70 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 rp);. code =
0c50: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e Tcl_EvalObjEx(in
0c60: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 terp, cmdPtr, TC
0c70: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a L_EVAL_GLOBAL);.
0c80: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 if (code ==
0c90: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 43 68 TCL_OK) {../* Ch
0ca0: 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72 20 72 eck result for r
0cb0: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 eturn value */..
0cc0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 20 Tcl_Obj *result
0cd0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 = Tcl_GetObjResu
0ce0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 66 20 lt(interp);..if
0cf0: 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 20 (result == NULL
0d00: 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f || Tcl_GetIntFro
0d10: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 mObj(interp, res
0d20: 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c ult, &ok) != TCL
0d30: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b 20 3d _OK) {.. ok =
0d40: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 1;..}. } els
0d50: 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20 e {../* Error -
0d60: 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 reject the certi
0d70: 66 69 63 61 74 65 20 2a 2f 0a 23 69 66 20 28 54 ficate */.#if (T
0d80: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
0d90: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d == 8) && (TCL_M
0da0: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 INOR_VERSION < 6
0db0: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e )..Tcl_Backgroun
0dc0: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a dError(interp);.
0dd0: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 #else..Tcl_Backg
0de0: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 roundException(i
0df0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 nterp, code);.#e
0e00: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ndif. }..
0e10: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
0e20: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
0e30: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 r);. Tcl_Rele
0e40: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
0e50: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 interp);. re
0e60: 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a turn ok;.}.../*.
0e70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0eb0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f -----. *. * Info
0ec0: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 Callback --. *.
0ed0: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 *.Monitors SSL c
0ee0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 onnection proces
0ef0: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
0f00: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
0f10: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
0f20: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
0f30: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
0f40: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f80: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
0f90: 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 void.InfoCallbac
0fa0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
0fb0: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 , int where, int
0fc0: 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 ret) {. Stat
0fd0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
0fe0: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 tate*)SSL_get_ap
0ff0: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 p_data((SSL *)ss
1000: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 l);. Tcl_Inte
1010: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
1020: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
1030: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
1040: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 tr;. char *ma
1050: 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 jor; char *minor
1060: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
1070: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
1080: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
1090: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
10a0: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e j*)NULL)..return
10b0: 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 ;.. if (where
10c0: 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 & SSL_CB_HANDSH
10d0: 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 AKE_START) {..ma
10e0: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 jor = "handshake
10f0: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 ";..minor = "sta
1100: 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 rt";. } else
1110: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
1120: 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e CB_HANDSHAKE_DON
1130: 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 E) {..major = "h
1140: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f andshake";..mino
1150: 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 r = "done";.
1160: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 } else {..if (wh
1170: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 ere & SSL_CB_ALE
1180: 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c RT)..major = "al
1190: 65 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 ert";..else if (
11a0: 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 where & SSL_ST_C
11b0: 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 ONNECT).major =
11c0: 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 "connect";..else
11d0: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c if (where & SSL
11e0: 5f 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a _ST_ACCEPT)..maj
11f0: 6f 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 or = "accept";..
1200: 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d else.....major =
1210: 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 "unknown";...if
1220: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 (where & SSL_CB
1230: 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 _READ)..minor =
1240: 22 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 "read";..else if
1250: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 (where & SSL_CB
1260: 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d _WRITE)..minor =
1270: 20 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 "write";..else
1280: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
1290: 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 CB_LOOP)..minor
12a0: 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 = "loop";..else
12b0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
12c0: 43 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 CB_EXIT)..minor
12d0: 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 = "exit";..else.
12e0: 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b ....minor = "unk
12f0: 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 nown";. }..
1300: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
1310: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 and to eval */.
1320: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
1330: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
1340: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
1350: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1360: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1370: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1380: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1390: 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 "info", -1));.
13a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
13b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
13c0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
13d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
13e0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
13f0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
1400: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lf), -1));. T
1410: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1420: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1430: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
1440: 74 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 tringObj(major,
1450: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
1460: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1470: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1480: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
1490: 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b Obj(minor, -1));
14a0: 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 .. if (where
14b0: 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 & SSL_CB_ALERT)
14c0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
14d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
14e0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
14f0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1500: 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 j(SSL_alert_desc
1510: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 _string_long(ret
1520: 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ), -1));..Tcl_Li
1530: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1540: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1550: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
1560: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 tringObj(SSL_ale
1570: 72 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c rt_type_string_l
1580: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a ong(ret), -1));.
1590: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
15a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
15b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
15c0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
15d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c NewStringObj(SSL
15e0: 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f _state_string_lo
15f0: 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 ng(ssl), -1));..
1600: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1610: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1620: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
1630: 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 StringObj("info"
1640: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 , -1));. }..
1650: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
1660: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 ack command */.
1670: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
1680: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
1690: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e EvalCallback(in
16a0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
16b0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c cmdPtr);. Tcl
16c0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
16d0: 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a dPtr);.}.../*. *
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1720: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 ---. *. * Messag
1730: 65 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a eCallback --. *.
1740: 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 *.Monitors SSL
1750: 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 protocol message
1760: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
1770: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
1780: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
1790: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
17a0: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
17b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17f0: 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 ----. */.#ifndef
1800: 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f OPENSSL_NO_SSL_
1810: 54 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 TRACE.static voi
1820: 64 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 d.MessageCallbac
1830: 6b 28 69 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 k(int write_p, i
1840: 6e 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 nt version, int
1850: 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f content_type, co
1860: 6e 73 74 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 nst void *buf, s
1870: 69 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a ize_t len, SSL *
1880: 73 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 ssl, void *arg)
1890: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
18a0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
18b0: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 arg;. Tcl_Int
18c0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
18d0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
18e0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
18f0: 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 Ptr;. char *v
1900: 65 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 er, *type;. B
1910: 49 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 IO *bio;. cha
1920: 72 20 62 75 66 66 65 72 5b 31 35 30 30 30 5d 3b r buffer[15000];
1930: 0a 20 20 20 20 62 75 66 66 65 72 5b 30 5d 20 3d . buffer[0] =
1940: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 0;.. dprintf
1950: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
1960: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
1970: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f allback == (Tcl_
1980: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 Obj*)NULL)..retu
1990: 72 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 rn;.. switch(
19a0: 76 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 20 4f version) {.#if O
19b0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
19c0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
19d0: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 00L && !defined(
19e0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 NO_SSL2) && !def
19f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
1a00: 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 53 SSL2). case S
1a10: 53 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 SL2_VERSION:..ve
1a20: 72 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 r = "SSLv2";..br
1a30: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
1a40: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 !defined(NO_SSL3
1a50: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
1a60: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 ENSSL_NO_SSL3).
1a70: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 56 45 52 case SSL3_VER
1a80: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 SION:..ver = "SS
1a90: 4c 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 Lv3";..break;.#e
1aa0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c ndif. case TL
1ab0: 53 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 S1_VERSION:..ver
1ac0: 20 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 = "TLSv1";..bre
1ad0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 ak;. case TLS
1ae0: 31 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 1_1_VERSION:..ve
1af0: 72 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 r = "TLSv1.1";..
1b00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1b10: 54 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a TLS1_2_VERSION:.
1b20: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 .ver = "TLSv1.2"
1b30: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1b40: 73 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f se TLS1_3_VERSIO
1b50: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 N:..ver = "TLSv1
1b60: 2e 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 .3";..break;.
1b70: 20 63 61 73 65 20 30 3a 0a 09 76 65 72 20 3d 20 case 0:..ver =
1b80: 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a "none";..break;.
1b90: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 76 65 default:..ve
1ba0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 r = "unknown";..
1bb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 break;. }..
1bc0: 20 20 73 77 69 74 63 68 20 28 63 6f 6e 74 65 6e switch (conten
1bd0: 74 5f 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61 t_type) {. ca
1be0: 73 65 20 53 53 4c 33 5f 52 54 5f 48 45 41 44 45 se SSL3_RT_HEADE
1bf0: 52 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 64 R:..type = "Head
1c00: 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 er";..break;.
1c10: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e case SSL3_RT_IN
1c20: 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 NER_CONTENT_TYPE
1c30: 3a 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 :..type = "Inner
1c40: 20 43 6f 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a Content Type";.
1c50: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 .break;. case
1c60: 20 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47 45 5f SSL3_RT_CHANGE_
1c70: 43 49 50 48 45 52 5f 53 50 45 43 3a 0a 09 74 79 CIPHER_SPEC:..ty
1c80: 70 65 20 3d 20 22 43 68 61 6e 67 65 20 43 69 70 pe = "Change Cip
1c90: 68 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 her";..break;.
1ca0: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 case SSL3_RT_A
1cb0: 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d 20 22 41 LERT:..type = "A
1cc0: 6c 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 lert";..break;.
1cd0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f case SSL3_RT_
1ce0: 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79 70 65 HANDSHAKE:..type
1cf0: 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22 3b 0a = "Handshake";.
1d00: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 .break;. case
1d10: 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 43 41 SSL3_RT_APPLICA
1d20: 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 70 65 TION_DATA:..type
1d30: 20 3d 20 22 41 70 70 20 44 61 74 61 22 3b 0a 09 = "App Data";..
1d40: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1d50: 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45 DTLS1_RT_HEARTBE
1d60: 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 AT:..type = "Hea
1d70: 72 74 62 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b rtbeat";..break;
1d80: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 . default:..t
1d90: 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b ype = "unknown";
1da0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e . }.. /* N
1db0: 65 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d eeds compile tim
1dc0: 65 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 e option "enable
1dd0: 2d 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a -ssl-trace". */.
1de0: 20 20 20 20 69 66 20 28 28 62 69 6f 20 3d 20 42 if ((bio = B
1df0: 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d IO_new(BIO_s_mem
1e00: 28 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a ())) != NULL) {.
1e10: 09 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 .int n;..SSL_tra
1e20: 63 65 28 77 72 69 74 65 5f 70 2c 20 76 65 72 73 ce(write_p, vers
1e30: 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 ion, content_typ
1e40: 65 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c e, buf, len, ssl
1e50: 2c 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a , (void *)bio);.
1e60: 09 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 .n = BIO_read(bi
1e70: 6f 2c 20 62 75 66 66 65 72 2c 20 6d 69 6e 28 42 o, buffer, min(B
1e80: 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 2c IO_pending(bio),
1e90: 20 31 34 39 39 39 29 29 3b 0a 09 6e 20 3d 20 28 14999));..n = (
1ea0: 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 n<0) ? 0 : n;..b
1eb0: 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 uffer[n] = 0;..(
1ec0: 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 void)BIO_flush(b
1ed0: 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28 62 io);..BIO_free(b
1ee0: 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 2f io);. }.. /
1ef0: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 * Create command
1f00: 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 to eval */.
1f10: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
1f20: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
1f30: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 tr->callback);.
1f40: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
1f50: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
1f60: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
1f70: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 65 NewStringObj("me
1f80: 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20 ssage", -1));.
1f90: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1fa0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1fb0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
1fc0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1fd0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
1fe0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
1ff0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lf), -1));. T
2000: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2010: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2020: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
2030: 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65 5f 70 tringObj(write_p
2040: 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52 65 63 ? "Sent" : "Rec
2050: 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20 eived", -1));.
2060: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2070: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2080: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2090: 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65 72 2c ewStringObj(ver,
20a0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
20b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
20c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
20d0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
20e0: 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29 29 3b gObj(type, -1));
20f0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2100: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2110: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
2120: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 l_NewStringObj(b
2130: 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 uffer, -1));..
2140: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
2150: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
2160: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
2170: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
2180: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
2190: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
21a0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
21b0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
21c0: 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c Ptr);.}.#endif..
21d0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2220: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d VerifyCallback -
2230: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 -. *. *.Monitors
2240: 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65 SSL certificate
2250: 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63 validation proc
2260: 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 6f 6e ess. Used to con
2270: 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 68 61 trol the. *.beha
2280: 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 53 53 vior when the SS
2290: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 66 6c L_VERIFY_PEER fl
22a0: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 ag is set. This
22b0: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 68 65 is called. *.whe
22c0: 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63 never a certific
22d0: 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 ate is inspected
22e0: 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 61 or decided inva
22f0: 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f 72 0a lid. Called for.
2300: 20 2a 09 65 61 63 68 20 63 65 72 74 69 66 69 63 *.each certific
2310: 61 74 65 20 69 6e 20 74 68 65 20 63 65 72 74 20 ate in the cert
2320: 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 68 65 chain.. *. * Che
2330: 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69 66 69 63 cks:. *.certific
2340: 61 74 65 20 63 68 61 69 6e 20 69 73 20 63 68 65 ate chain is che
2350: 63 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 cked starting wi
2360: 74 68 20 74 68 65 20 64 65 65 70 65 73 74 20 6e th the deepest n
2370: 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 esting level. *.
2380: 20 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63 (the root CA c
2390: 65 72 74 69 66 69 63 61 74 65 29 20 61 6e 64 20 ertificate) and
23a0: 77 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f worked upward to
23b0: 20 74 68 65 20 70 65 65 72 27 73 20 63 65 72 74 the peer's cert
23c0: 69 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 ificate.. *.All
23d0: 73 69 67 6e 61 74 75 72 65 73 20 61 72 65 20 76 signatures are v
23e0: 61 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69 alid, current ti
23f0: 6d 65 20 69 73 20 77 69 74 68 69 6e 20 66 69 72 me is within fir
2400: 73 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69 st and last vali
2410: 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68 dity time.. *.Ch
2420: 65 63 6b 20 74 68 61 74 20 74 68 65 20 63 65 72 eck that the cer
2430: 74 69 66 69 63 61 74 65 20 69 73 20 69 73 73 75 tificate is issu
2440: 65 64 20 62 79 20 74 68 65 20 69 73 73 75 65 72 ed by the issuer
2450: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73 certificate iss
2460: 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 uer.. *.Check th
2470: 65 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 e revocation sta
2480: 74 75 73 20 66 6f 72 20 65 61 63 68 20 63 65 72 tus for each cer
2490: 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65 tificate.. *.Che
24a0: 63 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79 20 ck the validity
24b0: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c of the given CRL
24c0: 20 61 6e 64 20 74 68 65 20 63 65 72 74 20 72 65 and the cert re
24d0: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e vocation status.
24e0: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f . *.Check the po
24f0: 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68 licies of all th
2500: 65 20 63 65 72 74 69 66 69 63 61 74 65 73 0a 20 e certificates.
2510: 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65 *. * Args. *.pre
2520: 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61 verify_ok indica
2530: 74 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20 tes whether the
2540: 63 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69 certificate veri
2550: 66 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20 fication passed
2560: 28 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20 (1) or not (0).
2570: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
2580: 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e .A callback boun
2590: 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 d to the socket
25a0: 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f may return one o
25b0: 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20 f:. *. 0...-
25c0: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
25d0: 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 is deemed invali
25e0: 64 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63 61 d, send verifica
25f0: 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69 tion. *.... fai
2600: 6c 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65 lure alert to pe
2610: 65 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 er, and terminat
2620: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 e handshake.. *.
2630: 20 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 1...- the ce
2640: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 rtificate is dee
2650: 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69 med valid, conti
2660: 6e 75 65 20 77 69 74 68 20 68 61 6e 64 73 68 61 nue with handsha
2670: 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 ke.. *. empty
2680: 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 string.- no cha
2690: 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 63 61 nge to certifica
26a0: 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a te validation. *
26b0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
26c0: 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 :. *.The err fie
26d0: 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e ld of the curren
26e0: 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 tly operative St
26f0: 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 ate is set. *.
2700: 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 to a string desc
2710: 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e ribing the SSL n
2720: 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 egotiation failu
2730: 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d re reason. *. *-
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2780: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
2790: 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b t.VerifyCallback
27a0: 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 (int ok, X509_ST
27b0: 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a ORE_CTX *ctx) {.
27c0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
27d0: 50 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a Ptr;. SSL *
27e0: 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30 ssl..= (SSL*)X50
27f0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 9_STORE_CTX_get_
2800: 65 78 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c ex_data(ctx, SSL
2810: 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 _get_ex_data_X50
2820: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 9_STORE_CTX_idx(
2830: 29 29 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63 ));. X509 *c
2840: 65 72 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 ert..= X509_STOR
2850: 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e E_CTX_get_curren
2860: 74 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20 t_cert(ctx);.
2870: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
2880: 09 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 .= (State*)SSL_g
2890: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29 et_app_data(ssl)
28a0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
28b0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
28c0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
28d0: 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35 int depth..= X5
28e0: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
28f0: 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78 _error_depth(ctx
2900: 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09 );. int err..
2910: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 = X509_STORE_CTX
2920: 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b _get_error(ctx);
2930: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 .. dprintf("V
2940: 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29 3b erify: %d", ok);
2950: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
2960: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c tr->vcmd == (Tcl
2970: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69 _Obj*)NULL) {..i
2980: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c f (statePtr->vfl
2990: 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59 ags & SSL_VERIFY
29a0: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 _FAIL_IF_NO_PEER
29b0: 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 72 65 _CERT) {.. re
29c0: 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 turn ok;..} else
29d0: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31 {.. return 1
29e0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
29f0: 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c 4c if (cert == NULL
2a00: 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 || ssl == NULL)
2a10: 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 {..return 0;.
2a20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
2a30: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
2a40: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 al */. cmdPtr
2a50: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
2a60: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 Obj(statePtr->vc
2a70: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 md);. Tcl_Lis
2a80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2a90: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2aa0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
2ab0: 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 bj("verify", -1)
2ac0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2ad0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2ae0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
2af0: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 .Tcl_NewStringOb
2b00: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
2b10: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
2b20: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
2b30: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2b40: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2b50: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2b60: 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a IntObj(depth));.
2b70: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2b80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2b90: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 erp, cmdPtr, Tls
2ba0: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 _NewX509Obj(inte
2bb0: 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 rp, cert));.
2bc0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2bd0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2be0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2bf0: 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 IntObj(ok));.
2c00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2c10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2c20: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e , cmdPtr,..Tcl_N
2c30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 ewStringObj((cha
2c40: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 r*)X509_verify_c
2c50: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 ert_error_string
2c60: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 (err), -1));..
2c70: 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f /* Prevent I/O
2c80: 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 while callback
2c90: 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a is in progress *
2ca0: 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 /. /* statePt
2cb0: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
2cc0: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f TCL_CALLBACK; */
2cd0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
2ce0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
2cf0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
2d00: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
2d10: 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c ok = EvalCal
2d20: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
2d30: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b atePtr, cmdPtr);
2d40: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
2d50: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a Count(cmdPtr);..
2d60: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d /* statePtr-
2d70: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f >flags &= ~(TLS_
2d80: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a TCL_CALLBACK); *
2d90: 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 /. return(ok)
2da0: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c ;./* By default,
2db0: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 leave verificat
2dc0: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a ion unchanged. *
2dd0: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d /.}.../*. *-----
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2e20: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d *. * Tls_Error -
2e30: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 -. *. *.Calls ca
2e40: 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74 llback with list
2e50: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 of errors.. *.
2e60: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
2e70: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 *.The err field
2e80: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c of the currentl
2e90: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 y operative Stat
2ea0: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f e is set. *. to
2eb0: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 a string descri
2ec0: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 bing the SSL neg
2ed0: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 otiation failure
2ee0: 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d reason. *. *---
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f30: 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 . */.void.Tls_Er
2f40: 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 ror(State *state
2f50: 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20 Ptr, char *msg)
2f60: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 {. Tcl_Interp
2f70: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
2f80: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
2f90: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
2fa0: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 , *listPtr;.
2fb0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 unsigned long er
2fc0: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d r;. statePtr-
2fd0: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 >err = msg;..
2fe0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
2ff0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
3000: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
3010: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
3020: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 L)..return;..
3030: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
3040: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
3050: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
3060: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
3070: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
3080: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
3090: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
30a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
30b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
30c0: 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 error", -1));.
30d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
30e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
30f0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
3100: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
3110: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
3120: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
3130: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 lf), -1));. i
3140: 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20 f (msg != NULL)
3150: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
3160: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3170: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
3180: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 NewStringObj(msg
3190: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 , -1));.. } e
31a0: 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54 lse if ((msg = T
31b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
31c0: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 Obj(Tcl_GetObjRe
31d0: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 28 54 sult(interp), (T
31e0: 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 cl_Size *) NULL)
31f0: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 ) != NULL) {..Tc
3200: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3210: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3220: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
3230: 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 ringObj(msg, -1)
3240: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b );.. } else {
3250: 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f ..listPtr = Tcl_
3260: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
3270: 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65 72 LL);..while ((er
3280: 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f r = ERR_get_erro
3290: 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20 20 r()) != 0) {..
32a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
32b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
32c0: 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f p, listPtr, Tcl_
32d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52 52 NewStringObj(ERR
32e0: 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 _reason_error_st
32f0: 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b ring(err), -1));
3300: 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ..}..Tcl_ListObj
3310: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3320: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c 69 terp, cmdPtr, li
3330: 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 stPtr);. }..
3340: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
3350: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 ack command */.
3360: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
3370: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
3380: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e EvalCallback(in
3390: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
33a0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c cmdPtr);. Tcl
33b0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
33c0: 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a dPtr);.}.../*. *
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3410: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 ---. *. * KeyLog
3420: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 Callback --. *.
3430: 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 64 *.Write received
3440: 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f 67 key data to log
3450: 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 file.. *. * Sid
3460: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f e effects:. *.no
3470: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ne. *. *--------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
34c0: 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 void KeyLogCallb
34d0: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
34e0: 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a sl, const char *
34f0: 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 line) {. char
3500: 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 *str = getenv(S
3510: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 SLKEYLOGFILE);.
3520: 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 FILE *fd;..
3530: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
3540: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
3550: 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e r) {..fd = fopen
3560: 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 72 (str, "a");..fpr
3570: 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c intf(fd, "%s\n",
3580: 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66 line);..fclose(f
3590: 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a d);. }.}.../*
35a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 ------. *. * Pas
35f0: 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d sword Callback -
3600: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 -. *. *.Called w
3610: 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 66 hen a password f
3620: 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65 79 or a private key
3630: 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69 6e 67 loading/storing
3640: 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 74 69 66 a PEM. *.certif
3650: 69 63 61 74 65 20 77 69 74 68 20 65 6e 63 72 79 icate with encry
3660: 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c ption. Evals cal
3670: 6c 62 61 63 6b 20 73 63 72 69 70 74 20 61 6e 64 lback script and
3680: 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 68 65 20 returns. *.the
3690: 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 70 61 result as the pa
36a0: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69 6e ssword string in
36b0: 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 buf.. *. * Resu
36c0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
36d0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
36e0: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
36f0: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
3700: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
3710: 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65 20 *.Password size
3720: 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20 66 in bytes or -1 f
3730: 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a or an error.. *.
3740: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3780: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
3790: 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c int.PasswordCal
37a0: 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c lback(char *buf,
37b0: 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 int size, int r
37c0: 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 wflag, void *uda
37d0: 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 ta) {. State
37e0: 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 *statePtr.= (Sta
37f0: 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 te *) udata;.
3800: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
3810: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
3820: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
3830: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
3840: 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 int code;..
3850: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
3860: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f );.. /* If no
3870: 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64 callback, use d
3880: 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20 efault callback
3890: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
38a0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d Ptr->password ==
38b0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 NULL) {..if (Tc
38c0: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c l_EvalEx(interp,
38d0: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 "tls::password"
38e0: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 , -1, TCL_EVAL_G
38f0: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b LOBAL) == TCL_OK
3900: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 ) {.. char *r
3910: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 et = (char *) Tc
3920: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c l_GetStringResul
3930: 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 t(interp);..
3940: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 strncpy(buf, ret
3950: 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 , (size_t) size)
3960: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 ;.. return (i
3970: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a nt)strlen(ret);.
3980: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 .} else {.. r
3990: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 eturn -1;..}.
39a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
39b0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
39c0: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 l */. cmdPtr
39d0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
39e0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 bj(statePtr->pas
39f0: 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c 5f sword);. Tcl_
3a00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3a10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3a20: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
3a30: 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64 22 ngObj("password"
3a40: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
3a50: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3a60: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3a70: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
3a80: 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20 20 bj(rwflag));.
3a90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3aa0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3ab0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
3ac0: 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b 0a wIntObj(size));.
3ad0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 . Tcl_Preserv
3ae0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
3af0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f nterp);. Tcl_
3b00: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
3b10: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
3b20: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
3b30: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
3b40: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
3b50: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
3b60: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 code = Tcl_E
3b70: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c valObjEx(interp,
3b80: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 cmdPtr, TCL_EVA
3b90: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 L_GLOBAL);. i
3ba0: 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f f (code != TCL_O
3bb0: 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 K) {.#if (TCL_MA
3bc0: 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 JOR_VERSION == 8
3bd0: 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f ) && (TCL_MINOR_
3be0: 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 VERSION < 6)..Tc
3bf0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f l_BackgroundErro
3c00: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 r(interp);.#else
3c10: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
3c20: 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 Exception(interp
3c30: 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a , code);.#endif.
3c40: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
3c50: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
3c60: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c r);.. Tcl_Rel
3c70: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 ease((ClientData
3c80: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 ) statePtr);..
3c90: 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73 66 /* If successf
3ca0: 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70 61 ul, pass back pa
3cb0: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61 6e ssword string an
3cc0: 64 20 74 72 75 6e 63 61 74 65 20 69 66 20 74 6f d truncate if to
3cd0: 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 o long */. if
3ce0: 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b (code == TCL_OK
3cf0: 29 20 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c 65 ) {..Tcl_Size le
3d00: 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 n;..char *ret =
3d10: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
3d20: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
3d30: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
3d40: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 nterp), &len);..
3d50: 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 if (len > (Tcl_S
3d60: 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 ize) size-1) {..
3d70: 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 len = (Tcl_S
3d80: 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a ize) size-1;..}.
3d90: 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 .strncpy(buf, re
3da0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 t, (size_t) len)
3db0: 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c ;..buf[len] = '\
3dc0: 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 0';..Tcl_Release
3dd0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
3de0: 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 28 terp);..return((
3df0: 69 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20 20 7d int) len);. }
3e00: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 . Tcl_Release
3e10: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
3e20: 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 terp);. retur
3e30: 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d n -1;.}.../*. *-
3e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e80: 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e --. *. * Session
3e90: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c Callback for Cl
3ea0: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 ients --. *. *.C
3eb0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 alled when a new
3ec0: 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64 65 session is adde
3ed0: 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20 d to the cache.
3ee0: 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 In TLS 1.3. *.th
3ef0: 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 69 76 is may be receiv
3f00: 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 ed multiple time
3f10: 73 20 61 66 74 65 72 20 74 68 65 20 68 61 6e 64 s after the hand
3f20: 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 shake. For. *.ea
3f30: 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 rlier versions,
3f40: 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 63 this will be rec
3f50: 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 68 65 eived during the
3f60: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 handshake.. *.T
3f70: 68 69 73 20 69 73 20 74 68 65 20 70 72 65 66 65 his is the prefe
3f80: 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74 61 rred way to obta
3f90: 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20 73 in a resumable s
3fa0: 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 ession.. *. * Re
3fb0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
3fc0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
3fd0: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
3fe0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
3ff0: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 ). *. * Return c
4000: 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 odes:. *.0 = err
4010: 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 6f 6e or where session
4020: 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 will be immedia
4030: 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f tely removed fro
4040: 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 m the internal c
4050: 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 ache.. *.1 = suc
4060: 63 65 73 73 20 77 68 65 72 65 20 61 70 70 20 72 cess where app r
4070: 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 etains session i
4080: 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65 2c n session cache,
4090: 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 and must call S
40a0: 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 SL_SESSION_free(
40b0: 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a ) when done.. *.
40c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4100: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
4110: 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c int.SessionCall
4120: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a back(const SSL *
4130: 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e ssl, SSL_SESSION
4140: 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 20 *session) {.
4150: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
4160: 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 = (State*)SSL_g
4170: 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c et_app_data((SSL
4180: 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c *)ssl);. Tcl
4190: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
41a0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
41b0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
41c0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e *cmdPtr;. con
41d0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
41e0: 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 6f *ticket;. co
41f0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4200: 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 20 r *session_id;.
4210: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a size_t len2;.
4220: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
4230: 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 ulen;.. dpri
4240: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
4250: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
4260: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
4270: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
4280: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4290: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
42a0: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d else if (ssl ==
42b0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
42c0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
42d0: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
42e0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
42f0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 and to eval */.
4300: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
4310: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
4320: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
4330: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
4340: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
4350: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
4360: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
4370: 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b "session", -1));
4380: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4390: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
43a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
43b0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
43c0: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
43d0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
43e0: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 >self), -1));..
43f0: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 /* Session id
4400: 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f */. session_
4410: 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e id = SSL_SESSION
4420: 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c _get_id(session,
4430: 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c &ulen);. Tcl
4440: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4450: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4460: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 dPtr, Tcl_NewByt
4470: 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f eArrayObj(sessio
4480: 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 n_id, (Tcl_Size)
4490: 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a ulen));.. /*
44a0: 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 Session ticket
44b0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 */. SSL_SESSI
44c0: 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 ON_get0_ticket(s
44d0: 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c ession, &ticket,
44e0: 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c &len2);. Tcl
44f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4500: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4510: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 dPtr, Tcl_NewByt
4520: 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 eArrayObj(ticket
4530: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e , (Tcl_Size) len
4540: 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 2));.. /* Lif
4550: 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f etime - number o
4560: 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 f seconds */.
4570: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4580: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4590: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e , cmdPtr,..Tcl_N
45a0: 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 ewLongObj((long)
45b0: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
45c0: 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 _ticket_lifetime
45d0: 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 _hint(session)))
45e0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
45f0: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
4600: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
4610: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
4620: 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 . EvalCallbac
4630: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
4640: 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 tr, cmdPtr);.
4650: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
4660: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 t(cmdPtr);. r
4670: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a eturn 0;.}.../*.
4680: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46c0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e -----. *. * ALPN
46d0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 Callback for Se
46e0: 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 rvers and NPN Ca
46f0: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e llback for Clien
4700: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 ts --. *. *.Perf
4710: 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 orm protocol (ht
4720: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 tp/1.1, h2, h3,
4730: 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 etc.) selection
4740: 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d for the. *.incom
4750: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 ing connection.
4760: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c Called after Hel
4770: 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 lo and server ca
4780: 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 llbacks.. *.Wher
4790: 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 e 'out' is selec
47a0: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 ted protocol and
47b0: 20 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 'in' is the pee
47c0: 72 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 r advertised lis
47d0: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 t.. *. * Results
47e0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.None. *. *
47f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
4800: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 .Calls callback
4810: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a (if defined). *.
4820: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a * Return codes:
4830: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
4840: 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 RR_OK: ALPN prot
4850: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 ocol selected. T
4860: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
4870: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f ntinues.. *.SSL_
4880: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 TLSEXT_ERR_ALERT
4890: 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 _FATAL: There wa
48a0: 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 s no overlap bet
48b0: 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 ween the client'
48c0: 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 s. *. supplie
48d0: 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 d list and the s
48e0: 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 erver configurat
48f0: 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ion. The connect
4900: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 ion will be abor
4910: 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ted.. *.SSL_TLSE
4920: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c XT_ERR_NOACK: AL
4930: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 PN protocol not
4940: 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 selected, e.g.,
4950: 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a because no ALPN.
4960: 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 *. protocols
4970: 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 are configured
4980: 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 for this connect
4990: 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ion. The connect
49a0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
49b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
4a00: 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 ic int.ALPNCallb
4a10: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
4a20: 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e sl, const unsign
4a30: 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 ed char **out, u
4a40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 nsigned char *ou
4a50: 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 tlen,..const uns
4a60: 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 igned char *in,
4a70: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c unsigned int inl
4a80: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b en, void *arg) {
4a90: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
4aa0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
4ab0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
4ac0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
4ad0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
4ae0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
4af0: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
4b00: 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 , res;.. dpri
4b10: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
4b20: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e if (ssl == N
4b30: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 ULL || arg == NU
4b40: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
4b50: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
4b60: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f CK;. }.. /
4b70: 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f * Select protoco
4b80: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c l */. if (SSL
4b90: 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f _select_next_pro
4ba0: 74 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 to(out, outlen,
4bb0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
4bc0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 , statePtr->prot
4bd0: 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c os_len,..in, inl
4be0: 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e en) == OPENSSL_N
4bf0: 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b PN_NEGOTIATED) {
4c00: 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 ../* Match found
4c10: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 */..res = SSL_T
4c20: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 LSEXT_ERR_OK;.
4c30: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f } else {../* O
4c40: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 PENSSL_NPN_NO_OV
4c50: 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c ERLAP = No overl
4c60: 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 ap, so use first
4c70: 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e item from clien
4c80: 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 t protocol list
4c90: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c */..res = SSL_TL
4ca0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4cb0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
4cc0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d tatePtr->vcmd ==
4cd0: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 (Tcl_Obj*)NULL)
4ce0: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a {..return res;.
4cf0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
4d00: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
4d10: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
4d20: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
4d30: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
4d40: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
4d50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4d60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4d70: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
4d80: 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 gObj("alpn", -1)
4d90: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
4da0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
4db0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
4dc0: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
4dd0: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 ngObj(Tcl_GetCha
4de0: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
4df0: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a r->self), -1));.
4e00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4e10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4e20: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
4e30: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f _NewStringObj(*o
4e40: 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 ut, -1));. Tc
4e50: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4e60: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4e70: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f mdPtr, Tcl_NewBo
4e80: 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 oleanObj(res ==
4e90: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
4ea0: 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 K));.. /* Eva
4eb0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
4ec0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
4ed0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
4ee0: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 r);. if ((cod
4ef0: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b e = EvalCallback
4f00: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
4f10: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 r, cmdPtr)) > 1)
4f20: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
4f30: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4f40: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
4f50: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 ode == 1) {..res
4f60: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 = SSL_TLSEXT_ER
4f70: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 R_OK;. } else
4f80: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
4f90: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 SEXT_ERR_ALERT_F
4fa0: 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ATAL;. }.
4fb0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
4fc0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 (cmdPtr);. re
4fd0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a turn res;.}.../*
4fe0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5020: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 ------. *. * Adv
5030: 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 ertise Protocols
5040: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 Callback for Ne
5050: 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f xt Protocol Nego
5060: 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e tiation (NPN) in
5070: 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a ServerHello --.
5080: 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 *. *.called whe
5090: 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e n a TLS server n
50a0: 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73 eeds a list of s
50b0: 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f upported protoco
50c0: 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 ls for Next. *.P
50d0: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 rotocol Negotiat
50e0: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ion.. *. * Resul
50f0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
5100: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
5110: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
5120: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
5130: 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 T_ERR_OK: NPN pr
5140: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e otocol selected.
5150: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
5160: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
5170: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
5180: 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c CK: NPN protocol
5190: 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54 not selected. T
51a0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
51b0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d ntinues.. *. *--
51c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5200: 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 -. */.#ifdef USE
5210: 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a _NPN.static int.
5220: 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 NPNCallback(cons
5230: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 t SSL *ssl, cons
5240: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
5250: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 **out, unsigned
5260: 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 int *outlen, voi
5270: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 d *arg) {. St
5280: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
5290: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 (State*)arg;..
52a0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
52b0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 d");.. if (ss
52c0: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 l == NULL || arg
52d0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
52e0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
52f0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
5300: 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 . /* Set prot
5310: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 ocols list */.
5320: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
5330: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 protos != NULL)
5340: 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 {..*out = stateP
5350: 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 tr->protos;..*ou
5360: 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d tlen = statePtr-
5370: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 >protos_len;.
5380: 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 } else {..*out
5390: 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e = NULL;..*outlen
53a0: 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 = 0;..return SS
53b0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
53c0: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 CK;. }. re
53d0: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
53e0: 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 ERR_OK;.}.#endif
53f0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
5400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
5440: 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 * SNI Callback f
5450: 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a or Servers --. *
5460: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 . *.Perform serv
5470: 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 er-side SNI host
5480: 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 name selection a
5490: 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 fter receiving S
54a0: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 NI extension. *.
54b0: 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e in Client Hello.
54c0: 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 Called after he
54d0: 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 llo callback but
54e0: 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c before ALPN cal
54f0: 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
5500: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
5510: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
5520: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
5530: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
5540: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
5550: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 des:. *.SSL_TLSE
5560: 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 XT_ERR_OK: SNI h
5570: 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 ostname is accep
5580: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
5590: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
55a0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
55b0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e _ALERT_FATAL: SN
55c0: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
55d0: 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 t accepted. The
55e0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 connection. *.
55f0: 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 is aborted. De
5600: 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 fault for alert
5610: 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f is SSL_AD_UNRECO
5620: 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 GNIZED_NAME.. *.
5630: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5640: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e LERT_WARNING: SN
5650: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
5660: 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e t accepted, warn
5670: 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 ing alert. *.
5680: 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f sent (not suppo
5690: 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 rted in TLSv1.3)
56a0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
56b0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
56c0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
56d0: 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d ACK: SNI hostnam
56e0: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 e is not accepte
56f0: 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 d and not acknow
5700: 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 ledged,. *. e
5710: 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e .g. if SNI has n
5720: 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 ot been configur
5730: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
5740: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
5750: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5790: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
57a0: 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 c int.SNICallbac
57b0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
57c0: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f , int *alert, vo
57d0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
57e0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
57f0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
5800: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
5810: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
5820: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
5830: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
5840: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
5850: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 . char *serve
5860: 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 rname = NULL;..
5870: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
5880: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
5890: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 sl == NULL || ar
58a0: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 g == NULL) {..re
58b0: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
58c0: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
58d0: 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f .. /* Only wo
58e0: 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 rks for TLS 1.2
58f0: 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 and earlier */.
5900: 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 servername =
5910: 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 SSL_get_serverna
5920: 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e me(ssl, TLSEXT_N
5930: 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d AMETYPE_host_nam
5940: 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72 e);. if (!ser
5950: 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 vername || serve
5960: 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 rname[0] == '\0'
5970: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
5980: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
5990: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
59a0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 (statePtr->vcmd
59b0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
59c0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
59d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
59e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
59f0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
5a00: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
5a10: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
5a20: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
5a30: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
5a40: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5a50: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5a60: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
5a70: 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 gObj("sni", -1))
5a80: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
5a90: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5aa0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
5ab0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
5ac0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
5ad0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
5ae0: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
5af0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5b00: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5b10: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
5b20: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 NewStringObj(ser
5b30: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a vername , -1));.
5b40: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
5b50: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
5b60: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
5b70: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
5b80: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 if ((code = E
5b90: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
5ba0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
5bb0: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 dPtr)) > 1) {..r
5bc0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
5bd0: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e ERR_ALERT_WARNIN
5be0: 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c G;..*alert = SSL
5bf0: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 _AD_UNRECOGNIZED
5c00: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 _NAME; /* Not su
5c10: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 pported by TLS 1
5c20: 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 .3 */. } else
5c30: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
5c40: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
5c50: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
5c60: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
5c70: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5c80: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c LERT_FATAL;..*al
5c90: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 ert = SSL_AD_UNR
5ca0: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 ECOGNIZED_NAME;
5cb0: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 /* Not supported
5cc0: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 by TLS 1.3 */.
5cd0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
5ce0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
5cf0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 );. return re
5d00: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d s;.}.../*. *----
5d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
5d50: 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c *. * ClientHell
5d60: 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c o Handshake Call
5d70: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 back for Servers
5d80: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 --. *. *.Used b
5d90: 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d y server to exam
5da0: 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e ine the server n
5db0: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 ame indication (
5dc0: 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 SNI) extension.
5dd0: 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 *.provided by th
5de0: 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 e client in orde
5df0: 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 r to select an a
5e00: 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 ppropriate certi
5e10: 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 ficate to. *.pre
5e20: 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f sent, and make o
5e30: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 ther configurati
5e40: 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 on adjustments r
5e50: 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 elevant to that
5e60: 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 server. *.name a
5e70: 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 nd its configura
5e80: 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 tion. This inclu
5e90: 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 des swapping out
5ea0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a the associated.
5eb0: 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 *.SSL_CTX point
5ec0: 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 er, modifying th
5ed0: 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 e server's list
5ee0: 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 of permitted TLS
5ef0: 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 versions,. *.ch
5f00: 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 anging the serve
5f10: 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 r's cipher list
5f20: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 in response to t
5f30: 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 he client's ciph
5f40: 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a er list, etc.. *
5f50: 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 .Called before S
5f60: 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c NI and ALPN call
5f70: 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 backs.. *. * Res
5f80: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
5f90: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
5fa0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
5fb0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
5fc0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
5fd0: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 des:. *.SSL_CLIE
5fe0: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 NT_HELLO_RETRY:
5ff0: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 suspend the hand
6000: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 shake, and the h
6010: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f andshake functio
6020: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d n will return im
6030: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c mediately. *.SSL
6040: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6050: 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 ROR: failure, te
6060: 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 rminate connecti
6070: 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f on. Set alert to
6080: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 error code.. *.
6090: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
60a0: 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 _SUCCESS: succes
60b0: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d s. *. *---------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
6100: 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 tatic int.HelloC
6110: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
6120: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
6130: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
6140: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
6150: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
6160: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
6170: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
6180: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
6190: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
61a0: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
61b0: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 , res;. const
61c0: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
61d0: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
61e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 igned char *p;.
61f0: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 size_t len, r
6200: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 emaining;.. d
6210: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
6220: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
6230: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 Ptr->vcmd == (Tc
6240: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
6250: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6260: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b T_HELLO_SUCCESS;
6270: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
6280: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 ssl == (const SS
6290: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 L *)NULL || arg
62a0: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 == (void *)NULL)
62b0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 {..return SSL_C
62c0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
62d0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
62e0: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 Get names */.
62f0: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e if (!SSL_clien
6300: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 t_hello_get0_ext
6310: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 (ssl, TLSEXT_TYP
6320: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 E_server_name, &
6330: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c p, &remaining) |
6340: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 | remaining <= 2
6350: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
6360: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f L_R_SSLV3_ALERT_
6370: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 ILLEGAL_PARAMETE
6380: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 R;..return SSL_C
6390: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
63a0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
63b0: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e Extract the len
63c0: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c gth of the suppl
63d0: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 ied list of name
63e0: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 s. */. len =
63f0: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 (*(p++) << 8);.
6400: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 len += *(p++)
6410: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 ;. if (len +
6420: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 2 != remaining)
6430: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
6440: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c R_SSLV3_ALERT_IL
6450: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b LEGAL_PARAMETER;
6460: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
6470: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
6480: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 . }. remai
6490: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 ning = len;..
64a0: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 /* The list in
64b0: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 practice only ha
64c0: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 s a single eleme
64d0: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 nt, so we only c
64e0: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 onsider the firs
64f0: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 t one. */. if
6500: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 (remaining == 0
6510: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 || *p++ != TLSE
6520: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 XT_NAMETYPE_host
6530: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 _name) {..*alert
6540: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
6550: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
6560: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c ROR;..return SSL
6570: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6580: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
6590: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 emaining--;..
65a0: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 /* Now we can f
65b0: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 inally pull out
65c0: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 the byte array w
65d0: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 ith the actual h
65e0: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 ostname. */.
65f0: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d if (remaining <=
6600: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 2) {..*alert =
6610: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
6620: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 T_INTERNAL_ERROR
6630: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
6640: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
6650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 ;. }. len
6660: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b = (*(p++) << 8);
6670: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b . len += *(p+
6680: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 +);. if (len
6690: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 + 2 > remaining)
66a0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
66b0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
66c0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
66d0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
66e0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
66f0: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
6700: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 ng = len;. se
6710: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 rvername = (cons
6720: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 t char *)p;..
6730: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
6740: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
6750: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
6760: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
6770: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
6780: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
6790: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
67a0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
67b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c wStringObj("hell
67c0: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 o", -1));. Tc
67d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
67e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
67f0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
6800: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
6810: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
6820: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
6830: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
6840: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
6850: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
6860: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
6870: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c gObj(servername,
6880: 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 (Tcl_Size) len)
6890: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 );.. /* Eval
68a0: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
68b0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
68c0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
68d0: 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 ;. if ((code
68e0: 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 = EvalCallback(i
68f0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
6900: 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b cmdPtr)) > 1) {
6910: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 ..res = SSL_CLIE
6920: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a NT_HELLO_RETRY;.
6930: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f .*alert = SSL_R_
6940: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 TLSV1_ALERT_USER
6950: 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 _CANCELLED;.
6960: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
6970: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
6980: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
6990: 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 SUCCESS;. } e
69a0: 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c lse {..res = SSL
69b0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
69c0: 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 ROR;..*alert = S
69d0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 SL_R_TLSV1_ALERT
69e0: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b _INTERNAL_ERROR;
69f0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
6a00: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
6a10: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
6a20: 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a res;.}.../******
6a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
6a40: 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 /* Commands
6a50: 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a */./********
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f ************/../
6a70: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
6a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ab0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 -------. *. * Ci
6ac0: 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c phersObjCmd -- l
6ad0: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 ist available ci
6ae0: 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 phers. *. *.This
6af0: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
6b00: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 voked to process
6b10: 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 the "tls::ciphe
6b20: 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 rs" command. *.t
6b30: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 o list available
6b40: 20 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 ciphers, based
6b50: 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 upon protocol se
6b60: 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 lected.. *. * Re
6b70: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
6b80: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 dard Tcl result
6b90: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 list.. *. * Side
6ba0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e effects:. *.con
6bb0: 73 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 structs and dest
6bc0: 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 roys SSL context
6bd0: 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d (CTX). *. *----
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
6c20: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 */.static const
6c30: 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 char *protocols
6c40: 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 [] = {.."ssl2",
6c50: 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 "ssl3", "tls1",
6c60: 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e "tls1.1", "tls1.
6c70: 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 2", "tls1.3", NU
6c80: 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f LL.};.enum proto
6c90: 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 col {. TLS_SS
6ca0: 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c L2, TLS_SSL3, TL
6cb0: 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 S_TLS1, TLS_TLS1
6cc0: 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 _1, TLS_TLS1_2,
6cd0: 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f TLS_TLS1_3, TLS_
6ce0: 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 NONE.};..static
6cf0: 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d int.CiphersObjCm
6d00: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
6d10: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
6d20: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
6d30: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
6d40: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
6d50: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
6d60: 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 Ptr = NULL;.
6d70: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e SSL_CTX *ctx = N
6d80: 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 ULL;. SSL *ss
6d90: 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 l = NULL;. ST
6da0: 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 ACK_OF(SSL_CIPHE
6db0: 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 R) *sk;. char
6dc0: 20 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 49 5a *cp, buf[BUFSIZ
6dd0: 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 ];. int index
6de0: 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 , verbose = 0, u
6df0: 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 se_supported = 0
6e00: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f ;. const SSL_
6e10: 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a METHOD *method;.
6e20: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
6e30: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
6e40: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 ((objc < 2) || (
6e50: 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 objc > 4)) {..Tc
6e60: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
6e70: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
6e80: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f "protocol ?verbo
6e90: 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 se? ?supported?"
6ea0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
6eb0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
6ec0: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
6ed0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
6ee0: 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f objv[1], protoco
6ef0: 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 ls, "protocol",
6f00: 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 0, &index) != TC
6f10: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
6f20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
6f30: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e . if ((objc >
6f40: 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 2) && Tcl_GetBo
6f50: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 oleanFromObj(int
6f60: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 erp, objv[2], &v
6f70: 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f erbose) != TCL_O
6f80: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
6f90: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
6fa0: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 if ((objc > 3)
6fb0: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 && Tcl_GetBoole
6fc0: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 anFromObj(interp
6fd0: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f , objv[3], &use_
6fe0: 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 supported) != TC
6ff0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
7000: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7010: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f .. ERR_clear_
7020: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 error();.. sw
7030: 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 itch ((enum prot
7040: 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 ocol)index) {..c
7050: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 ase TLS_SSL2:.#i
7060: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
7070: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 N_NUMBER >= 0x10
7080: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 100000L || defin
7090: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 ed(NO_SSL2) || d
70a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
70b0: 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c O_SSL2).. Tcl
70c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
70d0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
70e0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
70f0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
7100: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 d", NULL);..
7110: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7120: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 ;.#else.. met
7130: 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 hod = SSLv2_meth
7140: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e od(); break;.#en
7150: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 dif..case TLS_SS
7160: 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 L3:.#if defined(
7170: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 NO_SSL3) || defi
7180: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
7190: 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 SL3) || defined(
71a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f OPENSSL_NO_SSL3_
71b0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c METHOD).. Tcl
71c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
71d0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
71e0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
71f0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
7200: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 d", NULL);..
7210: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7220: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 ;.#else.. met
7230: 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 hod = SSLv3_meth
7240: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e od(); break;.#en
7250: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c dif..case TLS_TL
7260: 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 S1:.#if defined(
7270: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 NO_TLS1) || defi
7280: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
7290: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
72a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
72b0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c METHOD).. Tcl
72c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
72d0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
72e0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
72f0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
7300: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 d", NULL);..
7310: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7320: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 ;.#else.. met
7330: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 hod = TLSv1_meth
7340: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e od(); break;.#en
7350: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c dif..case TLS_TL
7360: 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 S1_1:.#if define
7370: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 d(NO_TLS1_1) ||
7380: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7390: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
73a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
73b0: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a _TLS1_1_METHOD).
73c0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
73d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
73e0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
73f0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
7400: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
7410: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
7420: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
7430: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c . method = TL
7440: 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20 Sv1_1_method();
7450: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
7460: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a ase TLS_TLS1_2:.
7470: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
7480: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
7490: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
74a0: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
74b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
74c0: 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 2_METHOD).. T
74d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
74e0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
74f0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
7500: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
7510: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
7520: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7530: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
7540: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f ethod = TLSv1_2_
7550: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b method(); break;
7560: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
7570: 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 S_TLS1_3:.#if de
7580: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
7590: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
75a0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 SSL_NO_TLS1_3)..
75b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
75c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
75d0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
75e0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
75f0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
7600: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
7610: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
7620: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 method = TLS
7630: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 _method();..
7640: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f SSL_CTX_set_min_
7650: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
7660: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f x, TLS1_3_VERSIO
7670: 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 N);.. SSL_CTX
7680: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 _set_max_proto_v
7690: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
76a0: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 _3_VERSION);..
76b0: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a break;.#endif.
76c0: 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 6d .default:.. m
76d0: 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 ethod = TLS_meth
76e0: 6f 64 28 29 3b 0a 09 20 20 20 20 62 72 65 61 6b od();.. break
76f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 78 ;. }.. ctx
7700: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d = SSL_CTX_new(m
7710: 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 ethod);. if (
7720: 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ctx == NULL) {..
7730: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7740: 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 (interp, REASON(
7750: 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ), NULL);..retur
7760: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
7770: 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 }.. ssl = SS
7780: 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 L_new(ctx);.
7790: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 if (ssl == NULL)
77a0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
77b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 sult(interp, REA
77c0: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 SON(), NULL);..S
77d0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
77e0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
77f0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
7800: 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 /* Use list and
7810: 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 order as would b
7820: 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 e sent in a Clie
7830: 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 ntHello or all a
7840: 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 vailable ciphers
7850: 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f */. if (use_
7860: 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b supported) {..sk
7870: 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 = SSL_get1_supp
7880: 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 orted_ciphers(ss
7890: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b l);. } else {
78a0: 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 ..sk = SSL_get_c
78b0: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 iphers(ssl);.
78c0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 }.. if (sk !
78d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 = NULL) {..if (!
78e0: 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 verbose) {..
78f0: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
7900: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
7910: 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 ;.. for (int
7920: 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 i = 0; i < sk_SS
7930: 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 L_CIPHER_num(sk)
7940: 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 ; i++) {...const
7950: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d SSL_CIPHER *c =
7960: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 sk_SSL_CIPHER_v
7970: 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 alue(sk, i);...i
7980: 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f f (c == NULL) co
7990: 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 ntinue;..../* ci
79a0: 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f pher name or (NO
79b0: 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 NE) */...cp = SS
79c0: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d L_CIPHER_get_nam
79d0: 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d e(c);...if (cp =
79e0: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 = NULL) break;..
79f0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
7a00: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
7a10: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
7a20: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d wStringObj(cp, -
7a30: 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 1));.. }...}
7a40: 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 else {.. objP
7a50: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 tr = Tcl_NewStri
7a60: 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 ngObj("",0);..
7a70: 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 for (int i = 0
7a80: 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 ; i < sk_SSL_CIP
7a90: 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b HER_num(sk); i++
7aa0: 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f ) {...const SSL_
7ab0: 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 CIPHER *c = sk_S
7ac0: 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 SL_CIPHER_value(
7ad0: 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 sk, i);...if (c
7ae0: 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 == NULL) continu
7af0: 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c e;..../* textual
7b00: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 description of
7b10: 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 the cipher */...
7b20: 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 if (SSL_CIPHER_d
7b30: 65 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 escription(c, bu
7b40: 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 f, sizeof(buf))
7b50: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 != NULL) {...
7b60: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a Tcl_AppendToObj
7b70: 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 54 (objPtr, buf, (T
7b80: 63 6c 5f 53 69 7a 65 29 20 73 74 72 6c 65 6e 28 cl_Size) strlen(
7b90: 62 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 buf));...} else
7ba0: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {... Tcl_Appe
7bb0: 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 ndToObj(objPtr,
7bc0: 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b "UNKNOWN\n", 8);
7bd0: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 ...}.. }..}..
7be0: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 if (use_supporte
7bf0: 64 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c d) {.. sk_SSL
7c00: 5f 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 _CIPHER_free(sk)
7c10: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 ;..}. }. S
7c20: 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 SL_free(ssl);.
7c30: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
7c40: 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 tx);.. Tcl_Se
7c50: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
7c60: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
7c70: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
7c80: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
7c90: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
7ca0: 20 2a 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 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 -----. *. * Prot
7cf0: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c ocolsObjCmd -- l
7d00: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 ist available pr
7d10: 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 otocols. *. *.Th
7d20: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
7d30: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
7d40: 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f ss the "tls::pro
7d50: 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a tocols" command.
7d60: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c *.to list avail
7d70: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a able protocols..
7d80: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
7d90: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
7da0: 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a result list.. *
7db0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
7dc0: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 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 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
7e20: 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d t.ProtocolsObjCm
7e30: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
7e40: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
7e50: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
7e60: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
7e70: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
7e80: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
7e90: 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 Ptr;.. dprint
7ea0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
7eb0: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 if (objc != 1)
7ec0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
7ed0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
7ee0: 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 objv, "");..retu
7ef0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7f00: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
7f10: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
7f20: 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 objPtr = Tcl_Ne
7f30: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
7f40: 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f );..#if OPENSSL_
7f50: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
7f60: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 0x10100000L &&
7f70: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 !defined(NO_SSL2
7f80: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
7f90: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 ENSSL_NO_SSL2).
7fa0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
7fb0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
7fc0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
7fd0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
7fe0: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d tocols[TLS_SSL2]
7ff0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
8000: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 if !defined(NO_S
8010: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
8020: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
8030: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8040: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 ENSSL_NO_SSL3_ME
8050: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 THOD). Tcl_Li
8060: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
8070: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
8080: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
8090: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
80a0: 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 S_SSL3], -1));.#
80b0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
80c0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 ed(NO_TLS1) && !
80d0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
80e0: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 NO_TLS1) && !def
80f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8100: 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 TLS1_METHOD).
8110: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
8120: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
8130: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
8140: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
8150: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 cols[TLS_TLS1],
8160: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 -1));.#endif.#if
8170: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
8180: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
8190: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
81a0: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
81b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
81c0: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 1_METHOD). Tc
81d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
81e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
81f0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
8200: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
8210: 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d s[TLS_TLS1_1], -
8220: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
8230: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
8240: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
8250: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
8260: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
8270: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
8280: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c _METHOD). Tcl
8290: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
82a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
82b0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
82c0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
82d0: 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 [TLS_TLS1_2], -1
82e0: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
82f0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
8300: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
8310: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
8320: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
8330: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
8340: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
8350: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
8360: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
8370: 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e S1_3], -1));.#en
8380: 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 dif.. Tcl_Set
8390: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
83a0: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 , objPtr);. r
83b0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
83c0: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
83d0: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ntData;.}.../*.
83e0: 2a 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 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 ----. *. * Hands
8430: 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a hakeObjCmd --. *
8440: 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 . *.This command
8450: 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 is used to veri
8460: 66 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 fy whether the h
8470: 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 andshake is comp
8480: 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a lete. *.or not..
8490: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
84a0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
84b0: 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 result. 1 means
84c0: 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c handshake compl
84d0: 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e ete, 0 means pen
84e0: 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 ding.. *. * Side
84f0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 effects:. *.May
8500: 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 force SSL negot
8510: 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 iation to take p
8520: 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d lace.. *. *-----
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 2d 0a 20 --------------.
8570: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 */.static int Ha
8580: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c ndshakeObjCmd(Cl
8590: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
85a0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
85b0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
85c0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
85d0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
85e0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
85f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 ; /* The
8600: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
8610: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 mode on. */.
8620: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
8630: 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 ; /* clie
8640: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c nt state for ssl
8650: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 socket */. c
8660: 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 onst char *errSt
8670: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e r = NULL;. in
8680: 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 t ret = 1;. i
8690: 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 nt err = 0;..
86a0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
86b0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
86c0: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
86d0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
86e0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
86f0: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
8700: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
8710: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 }.. ERR_clea
8720: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 r_error();..
8730: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
8740: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 annel(interp, Tc
8750: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
8760: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28 54 63 6c bj(objv[1], (Tcl
8770: 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 2c 20 _Size *) NULL),
8780: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
8790: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
87a0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
87b0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
87c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
87d0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
87e0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
87f0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
8800: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
8810: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
8820: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 ;. if (Tcl_Ge
8830: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
8840: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
8850: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f lType()) {..Tcl_
8860: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
8870: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
8880: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
8890: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
88a0: 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 .. "\": not a
88b0: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
88c0: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 ULL);..Tcl_SetEr
88d0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
88e0: 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b "TLS", "HANDSHAK
88f0: 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 E", "CHANNEL", "
8900: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
8910: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
8920: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
8930: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 }. statePtr
8940: 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f = (State *)Tcl_
8950: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
8960: 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 ceData(chan);..
8970: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
8980: 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 ing Tls_WaitForC
8990: 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 onnect");. re
89a0: 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 t = Tls_WaitForC
89b0: 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c onnect(statePtr,
89c0: 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 &err, 1);. d
89d0: 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 printf("Tls_Wait
89e0: 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 ForConnect retur
89f0: 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a ned: %i", ret);.
8a00: 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 . if (ret < 0
8a10: 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e && ((statePtr->
8a20: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
8a30: 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d ASYNC) && (err =
8a40: 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 = EAGAIN))) {..d
8a50: 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 printf("Async se
8a60: 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 t and err = EAGA
8a70: 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a IN");..ret = 0;.
8a80: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 } else if (r
8a90: 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 et < 0) {..long
8aa0: 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 result;..errStr
8ab0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b = statePtr->err;
8ac0: 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c ..Tcl_ResetResul
8ad0: 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f t(interp);..Tcl_
8ae0: 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a SetErrno(err);..
8af0: 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 .if (!errStr ||
8b00: 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 (*errStr == 0))
8b10: 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 {.. errStr =
8b20: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 Tcl_PosixError(i
8b30: 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c nterp);..}...Tcl
8b40: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
8b50: 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 terp, "handshake
8b60: 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 failed: ", errS
8b70: 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c tr, (char *) NUL
8b80: 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c 74 L);..if ((result
8b90: 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 = SSL_get_verif
8ba0: 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 y_result(statePt
8bb0: 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 39 r->ssl)) != X509
8bc0: 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 _V_OK) {.. Tc
8bd0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
8be0: 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74 6f 3a nterp, " due to:
8bf0: 20 22 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f ", X509_verify_
8c00: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e cert_error_strin
8c10: 67 28 72 65 73 75 6c 74 29 2c 20 28 63 68 61 72 g(result), (char
8c20: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 *) NULL);..}..T
8c30: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
8c40: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
8c50: 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 49 HANDSHAKE", "FAI
8c60: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
8c70: 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 ULL);..dprintf("
8c80: 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 Returning TCL_ER
8c90: 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 ROR with handsha
8ca0: 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 ke failed: %s",
8cb0: 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e errStr);..return
8cc0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
8cd0: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 } else {..if (e
8ce0: 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 rr != 0) {..
8cf0: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 dprintf("Got an
8d00: 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d error with a com
8d10: 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 pleted handshake
8d20: 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 : err = %i", err
8d30: 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a );..}..ret = 1;.
8d40: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
8d50: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 tf("Returning TC
8d60: 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c L_OK with data \
8d70: 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 "%i\"", ret);.
8d80: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
8d90: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
8da0: 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a ewIntObj(ret));.
8db0: 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f return(TCL_O
8dc0: 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 K);..clientData
8dd0: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a = clientData;.}.
8de0: 0a 2f 2a 0a 20 2a 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 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
8e30: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a ImportObjCmd --.
8e40: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
8e50: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
8e60: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
8e70: 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a ssl" command. *.
8e80: 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 *.The ssl comma
8e90: 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 nd pushes SSL ov
8ea0: 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e er a (newly conn
8eb0: 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 ected) tcp socke
8ec0: 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a t. *. * Results:
8ed0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
8ee0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
8ef0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
8f00: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 *.May modify the
8f10: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 behavior of an
8f20: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 IO channel.. *.
8f30: 2a 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 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
8f80: 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 int.ImportObjCmd
8f90: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
8fa0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
8fb0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
8fc0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
8fd0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
8fe0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
8ff0: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
9000: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
9010: 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 de on. */. St
9020: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 ate *statePtr;..
9030: 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 /* client state
9040: 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a for ssl socket *
9050: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 /. SSL_CTX *c
9060: 74 78 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c tx. = NUL
9070: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
9080: 73 63 72 69 70 74 09 20 20 20 20 20 20 20 20 3d script. =
9090: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f NULL;. Tcl_O
90a0: 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 bj *password.
90b0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
90c0: 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 20 Tcl_Obj *vcmd.
90d0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
90e0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 Tcl_DString u
90f0: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
9100: 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 lation, upperCha
9110: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 nnelBlocking, up
9120: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
9130: 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c ng, upperChannel
9140: 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 EOFChar;. int
9150: 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69 idx;. Tcl_Si
9160: 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 ze len;. int
9170: 66 6c 61 67 73 09 09 20 20 20 20 20 20 20 20 3d flags.. =
9180: 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 TLS_TCL_INIT;.
9190: 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 20 int server..
91a0: 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69 = 0;./* i
91b0: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 s connection inc
91c0: 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e oming or outgoin
91d0: 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a g? */. char *
91e0: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 keyfile.
91f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
9200: 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20 20 20 *certfile.
9210: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 = NULL;. u
9220: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 nsigned char *ke
9230: 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 y .= NULL;.
9240: 54 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e Tcl_Size key_len
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9260: 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e = 0;. unsign
9270: 65 64 20 63 68 61 72 20 2a 63 65 72 74 20 20 20 ed char *cert
9280: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
9290: 20 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f Tcl_Size cert_
92a0: 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 len
92b0: 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 = 0;. char
92c0: 20 2a 63 69 70 68 65 72 73 09 20 20 20 20 20 20 *ciphers.
92d0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 = NULL;. ch
92e0: 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 ar *ciphersuites
92f0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
9300: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c . char *CAfil
9310: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
9320: 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 64 69 ;. char *CAdi
9330: 72 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c r.. = NUL
9340: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 L;. char *DHp
9350: 61 72 61 6d 73 09 20 20 20 20 20 20 20 20 3d 20 arams. =
9360: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
9370: 6d 6f 64 65 6c 09 09 20 20 20 20 20 20 20 20 3d model.. =
9380: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
9390: 2a 73 65 72 76 65 72 6e 61 6d 65 09 20 20 20 20 *servername.
93a0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 = NULL;./* h
93b0: 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 ostname for Serv
93c0: 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 er Name Indicati
93d0: 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 on */. const
93e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 unsigned char *s
93f0: 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c ession_id = NULL
9400: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 ;. Tcl_Obj *a
9410: 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 lpn..= NULL;.
9420: 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 int ssl2 = 0, s
9430: 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 sl3 = 0;. int
9440: 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f tls1 = 1, tls1_
9450: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 1 = 1, tls1_2 =
9460: 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 1, tls1_3 = 1;.
9470: 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 int proto = 0
9480: 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 , level = -1;.
9490: 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 int verify = 0
94a0: 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 , require = 0, r
94b0: 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 equest = 1, post
94c0: 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a _handshake = 0;.
94d0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
94e0: 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 lled");..#if def
94f0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c ined(NO_TLS1) ||
9500: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
9510: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c _NO_TLS1). tl
9520: 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 s1 = 0;.#endif.#
9530: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
9540: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
9550: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
9560: 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d _1). tls1_1 =
9570: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 0;.#endif.#if d
9580: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
9590: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
95a0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a NSSL_NO_TLS1_2).
95b0: 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a tls1_2 = 0;.
95c0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
95d0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
95e0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
95f0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
9600: 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 tls1_3 = 0;.#end
9610: 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 if.. if (objc
9620: 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f < 2) {..Tcl_Wro
9630: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
9640: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
9650: 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b nel ?options?");
9660: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
9670: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 OR;. }.. E
9680: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
9690: 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 ;.. chan = Tc
96a0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
96b0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 erp, Tcl_GetStri
96c0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 ngFromObj(objv[1
96d0: 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 ], (Tcl_Size *)
96e0: 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 NULL), NULL);.
96f0: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 if (chan == (T
9700: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
9710: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
9720: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
9730: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 /* Make sure t
9740: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
9750: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
9760: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 */. chan = T
9770: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
9780: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 (chan);.. for
9790: 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c (idx = 2; idx <
97a0: 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a objc; idx++) {.
97b0: 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c .char *opt = Tcl
97c0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
97d0: 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 28 54 63 j(objv[idx], (Tc
97e0: 6c 5f 53 69 7a 65 20 2a 29 4e 55 4c 4c 29 3b 0a l_Size *)NULL);.
97f0: 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 ..if (opt[0] !=
9800: 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b '-').. break;
9810: 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e ...OPTOBJ("-alpn
9820: 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 ", alpn);..OPTST
9830: 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 64 69 R("-cadir", CAdi
9840: 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 r);..OPTSTR("-ca
9850: 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a file", CAfile);.
9860: 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 .OPTBYTE("-cert"
9870: 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e , cert, cert_len
9880: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 );..OPTSTR("-cer
9890: 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 tfile", certfile
98a0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 );..OPTSTR("-cip
98b0: 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a her", ciphers);.
98c0: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 .OPTSTR("-cipher
98d0: 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f s", ciphers);..O
98e0: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 PTSTR("-ciphersu
98f0: 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 ites", ciphersui
9900: 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d tes);..OPTOBJ("-
9910: 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 command", script
9920: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 );..OPTSTR("-dhp
9930: 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 arams", DHparams
9940: 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 );..OPTBYTE("-ke
9950: 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e y", key, key_len
9960: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 );..OPTSTR("-key
9970: 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b file", keyfile);
9980: 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c ..OPTSTR("-model
9990: 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f ", model);..OPTO
99a0: 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 BJ("-password",
99b0: 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 password);..OPTB
99c0: 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 OOL("-post_hands
99d0: 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 hake", post_hand
99e0: 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c shake);..OPTBOOL
99f0: 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 ("-request", req
9a00: 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 uest);..OPTBOOL(
9a10: 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 "-require", requ
9a20: 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d ire);..OPTINT("-
9a30: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c security_level",
9a40: 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f level);..OPTBOO
9a50: 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 L("-server", ser
9a60: 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ver);..OPTSTR("-
9a70: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 servername", ser
9a80: 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 vername);..OPTST
9a90: 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c R("-session_id",
9aa0: 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f session_id);..O
9ab0: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 PTBOOL("-ssl2",
9ac0: 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 ssl2);..OPTBOOL(
9ad0: 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a "-ssl3", ssl3);.
9ae0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 .OPTBOOL("-tls1"
9af0: 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f , tls1);..OPTBOO
9b00: 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 L("-tls1.1", tls
9b10: 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 1_1);..OPTBOOL("
9b20: 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 -tls1.2", tls1_2
9b30: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
9b40: 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a s1.3", tls1_3);.
9b50: 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 .OPTOBJ("-valida
9b60: 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 tecommand", vcmd
9b70: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d );..OPTOBJ("-vcm
9b80: 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 d", vcmd);...OPT
9b90: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d BAD("option", "-
9ba0: 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 alpn, -cadir, -c
9bb0: 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 afile, -cert, -c
9bc0: 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 ertfile, -cipher
9bd0: 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c , -ciphersuites,
9be0: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 -command, -dhpa
9bf0: 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 rams, -key, -key
9c00: 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 file, -model, -p
9c10: 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 assword, -post_h
9c20: 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65 andshake, -reque
9c30: 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73 st, -require, -s
9c40: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 2d ecurity_level, -
9c50: 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e server, -servern
9c60: 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 ame, -session_id
9c70: 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 , -ssl2, -ssl3,
9c80: 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 -tls1, -tls1.1,
9c90: 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 -tls1.2, -tls1.3
9ca0: 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f , or -validateco
9cb0: 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 mmand");...retur
9cc0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
9cd0: 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 }. if (reque
9ce0: 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53 st)..verify |= S
9cf0: 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 SL_VERIFY_CLIENT
9d00: 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 _ONCE | SSL_VERI
9d10: 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 FY_PEER;. if
9d20: 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75 (request && requ
9d30: 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 ire).verify |= S
9d40: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 SL_VERIFY_FAIL_I
9d50: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a F_NO_PEER_CERT;.
9d60: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 if (request
9d70: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b && post_handshak
9d80: 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c e).verify |= SSL
9d90: 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e _VERIFY_POST_HAN
9da0: 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 DSHAKE;. if (
9db0: 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65 verify == 0)..ve
9dc0: 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 rify = SSL_VERIF
9dd0: 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f Y_NONE;.. pro
9de0: 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c to |= (ssl2 ? TL
9df0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 S_PROTO_SSL2 : 0
9e00: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
9e10: 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 (ssl3 ? TLS_PROT
9e20: 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 O_SSL3 : 0);.
9e30: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 proto |= (tls1
9e40: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 ? TLS_PROTO_TLS1
9e50: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f : 0);. proto
9e60: 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c |= (tls1_1 ? TL
9e70: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a S_PROTO_TLS1_1 :
9e80: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
9e90: 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f = (tls1_2 ? TLS_
9ea0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 PROTO_TLS1_2 : 0
9eb0: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
9ec0: 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 (tls1_3 ? TLS_PR
9ed0: 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b OTO_TLS1_3 : 0);
9ee0: 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 .. /* reset t
9ef0: 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 o NULL if blank
9f00: 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 string provided
9f10: 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 */. if (cert
9f20: 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 && !*cert)..
9f30: 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20 cert.
9f40: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
9f50: 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 (key && !*key)..
9f60: 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 key.
9f70: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
9f80: 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 if (certfile &&
9f90: 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 !*certfile)
9fa0: 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e certfile.= N
9fb0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 ULL;. if (key
9fc0: 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c file && !*keyfil
9fd0: 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 e)..keyfile.
9fe0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
9ff0: 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 if (ciphers && !
a000: 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20 *ciphers).
a010: 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20 ciphers.
a020: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
a030: 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26 (ciphersuites &
a040: 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 & !*ciphersuites
a050: 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20 ) ciphersuites
a060: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
a070: 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 (CAfile && !*CA
a080: 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 file). CA
a090: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e file. = N
a0a0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64 ULL;. if (CAd
a0b0: 69 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 20 ir && !*CAdir).
a0c0: 20 20 20 20 20 20 20 43 41 64 69 72 09 20 20 20 CAdir.
a0d0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
a0e0: 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 if (DHparams &&
a0f0: 20 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 !*DHparams).
a100: 20 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 DHparams
a110: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 = NULL;..
a120: 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 /* new SSL sta
a130: 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 te */. stateP
a140: 74 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 tr..= (State *)
a150: 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 ckalloc((unsigne
a160: 64 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 d) sizeof(State)
a170: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 );. memset(st
a180: 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f atePtr, 0, sizeo
a190: 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 f(State));..
a1a0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 statePtr->flags.
a1b0: 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 = flags;. sta
a1c0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 tePtr->interp.=
a1d0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 interp;. stat
a1e0: 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 ePtr->vflags.= v
a1f0: 65 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 erify;. state
a200: 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a Ptr->err.= "";..
a210: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 /* allocate
a220: 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 script */. if
a230: 20 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f (script) {..(vo
a240: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e id) Tcl_GetStrin
a250: 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c gFromObj(script,
a260: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e &len);..if (len
a270: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 ) {.. statePt
a280: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 r->callback = sc
a290: 72 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 ript;.. Tcl_I
a2a0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ncrRefCount(stat
a2b0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
a2c0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
a2d0: 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 * allocate passw
a2e0: 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 ord */. if (p
a2f0: 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 assword) {..(voi
a300: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 d) Tcl_GetString
a310: 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 FromObj(password
a320: 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 , &len);..if (le
a330: 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 n) {.. stateP
a340: 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 tr->password = p
a350: 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 assword;.. Tc
a360: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 l_IncrRefCount(s
a370: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
a380: 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 d);..}. }..
a390: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 /* allocate va
a3a0: 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a lidate command *
a3b0: 2f 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 /. if (vcmd)
a3c0: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 {..(void) Tcl_Ge
a3d0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 tStringFromObj(v
a3e0: 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 cmd, &len);..if
a3f0: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 (len) {.. sta
a400: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 tePtr->vcmd = vc
a410: 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 md;.. Tcl_Inc
a420: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
a430: 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 tr->vcmd);..}.
a440: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 }.. if (mod
a450: 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 el != NULL) {..i
a460: 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 nt mode;../* Get
a470: 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e the "model" con
a480: 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 text */..chan =
a490: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
a4a0: 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d nterp, model, &m
a4b0: 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 ode);..if (chan
a4c0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
a4d0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c NULL) {.. Tl
a4e0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
a4f0: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
a500: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a510: 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 ;..}.../*.. * Ma
a520: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
a530: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
a540: 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 t channel.. */..
a550: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
a560: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
a570: 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e .if (Tcl_GetChan
a580: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
a590: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
a5a0: 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 ()) {.. Tcl_A
a5b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
a5c0: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
a5d0: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
a5e0: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
a5f0: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 .."\": not a TLS
a600: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 channel", NULL)
a610: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
a620: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
a630: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
a640: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
a650: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
a660: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
a670: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
a680: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
a690: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
a6a0: 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 .}..ctx = ((Stat
a6b0: 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e e *)Tcl_GetChann
a6c0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 elInstanceData(c
a6d0: 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 han))->ctx;.
a6e0: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 } else {..if ((c
a6f0: 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 tx = CTX_Init(st
a700: 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 atePtr, server,
a710: 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 proto, keyfile,
a720: 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 certfile, key, c
a730: 65 72 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c ert, (int) key_l
a740: 65 6e 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 63 en,.. (int) c
a750: 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20 ert_len, CAdir,
a760: 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c CAfile, ciphers,
a770: 20 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c ciphersuites, l
a780: 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 evel, DHparams))
a790: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 == NULL) {..
a7a0: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
a7b0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
a7c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
a7d0: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ROR;..}. }..
a7e0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 statePtr->ctx
a7f0: 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a = ctx;.. /*.
a800: 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 * We need t
a810: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 o make sure that
a820: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 the channel wor
a830: 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f ks in binary (fo
a840: 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 r the. * enc
a850: 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 ryption not to g
a860: 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 et goofed up)..
a870: 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 * We only wa
a880: 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 nt to adjust the
a890: 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 buffering in pr
a8a0: 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 e-v2 channels, w
a8b0: 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 here. * each
a8c0: 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 channel in the
a8d0: 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 stack maintained
a8e0: 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 its own buffers
a8f0: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 .. */. Tc
a900: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
a910: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
a920: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c lation);. Tcl
a930: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
a940: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 perChannelBlocki
a950: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ng);. Tcl_DSt
a960: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
a970: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a hannelEOFChar);.
a980: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
a990: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
a9a0: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 lEncoding);.
a9b0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
a9c0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
a9d0: 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 n, "-eofchar", &
a9e0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
a9f0: 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 har);. Tcl_Ge
aa00: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
aa10: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 nterp, chan, "-e
aa20: 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 ncoding", &upper
aa30: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
aa40: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
aa50: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
aa60: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 p, chan, "-trans
aa70: 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 lation", &upperC
aa80: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
aa90: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 n);. Tcl_GetC
aaa0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
aab0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f erp, chan, "-blo
aac0: 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 cking", &upperCh
aad0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a annelBlocking);.
aae0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
aaf0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
ab00: 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 chan, "-transla
ab10: 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 tion", "binary")
ab20: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
ab30: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
ab40: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b p, chan, "-block
ab50: 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 ing", "true");.
ab60: 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 dprintf("Cons
ab70: 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 uming Tcl channe
ab80: 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 l %s", Tcl_GetCh
ab90: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 annelName(chan))
aba0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
abb0: 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b self = Tcl_Stack
abc0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
abd0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
abe0: 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ), (ClientData)
abf0: 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52 statePtr, (TCL_R
ac00: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 EADABLE | TCL_WR
ac10: 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a ITABLE), chan);.
ac20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 dprintf("Cre
ac30: 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d ated channel nam
ac40: 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 ed %s", Tcl_GetC
ac50: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
ac60: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 Ptr->self));.
ac70: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 if (statePtr->s
ac80: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e elf == (Tcl_Chan
ac90: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a nel) NULL) {../*
aca0: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 .. * No use of T
acb0: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 cl_EventuallyFre
acc0: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 e because no pos
acd0: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 sible Tcl_Preser
ace0: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 ve... */..Tls_Fr
acf0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
ad00: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 ePtr);..return T
ad10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
ad20: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
ad30: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
ad40: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
ad50: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
ad60: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
ad70: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
ad80: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 Translation));.
ad90: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
ada0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
adb0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 statePtr->self,
adc0: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c "-encoding", Tcl
add0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
ade0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
adf0: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 ing));. Tcl_S
ae00: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
ae10: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
ae20: 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 ->self, "-eofcha
ae30: 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 r", Tcl_DStringV
ae40: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
ae50: 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 elEOFChar));.
ae60: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
ae70: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 ption(interp, st
ae80: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d atePtr->self, "-
ae90: 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 blocking", Tcl_D
aea0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
aeb0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
aec0: 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 g));.. /*.
aed0: 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 * SSL Initiali
aee0: 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 zation. */.
aef0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c statePtr->ssl
af00: 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 = SSL_new(state
af10: 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 Ptr->ctx);. i
af20: 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73 f (!statePtr->ss
af30: 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 l) {../* SSL lib
af40: 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 rary error */..T
af50: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
af60: 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 interp, "couldn'
af70: 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 t construct ssl
af80: 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53 session: ", REAS
af90: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
afa0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
afb0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
afc0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
afd0: 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 RT", "INIT", "FA
afe0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
aff0: 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 NULL);..Tls_Free
b000: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
b010: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c tr);..return TCL
b020: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
b030: 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 /* Set host s
b040: 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 erver name */.
b050: 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d 65 if (servername
b060: 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 ) {../* Sets the
b070: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 server name ind
b080: 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e ication (SNI) in
b090: 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 ClientHello ext
b0a0: 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 ension */../* Pe
b0b0: 72 20 52 46 43 20 36 30 36 36 2c 20 68 6f 73 74 r RFC 6066, host
b0c0: 6e 61 6d 65 20 69 73 20 61 20 41 53 43 49 49 20 name is a ASCII
b0d0: 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 encoded string,
b0e0: 74 68 6f 75 67 68 20 52 46 43 20 34 33 36 36 20 though RFC 4366
b0f0: 73 61 79 73 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 says UTF-8. */..
b100: 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 if (!SSL_set_tls
b110: 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 ext_host_name(st
b120: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 atePtr->ssl, ser
b130: 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 vername) && requ
b140: 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f ire) {.. Tcl_
b150: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
b160: 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c erp, "setting TL
b170: 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 S host name exte
b180: 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 nsion failed", (
b190: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
b1a0: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
b1b0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
b1c0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 S", "IMPORT", "S
b1d0: 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 NI", "FAILED", (
b1e0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
b1f0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
b200: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
b210: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
b220: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
b230: 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 Set hostname for
b240: 20 70 65 65 72 20 63 65 72 74 69 66 69 63 61 74 peer certificat
b250: 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 e hostname verif
b260: 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e ication in clien
b270: 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 ts... Don't us
b280: 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 e SSL_set1_host
b290: 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d since it has lim
b2a0: 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 itations. */..if
b2b0: 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 (!SSL_add1_host
b2c0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
b2d0: 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 servername)) {..
b2e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
b2f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 sult(interp, "se
b300: 74 74 69 6e 67 20 44 4e 53 20 68 6f 73 74 20 6e tting DNS host n
b310: 61 6d 65 20 66 61 69 6c 65 64 22 2c 20 28 63 68 ame failed", (ch
b320: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b330: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
b340: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
b350: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 , "IMPORT", "HOS
b360: 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 TNAME", "FAILED"
b370: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b380: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
b390: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
b3a0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
b3b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
b3c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 }.. /* Resu
b3d0: 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f me session id */
b3e0: 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e . if (session
b3f0: 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 _id && strlen(se
b400: 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c ssion_id) <= SSL
b410: 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e _MAX_SID_CTX_LEN
b420: 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 GTH) {../* SSL_s
b430: 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a et_session() */.
b440: 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f .if (!SSL_SESSIO
b450: 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 N_set1_id_contex
b460: 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f t(SSL_get_sessio
b470: 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 n(statePtr->ssl)
b480: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 , session_id, (u
b490: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 nsigned int) str
b4a0: 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 len(session_id))
b4b0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
b4c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
b4d0: 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f , "Resume sessio
b4e0: 6e 20 69 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f n id ", session_
b4f0: 69 64 2c 20 22 20 66 61 69 6c 65 64 22 2c 20 28 id, " failed", (
b500: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
b510: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
b520: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
b530: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 S", "IMPORT", "S
b540: 45 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 ESSION", "FAILED
b550: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
b560: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 );.. Tls_Free
b570: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
b580: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
b590: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
b5a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 }.. /* Ena
b5b0: 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d ble Application-
b5c0: 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e Layer Protocol N
b5d0: 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d egotiation. Exam
b5e0: 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31 ples are: http/1
b5f0: 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 .0,..http/1.1, h
b600: 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2, h3, ftp, imap
b610: 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 , pop3, xmpp-cli
b620: 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 ent, xmpp-server
b630: 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63 , mqtt, irc, etc
b640: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 . */. if (alp
b650: 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 n) {../* Convert
b660: 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f a TCL list into
b670: 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 a protocol-list
b680: 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 in wire-format
b690: 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 */..unsigned cha
b6a0: 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 r *protos, *p;..
b6b0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f unsigned int pro
b6c0: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 tos_len = 0;..Tc
b6d0: 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 l_Size cnt, i;..
b6e0: 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 int j;..Tcl_Obj
b6f0: 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 **list;...if (Tc
b700: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d l_ListObjGetElem
b710: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 ents(interp, alp
b720: 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 n, &cnt, &list)
b730: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
b740: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
b750: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
b760: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
b770: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 RROR;..}.../* De
b780: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f termine the memo
b790: 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 ry required for
b7a0: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 the protocol-lis
b7b0: 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 t */..for (i = 0
b7c0: 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 ; i < cnt; i++)
b7d0: 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74 {.. Tcl_GetSt
b7e0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 ringFromObj(list
b7f0: 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 [i], &len);..
b800: 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 if (len > 255)
b810: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {...Tcl_AppendRe
b820: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c sult(interp, "AL
b830: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 PN protocol name
b840: 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 too long", (cha
b850: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 r *) NULL);...Tc
b860: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
b870: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
b880: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 MPORT", "ALPN",
b890: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
b8a0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f *) NULL);...Tls_
b8b0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
b8c0: 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 atePtr);...retur
b8d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
b8e0: 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f }.. protos_
b8f0: 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29 len += 1 + (int)
b900: 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 len;..}.../* Bu
b910: 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 ild the complete
b920: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a protocol-list *
b930: 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c /..protos = ckal
b940: 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b loc(protos_len);
b950: 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 ../* protocol-li
b960: 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 sts consist of 8
b970: 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 -bit length-pref
b980: 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e ixed, byte strin
b990: 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 gs */..for (j =
b9a0: 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 0, p = protos; j
b9b0: 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 < cnt; j++) {..
b9c0: 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 char *str =
b9d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
b9e0: 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c mObj(list[j], &l
b9f0: 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d en);.. *p++ =
ba00: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 (unsigned char)
ba10: 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 len;.. memcp
ba20: 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f y(p, str, (size_
ba30: 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 t) len);.. p
ba40: 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 += len;..}.../*
ba50: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f SSL_set_alpn_pro
ba60: 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 tos makes a copy
ba70: 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c of the protocol
ba80: 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 -list */../* Not
ba90: 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e e: This function
baa0: 73 20 72 65 76 65 72 73 65 73 20 74 68 65 20 72 s reverses the r
bab0: 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 eturn value conv
bac0: 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 ention */..if (S
bad0: 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 SL_set_alpn_prot
bae0: 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c os(statePtr->ssl
baf0: 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 , protos, protos
bb00: 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 _len)) {.. Tc
bb10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
bb20: 6e 74 65 72 70 2c 20 22 66 61 69 6c 65 64 20 74 nterp, "failed t
bb30: 6f 20 73 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f o set ALPN proto
bb40: 63 6f 6c 73 22 2c 20 28 63 68 61 72 20 2a 29 20 cols", (char *)
bb50: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
bb60: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
bb70: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
bb80: 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 ORT", "ALPN", "F
bb90: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
bba0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 NULL);.. Tls
bbb0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
bbc0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 tatePtr);.. c
bbd0: 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 kfree(protos);..
bbe0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
bbf0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 RROR;..}.../* St
bc00: 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 ore protocols li
bc10: 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d st */..statePtr-
bc20: 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 >protos = protos
bc30: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f ;..statePtr->pro
bc40: 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 tos_len = protos
bc50: 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 _len;. } else
bc60: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 {..statePtr->pr
bc70: 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 otos = NULL;..st
bc80: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c atePtr->protos_l
bc90: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 en = 0;. }..
bca0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c /*. * SSL
bcb0: 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 Callbacks.
bcc0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 */. SSL_set_a
bcd0: 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 pp_data(statePtr
bce0: 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 ->ssl, (void *)s
bcf0: 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 tatePtr);./* poi
bd00: 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f nt back to us */
bd10: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 . SSL_set_ver
bd20: 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ify(statePtr->ss
bd30: 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 l, verify, Verif
bd40: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 yCallback);.
bd50: 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c SSL_set_info_cal
bd60: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e lback(statePtr->
bd70: 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 ssl, InfoCallbac
bd80: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c k);.. /* Call
bd90: 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 back for observi
bda0: 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 ng protocol mess
bdb0: 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 ages */.#ifndef
bdc0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 OPENSSL_NO_SSL_T
bdd0: 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 RACE. /* void
bde0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 SSL_CTX_set_msg
bdf0: 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 _callback_arg(st
be00: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f atePtr->ctx, (vo
be10: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
be20: 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 void SSL_CTX
be30: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
be40: 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c k(statePtr->ctx,
be50: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b MessageCallback
be60: 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 ); */. SSL_se
be70: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 t_msg_callback_a
be80: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c rg(statePtr->ssl
be90: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
bea0: 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 tr);. SSL_set
beb0: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 _msg_callback(st
bec0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 atePtr->ssl, Mes
bed0: 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 sageCallback);.#
bee0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 endif.. /* Cr
bef0: 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c eate Tcl_Channel
bf00: 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a BIO Handler */.
bf10: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f statePtr->p_
bf20: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 bio.= BIO_new_tc
bf30: 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f l(statePtr, BIO_
bf40: 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 NOCLOSE);. st
bf50: 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 atePtr->bio.= BI
bf60: 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 O_new(BIO_f_ssl(
bf70: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 ));.. if (ser
bf80: 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 ver) {../* Serve
bf90: 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 r callbacks */..
bfa0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 SSL_CTX_set_tlse
bfb0: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 xt_servername_ar
bfc0: 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c g(statePtr->ctx,
bfd0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
bfe0: 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 r);..SSL_CTX_set
bff0: 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 _tlsext_serverna
c000: 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 me_callback(stat
c010: 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 ePtr->ctx, SNICa
c020: 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 llback);..SSL_CT
c030: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c X_set_client_hel
c040: 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e lo_cb(statePtr->
c050: 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 ctx, HelloCallba
c060: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
c070: 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 ePtr);..if (stat
c080: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
c090: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c NULL) {.. SSL
c0a0: 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 _CTX_set_alpn_se
c0b0: 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 lect_cb(statePtr
c0c0: 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 ->ctx, ALPNCallb
c0d0: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
c0e0: 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 tePtr);.#ifdef U
c0f0: 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 SE_NPN.. if (
c100: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 tls1_2 == 0 && t
c110: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 ls1_3 == 0) {...
c120: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 SSL_CTX_set_next
c130: 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 _protos_advertis
c140: 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ed_cb(statePtr->
c150: 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b ctx, NPNCallback
c160: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
c170: 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 tr);.. }.#end
c180: 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c if..}.../* Enabl
c190: 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 e server to send
c1a0: 20 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66 cert request af
c1b0: 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 ter handshake (T
c1c0: 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a LS 1.3 only) */.
c1d0: 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 ./* A write oper
c1e0: 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 ation must take
c1f0: 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 place for the Ce
c200: 72 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73 rtificate Reques
c210: 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 t to be.. sent
c220: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 to the client,
c230: 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 this can be done
c240: 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e with SSL_do_han
c250: 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 dshake(). */..if
c260: 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 (request && pos
c270: 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 t_handshake && t
c280: 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 ls1_3) {.. SS
c290: 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f L_verify_client_
c2a0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 post_handshake(s
c2b0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 tatePtr->ssl);..
c2c0: 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d }.../* set autom
c2d0: 61 74 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 atic curve selec
c2e0: 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 tion */..SSL_set
c2f0: 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 _ecdh_auto(state
c300: 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 Ptr->ssl, 1);...
c310: 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f /* Set server mo
c320: 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d de */..statePtr-
c330: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 >flags |= TLS_TC
c340: 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 L_SERVER;..SSL_s
c350: 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 et_accept_state(
c360: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
c370: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a } else {../*
c380: 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b Client callback
c390: 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f s */.#ifdef USE_
c3a0: 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 NPN..if (statePt
c3b0: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c r->protos != NUL
c3c0: 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 L && tls1_2 == 0
c3d0: 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 && tls1_3 == 0)
c3e0: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f {.. SSL_CTX_
c3f0: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 set_next_proto_s
c400: 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 elect_cb(statePt
c410: 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c r->ctx, ALPNCall
c420: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 back, (void *)st
c430: 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 atePtr);..}.#end
c440: 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 if.../* Session
c450: 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f caching */..SSL_
c460: 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f CTX_set_session_
c470: 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 cache_mode(state
c480: 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 Ptr->ctx, SSL_SE
c490: 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 SS_CACHE_CLIENT
c4a0: 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 | SSL_SESS_CACHE
c4b0: 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f _NO_INTERNAL_STO
c4c0: 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 RE);..SSL_CTX_se
c4d0: 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 ss_set_new_cb(st
c4e0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 atePtr->ctx, Ses
c4f0: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a sionCallback);..
c500: 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 ./* Enable post
c510: 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e handshake Authen
c520: 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 tication extensi
c530: 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 on. TLS 1.3 only
c540: 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f , not http/2. */
c550: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 ..if (request &&
c560: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 post_handshake)
c570: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f {.. SSL_set_
c580: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 post_handshake_a
c590: 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 uth(statePtr->ss
c5a0: 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 l, 1);..}.../* S
c5b0: 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a et client mode *
c5c0: 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 /..SSL_set_conne
c5d0: 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 ct_state(statePt
c5e0: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 r->ssl);. }.
c5f0: 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 SSL_set_bio(s
c600: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 tatePtr->ssl, st
c610: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 atePtr->p_bio, s
c620: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b tatePtr->p_bio);
c630: 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c . BIO_set_ssl
c640: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 (statePtr->bio,
c650: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 statePtr->ssl, B
c660: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 IO_NOCLOSE);..
c670: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 /*. * End
c680: 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 of SSL Init.
c690: 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 */. dprintf(
c6a0: 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 "Returning %s",
c6b0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
c6c0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
c6d0: 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 f));. Tcl_Set
c6e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 Result(interp, (
c6f0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 char *) Tcl_GetC
c700: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
c710: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f Ptr->self), TCL_
c720: 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 VOLATILE);..
c730: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
c740: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
c750: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
c760: 20 2a 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: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d -----. *. * Unim
c7b0: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a portObjCmd --. *
c7c0: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
c7d0: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f re is invoked to
c7e0: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d remove the topm
c7f0: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 ost channel filt
c800: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
c810: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
c820: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
c830: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
c840: 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 . *.May modify t
c850: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 he behavior of a
c860: 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a n IO channel.. *
c870: 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
c8c0: 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 c int.UnimportOb
c8d0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
c8e0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
c8f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
c900: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
c910: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
c920: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e {. Tcl_Chann
c930: 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 el chan;../* The
c940: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 channel to set
c950: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 a mode on. */..
c960: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
c970: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
c980: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
c990: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
c9a0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
c9b0: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
c9c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
c9d0: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
c9e0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
c9f0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 nterp, Tcl_GetSt
ca00: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e ring(objv[1]), N
ca10: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 ULL);. if (ch
ca20: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
ca30: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
ca40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
ca50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b }.. /* Mak
ca60: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
ca70: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
ca80: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
ca90: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
caa0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
cab0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
cac0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
cad0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
cae0: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
caf0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
cb00: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
cb10: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
cb20: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
cb30: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 .."\": not a TLS
cb40: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 channel", NULL)
cb50: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
cb60: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
cb70: 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 "TLS", "UNIMPORT
cb80: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 ", "CHANNEL", "I
cb90: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a NVALID", (char *
cba0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
cbb0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
cbc0: 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 }.. if (Tcl_U
cbd0: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e nstackChannel(in
cbe0: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 terp, chan) == T
cbf0: 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 CL_ERROR) {..ret
cc00: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
cc10: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e }.. return
cc20: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
cc30: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
cc40: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
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 2d 2d 2d 2d 2d 0a ---------------.
cc90: 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d *. * CTX_Init -
cca0: 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 - construct a SS
ccb0: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 L_CTX instance.
ccc0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
ccd0: 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 .A valid SSL_CTX
cce0: 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c instance or NUL
ccf0: 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 L.. *. * Side ef
cd00: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 fects:. *.constr
cd10: 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 ucts SSL context
cd20: 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d (CTX). *. *----
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 2d 2d 2d 2d 2d 0a ---------------.
cd70: 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 */.static SSL_C
cd80: 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 TX *.CTX_Init(St
cd90: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 ate *statePtr, i
cda0: 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 nt isServer, int
cdb0: 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 proto, char *ke
cdc0: 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 yfile, char *cer
cdd0: 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 tfile,. unsig
cde0: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 ned char *key, u
cdf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 nsigned char *ce
ce00: 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c rt, int key_len,
ce10: 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 int cert_len, c
ce20: 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 har *CAdir,.
ce30: 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 char *CAfile, ch
ce40: 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 ar *ciphers, cha
ce50: 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c r *ciphersuites,
ce60: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 int level, char
ce70: 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 *DHparams) {.
ce80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
ce90: 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d terp = statePtr-
cea0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c >interp;. SSL
ceb0: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
cec0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
ced0: 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 g ds;. Tcl_DS
cee0: 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 tring ds1;. i
cef0: 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 nt off = 0;.
cf00: 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 int load_private
cf10: 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 _key;. const
cf20: 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 SSL_METHOD *meth
cf30: 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 od;.. dprintf
cf40: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
cf50: 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 if (!proto) {..
cf60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
cf70: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c (interp, "no val
cf80: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 id protocol sele
cf90: 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 cted", (char *)
cfa0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
cfb0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
cfc0: 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f /* create SSL co
cfd0: 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 ntext */.#if OPE
cfe0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
cff0: 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 BER >= 0x1010000
d000: 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 0L || defined(NO
d010: 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL2) || define
d020: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
d030: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 2). if (ENABL
d040: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d050: 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 OTO_SSL2)) {..Tc
d060: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d070: 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f nterp, "SSL2 pro
d080: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
d090: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
d0a0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
d0b0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
d0c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
d0d0: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
d0e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
d0f0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
d100: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
d110: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c TO_SSL3)) {..Tcl
d120: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d130: 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 terp, "SSL3 prot
d140: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
d150: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
d160: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
d170: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
d180: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
d190: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
d1a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
d1b0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
d1c0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
d1d0: 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f O_TLS1)) {..Tcl_
d1e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d1f0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 erp, "TLS 1.0 pr
d200: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d210: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
d220: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d230: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
d240: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
d250: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
d260: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d270: 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 LS1_1). if (E
d280: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
d290: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 S_PROTO_TLS1_1))
d2a0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
d2b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
d2c0: 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.1 protocol n
d2d0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
d2e0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
d2f0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
d300: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
d310: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
d320: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
d330: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 SSL_NO_TLS1_2).
d340: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
d350: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
d360: 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f TLS1_2)) {..Tcl_
d370: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d380: 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 erp, "TLS 1.2 pr
d390: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d3a0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
d3b0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d3c0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
d3d0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
d3e0: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 _TLS1_3) || defi
d3f0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d400: 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 LS1_3). if (E
d410: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
d420: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 S_PROTO_TLS1_3))
d430: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
d440: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
d450: 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.3 protocol n
d460: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
d470: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
d480: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
d490: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 }.#endif. if
d4a0: 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a (proto == 0) {.
d4b0: 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e ./* Use full ran
d4c0: 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 ge */..SSL_CTX_s
d4d0: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 et_min_proto_ver
d4e0: 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53 sion(ctx, 0);..S
d4f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
d500: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
d510: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 , 0);. }..
d520: 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 switch (proto)
d530: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 {.#if OPENSSL_VE
d540: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
d550: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
d560: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
d570: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
d580: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
d590: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
d5a0: 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 SSL2:..method =
d5b0: 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 isServer ? SSLv2
d5c0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
d5d0: 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f : SSLv2_client_
d5e0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
d5f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
d600: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
d610: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d620: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 SL_NO_SSL3) && !
d630: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d640: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a NO_SSL3_METHOD).
d650: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
d660: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 TO_SSL3:..method
d670: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 = isServer ? SS
d680: 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f Lv3_server_metho
d690: 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 d() : SSLv3_clie
d6a0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
d6b0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
d6c0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
d6d0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d6e0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 ENSSL_NO_TLS1) &
d6f0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d700: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
d710: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
d720: 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 PROTO_TLS1:..met
d730: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
d740: 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 TLSv1_server_me
d750: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 thod() : TLSv1_c
d760: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
d770: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
d780: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
d790: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
d7a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d7b0: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
d7c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d7d0: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_1_METHOD).
d7e0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
d7f0: 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_1:..method =
d800: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
d810: 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 1_1_server_metho
d820: 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c d() : TLSv1_1_cl
d830: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
d840: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
d850: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
d860: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
d870: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d880: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
d890: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d8a0: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 _2_METHOD). c
d8b0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
d8c0: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 S1_2:..method =
d8d0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 isServer ? TLSv1
d8e0: 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 _2_server_method
d8f0: 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 () : TLSv1_2_cli
d900: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
d910: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
d920: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
d930: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
d940: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d950: 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 _3). case TLS
d960: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 _PROTO_TLS1_3:..
d970: 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 /* Use the gener
d980: 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f ic method and co
d990: 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 nstraint range a
d9a0: 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 fter context is
d9b0: 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 created */..meth
d9c0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
d9d0: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f TLS_server_metho
d9e0: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 d() : TLS_client
d9f0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
da00: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 k;.#endif. de
da10: 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 fault:../* Negot
da20: 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61 iate highest ava
da30: 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 ilable SSL/TLS v
da40: 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f ersion */..metho
da50: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
da60: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 LS_server_method
da70: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f () : TLS_client_
da80: 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 method();.#if OP
da90: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
daa0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
dab0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
dac0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
dad0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
dae0: 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e SL2)..off |= (EN
daf0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
db00: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f _PROTO_SSL2) ?
db10: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 0 : SSL_OP_NO_S
db20: 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 SLv2);.#endif.#i
db30: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
db40: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
db50: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
db60: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
db70: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
db80: 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a TO_SSL3) ? 0 :
db90: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 SSL_OP_NO_SSLv3
dba0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
dbb0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
dbc0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
dbd0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 SSL_NO_TLS1)..of
dbe0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
dbf0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
dc00: 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c LS1) ? 0 : SSL
dc10: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 _OP_NO_TLSv1);.#
dc20: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
dc30: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
dc40: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
dc50: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 L_NO_TLS1_1)..of
dc60: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
dc70: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
dc80: 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c LS1_1) ? 0 : SSL
dc90: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b _OP_NO_TLSv1_1);
dca0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
dcb0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
dcc0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
dcd0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 SSL_NO_TLS1_2)..
dce0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
dcf0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
dd00: 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 _TLS1_2) ? 0 : S
dd10: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 SL_OP_NO_TLSv1_2
dd20: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
dd30: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
dd40: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
dd50: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
dd60: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
dd70: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
dd80: 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a TO_TLS1_3) ? 0 :
dd90: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
dda0: 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 _3);.#endif..bre
ddb0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 ak;. }.. E
ddc0: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
ddd0: 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c ;.. ctx = SSL
dde0: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 _CTX_new(method)
ddf0: 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20 ;. if (!ctx)
de00: 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b {..return(NULL);
de10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
de20: 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 getenv(SSLKEYLOG
de30: 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 FILE)) {..SSL_CT
de40: 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c X_set_keylog_cal
de50: 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f lback(ctx, KeyLo
de60: 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 gCallback);.
de70: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 }..#if !defined(
de80: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
de90: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
dea0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 O_TLS1_3). if
deb0: 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 (proto == TLS_P
dec0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 ROTO_TLS1_3) {..
ded0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f SSL_CTX_set_min_
dee0: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
def0: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f x, TLS1_3_VERSIO
df00: 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 N);..SSL_CTX_set
df10: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _max_proto_versi
df20: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 on(ctx, TLS1_3_V
df30: 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 ERSION);. }.#
df40: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f endif.. /* Fo
df50: 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 rce cipher selec
df60: 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 tion order by se
df70: 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 rver */. if (
df80: 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 !isServer) {..SS
df90: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e L_CTX_set_option
dfa0: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 s(ctx, SSL_OP_CI
dfb0: 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 PHER_SERVER_PREF
dfc0: 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a ERENCE);. }..
dfd0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
dfe0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
dff0: 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 0100000L. Ope
e000: 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 nSSL_add_all_alg
e010: 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f orithms(); /* Lo
e020: 61 64 20 63 69 70 68 65 72 73 20 61 6e 64 20 64 ad ciphers and d
e030: 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66 igests */.#endif
e040: 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
e050: 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 t_app_data(ctx,
e060: 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 (void*)interp);.
e070: 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 /* remember the
e080: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 interpreter */.
e090: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f SSL_CTX_set_o
e0a0: 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f ptions(ctx, SSL_
e0b0: 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 OP_ALL);./* all
e0c0: 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 SSL bug workarou
e0d0: 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 nds */. SSL_C
e0e0: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 TX_set_options(c
e0f0: 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f tx, SSL_OP_NO_CO
e100: 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 MPRESSION);./* d
e110: 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 isable compressi
e120: 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f on even if suppo
e130: 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f rted */. SSL_
e140: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
e150: 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 ctx, off);../* d
e160: 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 isable protocol
e170: 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 versions */.#if
e180: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
e190: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 NUMBER < 0x10101
e1a0: 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 000L. SSL_CTX
e1b0: 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 _set_mode(ctx, S
e1c0: 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 SL_MODE_AUTO_RET
e1d0: 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e RY);./* handle n
e1e0: 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e ew handshakes in
e1f0: 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 background. On
e200: 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 by default in Op
e210: 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a enSSL 1.1.1. */.
e220: 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 #endif. SSL_C
e230: 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 TX_sess_set_cach
e240: 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 e_size(ctx, 128)
e250: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 ;.. /* Set us
e260: 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 er defined ciphe
e270: 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 rs, cipher suite
e280: 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 s, and security
e290: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 level */. if
e2a0: 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c ((ciphers != NUL
e2b0: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 L) && !SSL_CTX_s
e2c0: 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 et_cipher_list(c
e2d0: 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a tx, ciphers)) {.
e2e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
e2f0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 t(interp, "Set c
e300: 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e iphers failed: N
e310: 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 o valid ciphers"
e320: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
e330: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
e340: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ctx);..return NU
e350: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
e360: 20 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 ((ciphersuites
e370: 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c != NULL) && !SSL
e380: 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 _CTX_set_ciphers
e390: 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 uites(ctx, ciphe
e3a0: 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c rsuites)) {..Tcl
e3b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e3c0: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 terp, "Set ciphe
e3d0: 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a r suites failed:
e3e0: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 No valid cipher
e3f0: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c s", (char *) NUL
e400: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
e410: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
e420: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
e430: 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 /* Set security
e440: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 level */. if
e450: 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 (level > -1 &&
e460: 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a level < 6) {../*
e470: 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 SSL_set_securit
e480: 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f y_level */..SSL_
e490: 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 CTX_set_security
e4a0: 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 _level(ctx, leve
e4b0: 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f l);. }.. /
e4c0: 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 * set some callb
e4d0: 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f acks */. SSL_
e4e0: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
e4f0: 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 passwd_cb(ctx, P
e500: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 asswordCallback)
e510: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 ;. SSL_CTX_se
e520: 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 t_default_passwd
e530: 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 _cb_userdata(ctx
e540: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
e550: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 tr);.. /* rea
e560: 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d d a Diffie-Hellm
e570: 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 an parameters fi
e580: 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 le, or use the b
e590: 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 uilt-in one */.#
e5a0: 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f ifdef OPENSSL_NO
e5b0: 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 _DH. if (DHpa
e5c0: 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a rams != NULL) {.
e5d0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
e5e0: 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 t(interp, "DH pa
e5f0: 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 rameter support
e600: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 not available",
e610: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
e620: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
e630: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c x);..return NULL
e640: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 ;. }.#else.
e650: 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 {..DH* dh;..if
e660: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 (DHparams != NU
e670: 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a LL) {.. BIO *
e680: 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 bio;.. Tcl_DS
e690: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a tringInit(&ds);.
e6a0: 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e . bio = BIO_n
e6b0: 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 ew_file(F2N(DHpa
e6c0: 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 rams, &ds), "r")
e6d0: 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 ;.. if (!bio)
e6e0: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 {...Tcl_DString
e6f0: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c Free(&ds);...Tcl
e700: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e710: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 terp, "Could not
e720: 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 find DH paramet
e730: 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 ers file", (char
e740: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
e750: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
e760: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
e770: 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d }... dh =
e780: 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 PEM_read_bio_DH
e790: 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c params(bio, NULL
e7a0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 , NULL, NULL);..
e7b0: 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f BIO_free(bio
e7c0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 );.. Tcl_DStr
e7d0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
e7e0: 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 if (!dh) {...
e7f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
e800: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 (interp, "Could
e810: 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61 not read DH para
e820: 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 meters from file
e830: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
e840: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 );...SSL_CTX_fre
e850: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e e(ctx);...return
e860: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 NULL;.. }..
e870: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 SSL_CTX_set_t
e880: 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a mp_dh(ctx, dh);.
e890: 09 20 20 20 20 44 48 5f 66 72 65 65 28 64 68 29 . DH_free(dh)
e8a0: 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 ;...} else {..
e8b0: 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b 6e /* Use well kn
e8c0: 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74 65 72 own DH parameter
e8d0: 73 20 74 68 61 74 20 68 61 76 65 20 62 75 69 6c s that have buil
e8e0: 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69 6e 20 t-in support in
e8f0: 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 20 OpenSSL */..
e900: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 if (!SSL_CTX_set
e910: 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 _dh_auto(ctx, 1)
e920: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
e930: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
e940: 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c 65 Could not enable
e950: 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20 22 2c set DH auto: ",
e960: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
e970: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
e980: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
e990: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
e9a0: 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 }..}. }.#
e9b0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 endif.. /* se
e9c0: 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 t our certificat
e9d0: 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 e */. load_pr
e9e0: 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 ivate_key = 0;.
e9f0: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 if (certfile
ea00: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 != NULL) {..load
ea10: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 _private_key = 1
ea20: 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 ;...Tcl_DStringI
ea30: 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 nit(&ds);...if (
ea40: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 SSL_CTX_use_cert
ea50: 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 ificate_file(ctx
ea60: 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 , F2N(certfile,
ea70: 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 &ds), SSL_FILETY
ea80: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a PE_PEM) <= 0) {.
ea90: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
eaa0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
eab0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
eac0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
ead0: 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 to set certific
eae0: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 ate file ", cert
eaf0: 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 file, ": ",....
eb00: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 REASON(), (c
eb10: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
eb20: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 SSL_CTX_free(
eb30: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ctx);.. retur
eb40: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d n NULL;..}. }
eb50: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 else if (cert !
eb60: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f = NULL) {..load_
eb70: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b private_key = 1;
eb80: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 ..if (SSL_CTX_us
eb90: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 e_certificate_AS
eba0: 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e N1(ctx, cert_len
ebb0: 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a , cert) <= 0) {.
ebc0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
ebd0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
ebe0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
ebf0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
ec00: 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 to set certific
ec10: 61 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 ate: ",....
ec20: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
ec30: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
ec40: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
ec50: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
ec60: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 LL;..}. } els
ec70: 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 e {..certfile =
ec80: 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f (char*)X509_get_
ec90: 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c default_cert_fil
eca0: 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 e();...if (SSL_C
ecb0: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 TX_use_certifica
ecc0: 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 te_file(ctx, cer
ecd0: 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 tfile, SSL_FILET
ece0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b YPE_PEM) <= 0) {
ecf0: 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f .#if 0.. Tcl_
ed00: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
ed10: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ;.. Tcl_Appen
ed20: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
ed30: 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 "unable to use d
ed40: 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 efault certifica
ed50: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 te file ", certf
ed60: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 ile, ": ",....
ed70: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 REASON(), (ch
ed80: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
ed90: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
eda0: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
edb0: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d NULL;.#endif..}
edc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 . }.. /* s
edd0: 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b et our private k
ede0: 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f ey */. if (lo
edf0: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 ad_private_key)
ee00: 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d {..if (keyfile =
ee10: 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d = NULL && key ==
ee20: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 NULL) {.. ke
ee30: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 yfile = certfile
ee40: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 ;..}...if (keyfi
ee50: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 le != NULL) {..
ee60: 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 /* get the pr
ee70: 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 ivate key associ
ee80: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 ated with this c
ee90: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 ertificate */..
eea0: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d if (keyfile =
eeb0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 = NULL) {...keyf
eec0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a ile = certfile;.
eed0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
eee0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 (SSL_CTX_use_Pri
eef0: 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 vateKey_file(ctx
ef00: 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 , F2N(keyfile, &
ef10: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ds), SSL_FILETYP
ef20: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 E_PEM) <= 0) {..
ef30: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
ef40: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 (&ds);.../* flus
ef50: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 h the passphrase
ef60: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 which might be
ef70: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 left in the resu
ef80: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 lt */...Tcl_SetR
ef90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 esult(interp, NU
efa0: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b LL, TCL_STATIC);
efb0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
efc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
efd0: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 ble to set publi
efe0: 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 c key file ", ke
eff0: 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 yfile, " ",....
f000: 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 REASON()
f010: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
f020: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
f030: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
f040: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 NULL;.. }..
f050: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
f060: 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 e(&ds);...} else
f070: 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c if (key != NULL
f080: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c ) {.. if (SSL
f090: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 _CTX_use_Private
f0a0: 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 Key_ASN1(EVP_PKE
f0b0: 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c Y_RSA, ctx, key,
f0c0: 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b key_len) <= 0) {
f0d0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ...Tcl_DStringFr
f0e0: 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c ee(&ds);.../* fl
f0f0: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 ush the passphra
f100: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 se which might b
f110: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 e left in the re
f120: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 sult */...Tcl_Se
f130: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
f140: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 NULL, TCL_STATIC
f150: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 );...Tcl_AppendR
f160: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
f170: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 nable to set pub
f180: 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 lic key: ", REAS
f190: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
f1a0: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
f1b0: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
f1c0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
f1d0: 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b ..}../* Now we k
f1e0: 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 now that a key a
f1f0: 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 nd cert have bee
f200: 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 n set against..
f210: 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 * the SSL contex
f220: 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 t */..if (!SSL_C
f230: 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 TX_check_private
f240: 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 _key(ctx)) {..
f250: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
f260: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 lt(interp, "priv
f270: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 ate key does not
f280: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 match the certi
f290: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 ficate public ke
f2a0: 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 y",.... (cha
f2b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
f2c0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
f2d0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
f2e0: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a NULL;..}. }..
f2f0: 20 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66 /* Set verif
f300: 69 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 ication CAs */.
f310: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
f320: 69 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c it(&ds);. Tcl
f330: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
f340: 31 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 1);. /* There
f350: 20 69 73 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 is one default
f360: 64 69 72 65 63 74 6f 72 79 2c 20 6f 6e 65 20 64 directory, one d
f370: 65 66 61 75 6c 74 20 66 69 6c 65 2c 20 61 6e 64 efault file, and
f380: 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 73 74 6f one default sto
f390: 72 65 2e 0a 09 54 68 65 20 64 65 66 61 75 6c 74 re...The default
f3a0: 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65 73 CA certificates
f3b0: 20 64 69 72 65 63 74 6f 72 79 20 28 61 6e 64 20 directory (and
f3c0: 64 65 66 61 75 6c 74 20 73 74 6f 72 65 29 20 69 default store) i
f3d0: 73 20 69 6e 20 74 68 65 20 4f 70 65 6e 53 53 4c s in the OpenSSL
f3e0: 0a 09 63 65 72 74 73 20 64 69 72 65 63 74 6f 72 ..certs director
f3f0: 79 2e 20 49 74 20 63 61 6e 20 62 65 20 6f 76 65 y. It can be ove
f400: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 rridden by the S
f410: 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20 SL_CERT_DIR env
f420: 76 61 72 2e 20 54 68 65 0a 09 64 65 66 61 75 6c var. The..defaul
f430: 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65 t CA certificate
f440: 73 20 66 69 6c 65 20 69 73 20 63 61 6c 6c 65 64 s file is called
f450: 20 63 65 72 74 2e 70 65 6d 20 69 6e 20 74 68 65 cert.pem in the
f460: 20 64 65 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c default OpenSSL
f470: 0a 09 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20 ..directory. It
f480: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 can be overridde
f490: 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 n by the SSL_CER
f4a0: 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 T_FILE env var.
f4b0: 2a 2f 0a 09 2f 2a 20 69 6e 74 20 53 53 4c 5f 43 */../* int SSL_C
f4c0: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 TX_set_default_v
f4d0: 65 72 69 66 79 5f 64 69 72 28 53 53 4c 5f 43 54 erify_dir(SSL_CT
f4e0: 58 20 2a 63 74 78 29 20 61 6e 64 20 69 6e 74 20 X *ctx) and int
f4f0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
f500: 75 6c 74 5f 76 65 72 69 66 79 5f 66 69 6c 65 28 ult_verify_file(
f510: 53 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 2a 2f SSL_CTX *ctx) */
f520: 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 . if (!SSL_CT
f530: 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f X_load_verify_lo
f540: 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e cations(ctx, F2N
f550: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 (CAfile, &ds), F
f560: 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29 29 2N(CAdir, &ds1))
f570: 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 65 ||..!SSL_CTX_se
f580: 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 t_default_verify
f590: 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a 23 _paths(ctx)) {.#
f5a0: 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 6e if 0..Tcl_DStrin
f5b0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63 6c gFree(&ds);..Tcl
f5c0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
f5d0: 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 75 1);../* Don't cu
f5e0: 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66 20 rrently care if
f5f0: 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 54 this fails */..T
f600: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
f610: 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65 66 interp, "SSL def
f620: 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 74 68 ault verify path
f630: 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 s: ", REASON(),
f640: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
f650: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
f660: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c x);..return NULL
f670: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a ;.#endif. }..
f680: 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 /* https://s
f690: 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 ourceforge.net/p
f6a0: 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f /tls/bugs/57/ */
f6b0: 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f . /* XXX:TODO
f6c0: 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 : Let the user s
f6d0: 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 upply values her
f6e0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d e instead of som
f6f0: 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 ething that exis
f700: 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 ts on the filesy
f710: 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 stem */. if (
f720: 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 CAfile != NULL)
f730: 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 {..STACK_OF(X509
f740: 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 _NAME) *certName
f750: 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 s = SSL_load_cli
f760: 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 ent_CA_file(F2N(
f770: 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 CAfile, &ds));..
f780: 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d if (certNames !=
f790: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 NULL) {.. SS
f7a0: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 L_CTX_set_client
f7b0: 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 _CA_list(ctx, ce
f7c0: 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 rtNames);..}.
f7d0: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 }.. Tcl_DStr
f7e0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 ingFree(&ds);.
f7f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
f800: 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 e(&ds1);. ret
f810: 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a urn ctx;.}.../*.
f820: 20 2a 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: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 -----. *. * Stat
f870: 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 usObjCmd -- retu
f880: 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66 rn certificate f
f890: 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 or connected pee
f8a0: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
f8b0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
f8c0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
f8d0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
f8e0: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
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 2d 2d 2d 2d ----------------
f930: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
f940: 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c .StatusObjCmd(Cl
f950: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
f960: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
f970: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
f980: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
f990: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
f9a0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
f9b0: 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b . X509 *peer;
f9c0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
f9d0: 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 jPtr;. Tcl_Ch
f9e0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 annel chan;.
f9f0: 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d char *channelNam
fa00: 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 e, *ciphers;.
fa10: 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 int mode;. c
fa20: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
fa30: 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 ar *proto;. u
fa40: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b nsigned int len;
fa50: 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 . int nid, re
fa60: 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 s;.. dprintf(
fa70: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
fa80: 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 if (objc < 2 ||
fa90: 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a objc > 3 || (obj
faa0: 63 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d c == 3 && !strcm
fab0: 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 p(Tcl_GetString(
fac0: 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 objv[1]), "-loca
fad0: 6c 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f l"))) {..Tcl_Wro
fae0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
faf0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f , 1, objv, "?-lo
fb00: 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a cal? channel");.
fb10: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
fb20: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
fb30: 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 Get channel Id
fb40: 2a 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 */. channelNa
fb50: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 me = Tcl_GetStri
fb60: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 28 ngFromObj(objv[(
fb70: 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 objc == 2 ? 1 :
fb80: 32 29 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 2)], (Tcl_Size *
fb90: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 63 68 61 ) NULL);. cha
fba0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
fbb0: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e el(interp, chann
fbc0: 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a elName, &mode);.
fbd0: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
fbe0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
fbf0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
fc00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
fc10: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
fc20: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
fc30: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
fc40: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
fc50: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
fc60: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 el(chan);. if
fc70: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
fc80: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
fc90: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
fca0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
fcb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
fcc0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
fcd0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
fce0: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 e(chan),..."\":
fcf0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
fd00: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f l", NULL);..Tcl_
fd10: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
fd20: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 erp, "TLS", "STA
fd30: 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c TUS", "CHANNEL",
fd40: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
fd50: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
fd60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
fd70: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 }. statePt
fd80: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 r = (State *) Tc
fd90: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
fda0: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
fdb0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 . /* Get cert
fdc0: 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 ificate for peer
fdd0: 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 or self */.
fde0: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b if (objc == 2) {
fdf0: 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 ..peer = SSL_get
fe00: 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 _peer_certificat
fe10: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
fe20: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
fe30: 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 peer = SSL_get_c
fe40: 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 ertificate(state
fe50: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
fe60: 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 . /* Get X509
fe70: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 certificate inf
fe80: 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 o */. if (pee
fe90: 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 r) {..objPtr = T
fea0: 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e ls_NewX509Obj(in
feb0: 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 terp, peer);..if
fec0: 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
fed0: 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 X509_free(pe
fee0: 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d er);.. peer =
fef0: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 NULL;..}. }
ff00: 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d else {..objPtr =
ff10: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
ff20: 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0, NULL);. }.
ff30: 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d . /* Peer nam
ff40: 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 e */. LAPPEND
ff50: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
ff60: 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c Ptr, "peername",
ff70: 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 SSL_get0_peerna
ff80: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c me(statePtr->ssl
ff90: 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 ), -1);. LAPP
ffa0: 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 END_INT(interp,
ffb0: 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c objPtr, "sbits",
ffc0: 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f SSL_get_cipher_
ffd0: 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 bits(statePtr->s
ffe0: 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 sl, NULL));..
fff0: 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 ciphers = (char
10000 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 *)SSL_get_cipher
10010 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
10020 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
10030 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10040 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 "cipher", ciphe
10050 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a rs, -1);.. /*
10060 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 39 Verify the X509
10070 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 65 certificate pre
10080 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 sented by the pe
10090 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e er */. LAPPEN
100a0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
100b0 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65 73 jPtr, "verifyRes
100c0 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 ult",..X509_veri
100d0 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 fy_cert_error_st
100e0 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 ring(SSL_get_ver
100f0 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 ify_result(state
10100 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b Ptr->ssl)), -1);
10110 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 .. /* Verify
10120 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 mode */. mode
10130 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 = SSL_get_verif
10140 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d y_mode(statePtr-
10150 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d >ssl);. if (m
10160 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
10170 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 Y_NONE) {..LAPPE
10180 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
10190 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f bjPtr, "verifyMo
101a0 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 de", "none", -1)
101b0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
101c0 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a Tcl_Obj *listObj
101d0 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
101e0 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 tObj(0, NULL);..
101f0 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f if (mode && SSL_
10200 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 VERIFY_PEER) {..
10210 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
10220 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
10230 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c erp, listObjPtr,
10240 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
10250 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a j("peer", -1));.
10260 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 .}..if (mode &&
10270 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f SSL_VERIFY_FAIL_
10280 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 IF_NO_PEER_CERT)
10290 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
102a0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
102b0 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a (interp, listObj
102c0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
102d0 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e ngObj("fail if n
102e0 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 o peer cert", -1
102f0 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 ));..}..if (mode
10300 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 && SSL_VERIFY_C
10310 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 LIENT_ONCE) {..
10320 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
10330 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10340 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 rp, listObjPtr,
10350 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10360 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 ("client once",
10370 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f -1));..}..if (mo
10380 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 de && SSL_VERIFY
10390 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 _POST_HANDSHAKE)
103a0 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
103b0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
103c0 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a (interp, listObj
103d0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
103e0 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 ngObj("post hand
103f0 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d shake", -1));..}
10400 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e ..LAPPEND_OBJ(in
10410 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 terp, objPtr, "v
10420 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 erifyMode", list
10430 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 ObjPtr). }..
10440 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 /* Verify mod
10450 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c e depth */. L
10460 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
10470 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 p, objPtr, "veri
10480 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 fyDepth", SSL_ge
10490 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 t_verify_depth(s
104a0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a tatePtr->ssl));.
104b0 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 . /* Report t
104c0 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 he selected prot
104d0 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 ocol as a result
104e0 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 of the negotiat
104f0 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 ion */. SSL_g
10500 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 et0_alpn_selecte
10510 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c d(statePtr->ssl,
10520 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a &proto, &len);.
10530 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
10540 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10550 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 "alpn", (char *)
10560 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 proto, (Tcl_Size
10570 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 ) len);. LAPP
10580 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10590 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f objPtr, "protoco
105a0 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 l", SSL_get_vers
105b0 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ion(statePtr->ss
105c0 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a l), -1);.. /*
105d0 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 Valid for non-R
105e0 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 SA signature and
105f0 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 TLS 1.3 */.
10600 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b if (objc == 2) {
10610 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
10620 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e peer_signature_n
10630 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c id(statePtr->ssl
10640 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 , &nid);. } e
10650 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c lse {..res = SSL
10660 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e _get_signature_n
10670 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c id(statePtr->ssl
10680 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 , &nid);. }.
10690 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 if (!res) {ni
106a0 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 d = 0;}. LAPP
106b0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
106c0 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 objPtr, "signatu
106d0 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 reHashAlgorithm"
106e0 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 , OBJ_nid2ln(nid
106f0 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 69 66 20 ), -1);.. if
10700 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 (objc == 2) {..r
10710 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 es = SSL_get_pee
10720 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 r_signature_type
10730 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 _nid(statePtr->s
10740 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d sl, &nid);. }
10750 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 else {..res = S
10760 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 SL_get_signature
10770 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 _type_nid(stateP
10780 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a tr->ssl, &nid);.
10790 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 }. if (!r
107a0 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 es) {nid = 0;}.
107b0 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
107c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
107d0 73 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c 20 signatureType",
107e0 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c OBJ_nid2ln(nid),
107f0 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 -1);.. Tcl_S
10800 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
10810 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
10820 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
10830 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
10840 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
10850 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e ------. *. * Con
108a0 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d nectionInfoObjCm
108b0 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e d -- return conn
108c0 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d ection info from
108d0 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 OpenSSL.. *. *
108e0 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 Results:. *.A li
108f0 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e st of connection
10900 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d info. *. *----
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 2d 2d 2d 2d 2d 0a ---------------.
10950 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 */..static int
10960 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 ConnectionInfoOb
10970 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
10980 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
10990 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
109a0 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
109b0 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
109c0 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e {. Tcl_Chann
109d0 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 el chan;../* The
109e0 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 channel to set
109f0 61 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 a mode on */.
10a00 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
10a10 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 ;../* client sta
10a20 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 te for ssl socke
10a30 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a t */. Tcl_Obj
10a40 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 *objPtr, *listP
10a50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 tr;. const SS
10a60 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 L *ssl;. cons
10a70 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 t SSL_CIPHER *ci
10a80 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 pher;. const
10a90 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 SSL_SESSION *ses
10aa0 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 sion;. const
10ab0 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a 0a 20 20 20 EVP_MD *md;..
10ac0 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 if (objc != 2)
10ad0 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
10ae0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
10af0 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b bjv, "channel");
10b00 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
10b10 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
10b20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
10b30 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 annel(interp, Tc
10b40 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
10b50 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28 54 63 6c bj(objv[1], (Tcl
10b60 5f 53 69 7a 65 20 2a 29 4e 55 4c 4c 29 2c 20 4e _Size *)NULL), N
10b70 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 ULL);. if (ch
10b80 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
10b90 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
10ba0 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
10bb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
10bc0 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
10bd0 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
10be0 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
10bf0 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
10c00 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
10c10 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
10c20 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
10c30 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
10c40 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
10c50 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
10c60 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
10c70 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
10c80 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
10c90 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 . "\": not a
10ca0 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
10cb0 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 LL);..Tcl_SetErr
10cc0 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
10cd0 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f TLS", "CONNECTIO
10ce0 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 N", "CHANNEL", "
10cf0 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
10d00 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
10d10 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
10d20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 }.. objPtr
10d30 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
10d40 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 (0, NULL);..
10d50 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e /* Connection in
10d60 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 fo */. stateP
10d70 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 tr = (State *)Tc
10d80 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
10d90 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
10da0 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 ssl = stateP
10db0 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 tr->ssl;. if
10dc0 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl != NULL) {.
10dd0 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 ./* connection s
10de0 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 tate */..LAPPEND
10df0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
10e00 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53 Ptr, "state", SS
10e10 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c L_state_string_l
10e20 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a ong(ssl), -1);..
10e30 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 ./* Get SNI requ
10e40 65 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d ested server nam
10e50 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 e */..LAPPEND_ST
10e60 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
10e70 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 , "servername",
10e80 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 SSL_get_serverna
10e90 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e me(ssl, TLSEXT_N
10ea0 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d AMETYPE_host_nam
10eb0 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 e), -1);.../* Ge
10ec0 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c t protocol */..L
10ed0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
10ee0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 p, objPtr, "prot
10ef0 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 ocol", SSL_get_v
10f00 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 ersion(ssl), -1)
10f10 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 ;.../* Renegotia
10f20 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a tion allowed */.
10f30 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
10f40 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 terp, objPtr, "r
10f50 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c enegotiation_all
10f60 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 owed", SSL_get_s
10f70 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 ecure_renegotiat
10f80 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 ion_support(ssl)
10f90 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 );.../* Get secu
10fa0 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c rity level */..L
10fb0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
10fc0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 p, objPtr, "secu
10fd0 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c rity_level", SSL
10fe0 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _get_security_le
10ff0 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 vel(ssl));.../*
11000 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a Session info */.
11010 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
11020 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
11030 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 ession_reused",
11040 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 SSL_session_reus
11050 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 ed(ssl));.../* I
11060 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f s server info */
11070 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
11080 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11090 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f is_server", SSL_
110a0 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b is_server(ssl));
110b0 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f .../* Is DTLS */
110c0 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
110d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
110e0 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 is_dtls", SSL_is
110f0 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 _dtls(ssl));.
11100 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 }.. /* Ciphe
11110 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 r info */. ci
11120 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 pher = SSL_get_c
11130 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 urrent_cipher(ss
11140 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 l);. if (ciph
11150 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 er != NULL) {..c
11160 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 har buf[BUFSIZ]
11170 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 = {0};..int bits
11180 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a , alg_bits;.../*
11190 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a Cipher name */.
111a0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
111b0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 erp, objPtr, "ci
111c0 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 pher", SSL_CIPHE
111d0 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 R_get_name(ciphe
111e0 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 r), -1);.../* RF
111f0 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 C name of cipher
11200 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
11210 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11220 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 "standard_name"
11230 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 , SSL_CIPHER_sta
11240 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 ndard_name(ciphe
11250 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 r), -1);.../* Op
11260 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 enSSL name of ci
11270 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 pher */..LAPPEND
11280 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11290 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 Ptr, "openssl_na
112a0 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 me", OPENSSL_cip
112b0 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 her_name(SSL_CIP
112c0 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d HER_standard_nam
112d0 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b e(cipher)), -1);
112e0 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 .../* number of
112f0 73 65 63 72 65 74 20 62 69 74 73 20 75 73 65 64 secret bits used
11300 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 for cipher */..
11310 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 bits = SSL_CIPHE
11320 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 R_get_bits(ciphe
11330 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 r, &alg_bits);..
11340 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
11350 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 rp, objPtr, "sec
11360 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29 ret_bits", bits)
11370 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 ;..LAPPEND_INT(i
11380 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11390 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c algorithm_bits",
113a0 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 alg_bits);../*
113b0 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 alg_bits is actu
113c0 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 al key secret bi
113d0 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 ts. If use bits
113e0 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f and secret (algo
113f0 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 rithm) bits diff
11400 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 er,.. the rest
11410 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 of the bits are
11420 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 fixed, i.e. for
11430 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 limited export
11440 63 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 ciphers (bits <
11450 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 56) */.../* Indi
11460 63 61 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f cates which SSL/
11470 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 TLS protocol ver
11480 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e sion first defin
11490 65 64 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f ed the cipher */
114a0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
114b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d terp, objPtr, "m
114c0 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c in_version", SSL
114d0 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 _CIPHER_get_vers
114e0 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 ion(cipher), -1)
114f0 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 ;.../* Cipher NI
11500 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 D */..LAPPEND_ST
11510 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11520 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20 28 , "cipherNID", (
11530 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c char *)OBJ_nid2l
11540 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 n(SSL_CIPHER_get
11550 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70 68 _cipher_nid(ciph
11560 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 er)), -1);..LAPP
11570 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11580 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74 4e objPtr, "digestN
11590 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a ID", (char *)OBJ
115a0 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 _nid2ln(SSL_CIPH
115b0 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 ER_get_digest_ni
115c0 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b d(cipher)), -1);
115d0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
115e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b terp, objPtr, "k
115f0 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 eyExchangeNID",
11600 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 (char *)OBJ_nid2
11610 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ln(SSL_CIPHER_ge
11620 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 29 t_kx_nid(cipher)
11630 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ), -1);..LAPPEND
11640 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11650 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63 61 Ptr, "authentica
11660 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 tionNID", (char
11670 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c *)OBJ_nid2ln(SSL
11680 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74 68 _CIPHER_get_auth
11690 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d _nid(cipher)), -
116a0 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 1);.../* message
116b0 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 authentication
116c0 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69 73 code - Cipher is
116d0 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 AEAD (e.g. GCM
116e0 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 or ChaCha20/Poly
116f0 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 1305) or not */.
11700 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74 65 ./* Authenticate
11710 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 d Encryption wit
11720 68 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 h associated dat
11730 61 20 28 41 45 41 44 29 20 63 68 65 63 6b 20 2a a (AEAD) check *
11740 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
11750 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11760 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64 22 "cipher_is_aead"
11770 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f , SSL_CIPHER_is_
11780 61 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a 0a aead(cipher));..
11790 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64 20 ./* Digest used
117a0 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 during the SSL/T
117b0 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68 65 LS handshake whe
117c0 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69 70 68 n using the ciph
117d0 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c er. */..md = SSL
117e0 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 _CIPHER_get_hand
117f0 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69 70 shake_digest(cip
11800 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 her);..LAPPEND_S
11810 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11820 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 r, "handshake_di
11830 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29 45 gest", (char *)E
11840 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 VP_MD_name(md),
11850 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 -1);.../* Get Op
11860 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 enSSL-specific I
11870 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a D, not IANA ID *
11880 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 /..LAPPEND_INT(i
11890 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
118a0 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 cipher_id", (int
118b0 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 ) SSL_CIPHER_get
118c0 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 _id(cipher));...
118d0 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 /* Two-byte ID u
118e0 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 sed in the TLS p
118f0 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 rotocol of the g
11900 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 iven cipher */..
11910 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
11920 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f rp, objPtr, "pro
11930 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 tocol_id", (int)
11940 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
11950 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 protocol_id(ciph
11960 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 er));.../* Textu
11970 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f al description o
11980 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a f the cipher */.
11990 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f .if (SSL_CIPHER_
119a0 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 description(ciph
119b0 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 er, buf, sizeof(
119c0 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b buf)) != NULL) {
119d0 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 .. LAPPEND_ST
119e0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
119f0 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c , "description",
11a00 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 buf, -1);..}.
11a10 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 }.. /* Sess
11a20 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ion info */.
11a30 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 session = SSL_ge
11a40 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a t_session(ssl);.
11a50 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 if (session
11a60 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 != NULL) {..cons
11a70 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
11a80 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 *ticket;..size_t
11a90 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 len2;..unsigned
11aa0 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 int ulen;..cons
11ab0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
11ac0 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 *session_id, *pr
11ad0 6f 74 6f 3b 0a 09 63 68 61 72 20 62 75 66 66 65 oto;..char buffe
11ae0 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 r[SSL_MAX_MASTER
11af0 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 _KEY_LENGTH];...
11b00 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 /* Report the se
11b10 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
11b20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
11b30 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 he ALPN negotiat
11b40 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 ion */..SSL_SESS
11b50 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 ION_get0_alpn_se
11b60 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 lected(session,
11b70 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a &proto, &len2);.
11b80 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
11b90 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c erp, objPtr, "al
11ba0 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 pn", (char *) pr
11bb0 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 oto, (Tcl_Size)
11bc0 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f len2);.../* Repo
11bd0 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 rt the selected
11be0 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 protocol as a re
11bf0 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 sult of the NPN
11c00 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 negotiation */.#
11c10 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 ifdef USE_NPN..S
11c20 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f SL_get0_next_pro
11c30 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 to_negotiated(ss
11c40 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e l, &proto, &ulen
11c50 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
11c60 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11c70 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 "npn", (char *)
11c80 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 proto, (Tcl_Size
11c90 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a ) ulen);.#endif.
11ca0 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 ../* Resumable s
11cb0 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 ession */..LAPPE
11cc0 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
11cd0 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 62 objPtr, "resumab
11ce0 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e le", SSL_SESSION
11cf0 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 _is_resumable(se
11d00 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 ssion));.../* Se
11d10 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 ssion start time
11d20 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 (seconds since
11d30 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45 epoch) */..LAPPE
11d40 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
11d50 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74 objPtr, "start_t
11d60 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f ime", SSL_SESSIO
11d70 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 N_get_time(sessi
11d80 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f on));.../* Timeo
11d90 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 ut value - SSL_C
11da0 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 TX_get_timeout (
11db0 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 in seconds) */..
11dc0 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 LAPPEND_LONG(int
11dd0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 erp, objPtr, "ti
11de0 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 meout", SSL_SESS
11df0 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 ION_get_timeout(
11e00 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 session));.../*
11e10 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 Session id - TLS
11e20 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f v1.2 and below o
11e30 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f nly */..session_
11e40 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e id = SSL_SESSION
11e50 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c _get_id(session,
11e60 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e &ulen);..LAPPEN
11e70 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
11e80 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
11e90 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 n_id", session_i
11ea0 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c d, (Tcl_Size) ul
11eb0 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f en);.../* Sessio
11ec0 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 n context */..se
11ed0 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 ssion_id = SSL_S
11ee0 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 ESSION_get0_id_c
11ef0 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 ontext(session,
11f00 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 &ulen);..LAPPEND
11f10 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
11f20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
11f30 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69 _context", sessi
11f40 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 on_id, (Tcl_Size
11f50 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 ) ulen);.../* Se
11f60 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 ssion ticket - c
11f70 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 lient only */..S
11f80 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
11f90 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 ticket(session,
11fa0 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b &ticket, &len2);
11fb0 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
11fc0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11fd0 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 "session_ticket
11fe0 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f ", ticket, (Tcl_
11ff0 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f Size) len2);.../
12000 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 * Session ticket
12010 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 lifetime hint (
12020 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 in seconds) */..
12030 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 LAPPEND_LONG(int
12040 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 erp, objPtr, "li
12050 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 fetime", SSL_SES
12060 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f SION_get_ticket_
12070 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 lifetime_hint(se
12080 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 ssion));.../* Ti
12090 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f cket app data */
120a0 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 ..SSL_SESSION_ge
120b0 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 t0_ticket_appdat
120c0 61 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b a(session, &tick
120d0 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 et, &len2);..LAP
120e0 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 PEND_BARRAY(inte
120f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 rp, objPtr, "tic
12100 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 ket_app_data", t
12110 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 icket, (Tcl_Size
12120 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 47 65 ) len2);.../* Ge
12130 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a t master key */.
12140 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 .len2 = SSL_SESS
12150 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b ION_get_master_k
12160 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 ey(session, buff
12170 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 er, SSL_MAX_MAST
12180 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a ER_KEY_LENGTH);.
12190 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
121a0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
121b0 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 "master_key", bu
121c0 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 29 ffer, (Tcl_Size)
121d0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d len2);.../* Com
121e0 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 pression id */..
121f0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 20 unsigned int id
12200 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
12210 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 t_compress_id(se
12220 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 ssion);..LAPPEND
12230 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12240 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f Ptr, "compressio
12250 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f n_id", id == 1 ?
12260 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 "zlib" : "none"
12270 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 , -1);. }..
12280 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e /* Compression
12290 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 info */. if
122a0 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl != NULL) {.
122b0 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f #ifdef HAVE_SSL_
122c0 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e COMPRESSION..con
122d0 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a st COMP_METHOD *
122e0 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f comp, *expn;..co
122f0 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 mp = SSL_get_cur
12300 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e rent_compression
12310 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 (ssl);..expn = S
12320 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 SL_get_current_e
12330 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a xpansion(ssl);..
12340 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
12350 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f erp, objPtr, "co
12360 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 mpression", comp
12370 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f ? SSL_COMP_get_
12380 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f name(comp) : "no
12390 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 ne", -1);..LAPPE
123a0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
123b0 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f bjPtr, "expansio
123c0 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 n", expn ? SSL_C
123d0 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 OMP_get_name(exp
123e0 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 n) : "none", -1)
123f0 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 ;.#else..LAPPEND
12400 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12410 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f Ptr, "compressio
12420 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b n", "none", -1);
12430 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
12440 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 terp, objPtr, "e
12450 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 xpansion", "none
12460 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 ", -1);.#endif.
12470 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 }.. /* Ser
12480 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ver info */.
12490 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 {..long mode = S
124a0 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 SL_CTX_get_sessi
124b0 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 on_cache_mode(st
124c0 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 atePtr->ctx);..c
124d0 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 har *msg;...if (
124e0 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
124f0 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 CACHE_OFF) {..
12500 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 msg = "off";..
12510 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 } else if (mode
12520 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
12530 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 _CLIENT) {..
12540 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a msg = "client";.
12550 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 .} else if (mode
12560 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
12570 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 E_SERVER) {..
12580 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b msg = "server";
12590 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 ..} else if (mod
125a0 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 e & SSL_SESS_CAC
125b0 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 HE_BOTH) {..
125c0 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d msg = "both";..}
125d0 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 else {.. msg
125e0 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d = "unknown";..}
125f0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
12600 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
12610 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 ession_cache_mod
12620 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 e", msg, -1);.
12630 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c }.. /* CA L
12640 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 ist */. /* IF
12650 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73 not a server, s
12660 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f ame as SSL_get0_
12670 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 peer_CA_list. If
12680 20 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 20 server same as
12690 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 SSL_CTX_get_clie
126a0 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 nt_CA_list */.
126b0 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f listPtr = Tcl_
126c0 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
126d0 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f LL);. STACK_O
126e0 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 F(X509_NAME) *ca
126f0 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28 _list;. if ((
12700 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 ca_list = SSL_ge
12710 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 t_client_CA_list
12720 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 (ssl)) != NULL)
12730 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 42 {..char buffer[B
12740 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e UFSIZ];..for (in
12750 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f t i = 0; i < sk_
12760 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 X509_NAME_num(ca
12770 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 _list); i++) {..
12780 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e X509_NAME *n
12790 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 ame = sk_X509_NA
127a0 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 ME_value(ca_list
127b0 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e , i);.. if (n
127c0 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 ame) {...X509_NA
127d0 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c ME_oneline(name,
127e0 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 buffer, BUFSIZ)
127f0 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
12800 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
12810 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 erp, listPtr, Tc
12820 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 l_NewStringObj(b
12830 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 uffer, -1));..
12840 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 }..}. }.
12850 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 LAPPEND_OBJ(int
12860 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 erp, objPtr, "ca
12870 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29 3b List", listPtr);
12880 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 . LAPPEND_INT
12890 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
128a0 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 "caListCount",
128b0 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d sk_X509_NAME_num
128c0 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 20 (ca_list));..
128d0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
128e0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
128f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
12900 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 L_OK;..clientDat
12910 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a a = clientData;.
12920 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
12970 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 * VersionObjCmd
12980 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 -- return versi
12990 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f on string from O
129a0 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 penSSL.. *. * Re
129b0 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
129c0 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
129d0 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
129e0 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
129f0 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
12a40 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a c int.VersionObj
12a50 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
12a60 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
12a70 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
12a80 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
12a90 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
12aa0 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f {. Tcl_Obj *o
12ab0 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 bjPtr;.. dpri
12ac0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
12ad0 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
12ae0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 _NewStringObj(OP
12af0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 ENSSL_VERSION_TE
12b00 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c XT, -1);. Tcl
12b10 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
12b20 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a terp, objPtr);..
12b30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
12b40 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d K;..clientData =
12b50 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 09 6f 62 clientData;..ob
12b60 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a 76 jc = objc;..objv
12b70 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a = objv;.}.../*.
12b80 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 -----. *. * Misc
12bd0 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 ObjCmd -- misc c
12be0 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 ommands. *. * Re
12bf0 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
12c00 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
12c10 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
12c20 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
12c30 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
12c80 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 c int.MiscObjCmd
12c90 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
12ca0 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
12cb0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
12cc0 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
12cd0 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
12ce0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 static const
12cf0 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b char *commands [
12d00 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 ] = { "req", "st
12d10 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 rreq", NULL };.
12d20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 enum command
12d30 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 { C_REQ, C_STRRE
12d40 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 Q, C_DUMMY };.
12d50 20 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a Tcl_Size cmd;.
12d60 20 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 int isStr;.
12d70 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 char buffer[1
12d80 36 33 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6384];.. dpri
12d90 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
12da0 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
12db0 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
12dc0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
12dd0 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 objv, "subcomma
12de0 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 nd ?args?");..re
12df0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
12e00 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 }. if (Tc
12e10 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 l_GetIndexFromOb
12e20 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 j(interp, objv[1
12e30 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f ], commands, "co
12e40 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29 mmand", 0, &cmd)
12e50 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
12e60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
12e70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
12e80 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
12e90 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 isStr = (cmd
12ea0 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 == C_STRREQ);.
12eb0 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d switch ((enum
12ec0 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b command) cmd) {
12ed0 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 ..case C_REQ:..c
12ee0 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a ase C_STRREQ: {.
12ef0 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 . EVP_PKEY *p
12f00 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 key=NULL;.. X
12f10 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 509 *cert=NULL;.
12f20 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a . X509_NAME *
12f30 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 name=NULL;..
12f40 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b Tcl_Obj **listv;
12f50 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c .. Tcl_Size l
12f60 69 73 74 63 3b 0a 09 20 20 20 20 69 6e 74 20 69 istc;.. int i
12f70 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 ;... BIO *out
12f80 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 =NULL;... cha
12f90 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d r *k_C="",*k_ST=
12fa0 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d "",*k_L="",*k_O=
12fb0 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 "",*k_OU="",*k_C
12fc0 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 N="",*k_Email=""
12fd0 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 ;.. char *key
12fe0 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 out,*pemout,*str
12ff0 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 ;.. int keysi
13000 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 ze,serial=0,days
13010 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 =365;..#if OPENS
13020 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
13030 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
13040 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 . BIGNUM *bne
13050 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 = NULL;.. RS
13060 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 A *rsa = NULL;.#
13070 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b else.. EVP_PK
13080 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 EY_CTX *ctx = NU
13090 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 LL;.#endif...
130a0 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c if ((objc<5) ||
130b0 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 (objc>6)) {...T
130c0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
130d0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c interp, 2, objv,
130e0 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c "keysize keyfil
130f0 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f e certfile ?info
13100 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 ?");...return TC
13110 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
13120 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 .. if (Tcl_Ge
13130 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 tIntFromObj(inte
13140 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 rp, objv[2], &ke
13150 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b ysize) != TCL_OK
13160 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c ) {...return TCL
13170 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 _ERROR;.. }..
13180 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 keyout=Tcl_G
13190 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d etString(objv[3]
131a0 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 );.. pemout=T
131b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
131c0 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 v[4]);.. if (
131d0 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 isStr) {...Tcl_S
131e0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 etVar(interp,key
131f0 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c out,"",0);...Tcl
13200 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 _SetVar(interp,p
13210 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 emout,"",0);..
13220 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 }... if (ob
13230 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 jc>=6) {...if (T
13240 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 cl_ListObjGetEle
13250 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 ments(interp, ob
13260 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20 26 jv[5], &listc, &
13270 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b listv) != TCL_OK
13280 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e ) {... return
13290 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a TCL_ERROR;...}.
132a0 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 ...if ((listc%2)
132b0 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 != 0) {... T
132c0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
132d0 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e erp,"Information
132e0 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 list must have
132f0 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 even number of a
13300 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b rguments",NULL);
13310 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
13320 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 L_ERROR;...}...f
13330 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 or (i=0; i<listc
13340 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 ; i+=2) {...
13350 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e str=Tcl_GetStrin
13360 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 g(listv[i]);...
13370 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 if (strcmp(st
13380 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a r,"days")==0) {.
13390 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e ...if (Tcl_GetIn
133a0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c tFromObj(interp,
133b0 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 listv[i+1],&days
133c0 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 )!=TCL_OK)....
133d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
133e0 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 OR;... } else
133f0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
13400 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a "serial")==0) {.
13410 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e ...if (Tcl_GetIn
13420 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c tFromObj(interp,
13430 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 listv[i+1],&seri
13440 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 al)!=TCL_OK)....
13450 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
13460 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c RROR;... } el
13470 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
13480 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 r,"C")==0) {....
13490 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e k_C=Tcl_GetStrin
134a0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
134b0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
134c0 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 strcmp(str,"ST")
134d0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 ==0) {....k_ST=T
134e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
134f0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
13500 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
13510 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b p(str,"L")==0) {
13520 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 ....k_L=Tcl_GetS
13530 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
13540 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
13550 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
13560 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f O")==0) {....k_O
13570 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
13580 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
13590 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
135a0 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 cmp(str,"OU")==0
135b0 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f ) {....k_OU=Tcl_
135c0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
135d0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
135e0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
135f0 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 tr,"CN")==0) {..
13600 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 ..k_CN=Tcl_GetSt
13610 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
13620 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
13630 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 f (strcmp(str,"E
13640 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 mail")==0) {....
13650 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 k_Email=Tcl_GetS
13660 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
13670 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
13680 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 {....Tcl_SetResu
13690 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f lt(interp,"Unkno
136a0 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 wn parameter",NU
136b0 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 LL);....return T
136c0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 CL_ERROR;...
136d0 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 }...}.. }..#i
136e0 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
136f0 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
13700 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 00000L.. bne
13710 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 = BN_new();..
13720 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 rsa = RSA_new()
13730 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 ;.. pkey = EV
13740 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 P_PKEY_new();..
13750 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 if (bne == NU
13760 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c LL || rsa == NUL
13770 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c L || pkey == NUL
13780 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 L || !BN_set_wor
13790 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c d(bne,RSA_F4) ||
137a0 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 ...!RSA_generate
137b0 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 _key_ex(rsa, key
137c0 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 size, bne, NULL)
137d0 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 || !EVP_PKEY_as
137e0 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 sign_RSA(pkey, r
137f0 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 sa)) {...EVP_PKE
13800 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 Y_free(pkey);...
13810 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 /* RSA_free(rsa)
13820 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 ; freed by EVP_P
13830 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e KEY_free */...BN
13840 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 _free(bne);.#els
13850 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 e.. pkey = EV
13860 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 P_RSA_gen((unsig
13870 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 ned int) keysize
13880 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 );.. ctx = EV
13890 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 P_PKEY_CTX_new(p
138a0 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 key,NULL);..
138b0 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c if (pkey == NULL
138c0 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 || ctx == NULL
138d0 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 || !EVP_PKEY_key
138e0 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c gen_init(ctx) ||
138f0 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 ...!EVP_PKEY_CTX
13900 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f _set_rsa_keygen_
13910 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a bits(ctx, keysiz
13920 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f e) || !EVP_PKEY_
13930 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 keygen(ctx, &pke
13940 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 y)) {...EVP_PKEY
13950 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 _free(pkey);...E
13960 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 VP_PKEY_CTX_free
13970 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 (ctx);.#endif...
13980 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
13990 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 terp,"Error gene
139a0 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b rating private k
139b0 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 ey",NULL);...ret
139c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
139d0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 } else {...i
139e0 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 f (isStr) {...
139f0 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
13a00 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 O_s_mem());...
13a10 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
13a20 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 PrivateKey(out,p
13a30 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c key,NULL,NULL,0,
13a40 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 NULL,NULL);...
13a50 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 i=BIO_read(out
13a60 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 ,buffer,sizeof(b
13a70 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 uffer)-1);...
13a80 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 i=(i<0) ? 0 : i
13a90 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 ;... buffer[i
13aa0 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 ]='\0';... Tc
13ab0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
13ac0 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 keyout,buffer,0)
13ad0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 ;... BIO_flus
13ae0 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 h(out);... BI
13af0 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d O_free(out);...}
13b00 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 else {... ou
13b10 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
13b20 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 file());... B
13b30 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d IO_write_filenam
13b40 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 e(out,keyout);..
13b50 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
13b60 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 io_PrivateKey(ou
13b70 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c t,pkey,NULL,NULL
13b80 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 ,0,NULL,NULL);..
13b90 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 . /* PEM_writ
13ba0 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 e_bio_RSAPrivate
13bb0 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 Key(out, rsa, NU
13bc0 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c LL, NULL, 0, NUL
13bd0 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 L, NULL); */...
13be0 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 BIO_free_all(
13bf0 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 out);.. .}....if
13c00 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 ((cert=X509_new
13c10 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 ())==NULL) {...
13c20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
13c30 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 (interp,"Error g
13c40 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 enerating certif
13c50 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e icate request",N
13c60 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f ULL);... EVP_
13c70 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
13c80 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
13c90 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
13ca0 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 30000000L...
13cb0 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
13cc0 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 ndif... retur
13cd0 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 n(TCL_ERROR);...
13ce0 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 }....X509_set_ve
13cf0 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 rsion(cert,2);..
13d00 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 .ASN1_INTEGER_se
13d10 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 t(X509_get_seria
13d20 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 lNumber(cert),se
13d30 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d rial);...X509_gm
13d40 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 time_adj(X509_ge
13d50 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 tm_notBefore(cer
13d60 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d t),0);...X509_gm
13d70 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 time_adj(X509_ge
13d80 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 tm_notAfter(cert
13d90 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 ),(long)60*60*24
13da0 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 *days);...X509_s
13db0 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 et_pubkey(cert,p
13dc0 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 key);....name=X5
13dd0 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 09_get_subject_n
13de0 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 ame(cert);....X5
13df0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
13e00 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 y_by_txt(name,"C
13e10 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
13e20 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
13e30 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 char *) k_C, -1
13e40 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
13e50 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
13e60 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 by_txt(name,"ST"
13e70 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
13e80 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
13e90 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 char *) k_ST, -1
13ea0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
13eb0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
13ec0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c by_txt(name,"L",
13ed0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
13ee0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
13ef0 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 har *) k_L, -1,
13f00 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
13f10 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
13f20 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d _txt(name,"O", M
13f30 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
13f40 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
13f50 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 r *) k_O, -1, -1
13f60 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
13f70 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
13f80 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 xt(name,"OU", MB
13f90 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
13fa0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
13fb0 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 *) k_OU, -1, -1
13fc0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
13fd0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
13fe0 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 xt(name,"CN", MB
13ff0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
14000 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
14010 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 *) k_CN, -1, -1
14020 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
14030 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
14040 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c xt(name,"Email",
14050 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
14060 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
14070 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 har *) k_Email,
14080 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 -1, -1, 0);....X
14090 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 509_set_subject_
140a0 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b name(cert,name);
140b0 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 ....if (!X509_si
140c0 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 gn(cert,pkey,EVP
140d0 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 _sha256())) {...
140e0 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 X509_free(ce
140f0 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 rt);... EVP_P
14100 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
14110 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
14120 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
14130 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 0000000L... B
14140 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e N_free(bne);.#en
14150 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 dif... Tcl_Se
14160 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
14170 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 Error signing ce
14180 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 rtificate",NULL)
14190 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
141a0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 CL_ERROR;...}...
141b0 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 .if (isStr) {...
141c0 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
141d0 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 BIO_s_mem());...
141e0 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 PEM_write_bi
141f0 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 o_X509(out,cert)
14200 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 ;... i=BIO_re
14210 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 ad(out,buffer,si
14220 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b zeof(buffer)-1);
14230 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f ... i=(i<0) ?
14240 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 0 : i;... bu
14250 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 ffer[i]='\0';...
14260 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 Tcl_SetVar(i
14270 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 nterp,pemout,buf
14280 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 fer,0);... BI
14290 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 O_flush(out);...
142a0 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 BIO_free(out
142b0 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
142c0 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
142d0 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 BIO_s_file());..
142e0 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 . BIO_write_f
142f0 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f ilename(out,pemo
14300 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ut);... PEM_w
14310 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 rite_bio_X509(ou
14320 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 t,cert);... B
14330 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 IO_free_all(out)
14340 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 ;...}....X509_fr
14350 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f ee(cert);...EVP_
14360 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
14370 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
14380 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
14390 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 30000000L...BN_f
143a0 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 ree(bne);.#endif
143b0 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 .. }..}..brea
143c0 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a k;. default:.
143d0 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 .break;. }.
143e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
143f0 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
14400 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
14410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14420 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 ****/./* Init
14430 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a */./**
14440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14450 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a -------------. *
144a0 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a . * Tls_Free --.
144b0 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
144c0 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 dure cleans up w
144d0 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 hen a SSL socket
144e0 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 based channel.
144f0 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 *.is closed and
14500 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f its reference co
14510 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 unt falls below
14520 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 1. *. * Results:
14530 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.none. *. * S
14540 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
14550 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 Frees all the st
14560 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ate. *. *-------
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 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
145b0 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 .void.Tls_Free(c
145c0 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b har *blockPtr) {
145d0 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
145e0 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
145f0 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 blockPtr;.. d
14600 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
14610 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e ;.. Tls_Clean
14620 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 (statePtr);.
14630 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 ckfree(blockPtr)
14640 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 --------------.
14690 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d *. * Tls_Clean -
146a0 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
146b0 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 cedure cleans up
146c0 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b when a SSL sock
146d0 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c et based channel
146e0 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e . *.is closed an
146f0 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 d its reference
14700 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f count falls belo
14710 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c w 1. This shoul
14720 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 d. *.be called s
14730 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 ynchronously by
14740 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e the CloseProc, n
14750 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 ot in the. *.Eve
14760 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c ntuallyFree call
14770 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 back.. *. * Resu
14780 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a lts:. *.none. *.
14790 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
147a0 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 . *.Frees all th
147b0 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d e state. *. *---
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 2d 2d 2d 2d 2d ----------------
14800 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c . */.void Tls_Cl
14810 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 ean(State *state
14820 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e Ptr) {. dprin
14830 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
14840 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 /*. * we'
14850 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 re assuming here
14860 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 that we're sing
14870 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 le-threaded.
14880 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
14890 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 ePtr->timer != (
148a0 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 Tcl_TimerToken)
148b0 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c NULL) {..Tcl_Del
148c0 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 eteTimerHandler(
148d0 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 statePtr->timer)
148e0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d ;..statePtr->tim
148f0 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d er = NULL;. }
14900 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
14910 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 tr->protos) {..c
14920 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e kfree(statePtr->
14930 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 protos);..stateP
14940 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c tr->protos = NUL
14950 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
14960 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 (statePtr->bio)
14970 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 {../* This will
14980 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 call SSL_shutdow
14990 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 2a n. Bug 1414045 *
149a0 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f /..dprintf("BIO_
149b0 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 free_all(%p)", s
149c0 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 tatePtr->bio);..
149d0 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 BIO_free_all(sta
149e0 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 tePtr->bio);..st
149f0 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 atePtr->bio = NU
14a00 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
14a10 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 (statePtr->ssl)
14a20 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c {..dprintf("SSL
14a30 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 _free(%p)", stat
14a40 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c ePtr->ssl);..SSL
14a50 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e _free(statePtr->
14a60 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ssl);..statePtr-
14a70 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 >ssl = NULL;.
14a80 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
14a90 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c Ptr->ctx) {..SSL
14aa0 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 _CTX_free(stateP
14ab0 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 tr->ctx);..state
14ac0 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b Ptr->ctx = NULL;
14ad0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
14ae0 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
14af0 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 k) {..Tcl_DecrRe
14b00 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
14b10 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 >callback);..sta
14b20 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
14b30 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
14b40 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
14b50 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c password) {..Tcl
14b60 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _DecrRefCount(st
14b70 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
14b80 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 );..statePtr->pa
14b90 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 ssword = NULL;.
14ba0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
14bb0 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 tePtr->vcmd) {..
14bc0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
14bd0 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
14be0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d ;..statePtr->vcm
14bf0 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a d = NULL;. }.
14c00 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 . dprintf("Re
14c10 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 23 turning");.}...#
14c20 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 if TCL_MAJOR_VER
14c30 53 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 SION > 8.#define
14c40 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e MIN_VERSION "9.
14c50 30 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 0".#else.#define
14c60 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e MIN_VERSION "8.
14c70 35 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 5".#endif../*. *
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 2d 2d ----------------
14cc0 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e ---. *. * Tls_In
14cd0 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 it --. *. *.This
14ce0 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e is a package in
14cf0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f itialization pro
14d00 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 cedure, which is
14d10 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 called. *.by Tc
14d20 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b l when this pack
14d30 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 age is to be add
14d40 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 ed to an interpr
14d50 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 eter.. *. * Resu
14d60 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 lts: Ssl config
14d70 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a ured and loaded.
14d80 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
14d90 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 ts:. *. create t
14da0 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 he ssl command,
14db0 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 initialize ssl c
14dc0 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d ontext. *. *----
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 2d 2d 2d 2d 2d 0a ---------------.
14e10 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e */.DLLEXPORT in
14e20 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 t Tls_Init(Tcl_I
14e30 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b nterp *interp) {
14e40 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
14e50 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 tlsTclInitScript
14e60 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 [] = {.#include
14e70 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 "tls.tcl.h"..0x0
14e80 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 0. };.. dp
14e90 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
14ea0 0a 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c ..#ifdef USE_TCL
14eb0 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20 28 54 _STUBS. if (T
14ec0 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 cl_InitStubs(int
14ed0 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e erp, MIN_VERSION
14ee0 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a , 0) == NULL) {.
14ef0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
14f00 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a R;. }.#endif.
14f10 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 if (Tcl_PkgR
14f20 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 equire(interp, "
14f30 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49 4f Tcl", MIN_VERSIO
14f40 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b N, 0) == NULL) {
14f50 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
14f60 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
14f70 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 f (TlsLibInit(0)
14f80 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 != TCL_OK) {..T
14f90 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
14fa0 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e interp, "could n
14fb0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 ot initialize SS
14fc0 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 63 68 61 L library", (cha
14fd0 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
14fe0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
14ff0 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 }.. Tcl_Cr
15000 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
15010 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 nterp, "tls::cip
15020 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 hers", CiphersOb
15030 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
15040 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
15050 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
15060 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
15070 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
15080 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 rp, "tls::connec
15090 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f tion", Connectio
150a0 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c nInfoObjCmd, (Cl
150b0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
150c0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
150d0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
150e0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
150f0 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
15100 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e :handshake", Han
15110 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 dshakeObjCmd, (C
15120 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
15130 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
15140 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
15150 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
15160 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
15170 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 ::import", Impor
15180 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 tObjCmd, (Client
15190 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
151a0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
151b0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
151c0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
151d0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 nterp, "tls::uni
151e0 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 mport", Unimport
151f0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
15200 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
15210 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
15220 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
15230 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
15240 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 terp, "tls::stat
15250 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d us", StatusObjCm
15260 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
15270 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
15280 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
15290 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
152a0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
152b0 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c "tls::version",
152c0 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 VersionObjCmd,
152d0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
152e0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
152f0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
15300 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
15310 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
15320 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f ls::misc", MiscO
15330 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
15340 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
15350 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
15360 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
15370 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
15380 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f erp, "tls::proto
15390 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 cols", Protocols
153a0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
153b0 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
153c0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
153d0 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e LL);.. if (in
153e0 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 terp) {..Tcl_Eva
153f0 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c l(interp, tlsTcl
15400 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20 InitScript);.
15410 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }.. return T
15420 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e cl_PkgProvide(in
15430 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 terp, PACKAGE_NA
15440 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 ME, PACKAGE_VERS
15450 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d ION);.}../*. *--
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 2d ----------------
15490 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f ----*. *. *.Tls_
154a0 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 SafeInit --. *.
154b0 2a 09 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 2d 2d 2d ----------------
154e0 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 --*. *.Standard
154f0 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 procedure requir
15500 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a ed by 'load'.. *
15510 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 .Initializes thi
15520 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 s extension for
15530 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 a safe interpret
15540 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d er.. *.---------
15550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15570 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 -------*. *. *.S
15580 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
15590 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 .As of 'Tls_Init
155a0 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a '. *. *.Result:.
155b0 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 *..A standard T
155c0 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 cl error code..
155d0 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a ----------*. */.
15610 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c DLLEXPORT int Tl
15620 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 s_SafeInit(Tcl_I
15630 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b nterp *interp) {
15640 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
15650 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 lled");. retu
15660 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 rn(Tls_Init(inte
15670 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d rp));.}../*. *--
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 2d ----------------
156b0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c ----*. *. *.TlsL
156c0 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 ibInit --. *. *.
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 2d 2d 2d 2d 2d ----------------
15700 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 *. *.Initializes
15710 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 SSL library onc
15720 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f e per applicatio
15730 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d n. *.-----------
15740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15760 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 -----*. *. *.Sid
15770 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 e effects:. *..i
15780 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c nitializes SSL l
15790 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 ibrary. *. *.Res
157a0 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a ult:. *..none. *
157b0 0a 20 2a 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 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 ---------*. */.s
157f0 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 tatic int TlsLib
15800 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 Init(int uniniti
15810 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 alize) {. sta
15820 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 tic int initiali
15830 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 zed = 0;. int
15840 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b status = TCL_OK
15850 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ;.#if defined(OP
15860 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
15870 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
15880 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f READS). size_
15890 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e t num_locks;.#en
158a0 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 dif.. if (uni
158b0 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 nitialize) {..if
158c0 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 (!initialized)
158d0 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 {.. dprintf("
158e0 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 Asked to uniniti
158f0 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 alize, but we ar
15900 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 e not initialize
15910 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 d");... retur
15920 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 n(TCL_OK);..}...
15930 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 dprintf("Asked t
15940 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 o uninitialize")
15950 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
15960 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
15970 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
15980 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 HREADS)..Tcl_Mut
15990 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 exLock(&init_mx)
159a0 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b ;...if (locks) {
159b0 0a 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 .. free(locks
159c0 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 );.. locks =
159d0 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 NULL;.. locks
159e0 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 Count = 0;..}.#e
159f0 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 ndif..initialize
15a00 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 d = 0;..#if defi
15a10 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
15a20 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
15a30 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 TCL_THREADS)..Tc
15a40 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 l_MutexUnlock(&i
15a50 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a nit_mx);.#endif.
15a60 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 ..return(TCL_OK)
15a70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
15a80 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a (initialized) {.
15a90 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 .dprintf("Called
15aa0 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 , but using cach
15ab0 65 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 ed value");..ret
15ac0 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 urn(status);.
15ad0 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 }.. dprintf(
15ae0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 "Called");..#if
15af0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
15b00 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
15b10 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
15b20 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f . Tcl_MutexLo
15b30 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 ck(&init_mx);.#e
15b40 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c ndif. initial
15b50 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 ized = 1;..#if d
15b60 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
15b70 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
15b80 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
15b90 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 num_locks =
15ba0 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 1;. locksCoun
15bb0 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f t = (int) num_lo
15bc0 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d cks;. locks =
15bd0 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a malloc(sizeof(*
15be0 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 locks) * num_loc
15bf0 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 ks);. memset(
15c00 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 locks, 0, sizeof
15c10 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c (*locks) * num_l
15c20 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 ocks);.#endif..
15c30 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 /* Initialize
15c40 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 BOTH libcrypto
15c50 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 and libssl. */.
15c60 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f OPENSSL_init_
15c70 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 ssl(OPENSSL_INIT
15c80 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 _LOAD_SSL_STRING
15c90 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 S | OPENSSL_INIT
15ca0 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 _LOAD_CRYPTO_STR
15cb0 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f INGS..| OPENSSL_
15cc0 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 INIT_ADD_ALL_CIP
15cd0 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 HERS | OPENSSL_I
15ce0 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 NIT_ADD_ALL_DIGE
15cf0 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 STS, NULL);..
15d00 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c BIO_new_tcl(NUL
15d10 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 L, 0);..#if 0.
15d20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a /*. * XXX:
15d30 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 TODO: Remove thi
15d40 73 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 s code and repla
15d50 63 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65 ce it with a che
15d60 63 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e ck. * for en
15d70 6f 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 ough entropy and
15d80 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 do not try to c
15d90 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 reate our own.
15da0 20 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e * terrible en
15db0 74 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 tropy. */.
15dc0 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 /*. * Seed
15dd0 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 the random numb
15de0 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 er generator in
15df0 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c the SSL library,
15e00 0a 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 . * using th
15e10 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 e do/while const
15e20 72 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 ruct because of
15e30 74 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 the bug note in
15e40 74 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 the. * OpenS
15e50 53 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f SL FAQ at http:/
15e60 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 /www.openssl.org
15e70 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d /support/faq.htm
15e80 6c 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 l#USER1. *.
15e90 20 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f * The crux o
15ea0 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 f the problem is
15eb0 20 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 that Solaris 7
15ec0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a does not have a.
15ed0 20 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 * /dev/rand
15ee0 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 om or /dev/urand
15ef0 6f 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 om device so it
15f00 63 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e cannot gather en
15f10 6f 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 ough. * entr
15f20 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e opy from the RAN
15f30 44 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c D_seed() when TL
15f40 53 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e S initializes an
15f50 64 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a d refuses. *
15f60 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 to go further.
15f70 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 Earlier versions
15f80 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 of OpenSSL carr
15f90 69 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 ied on regardles
15fa0 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 s.. */. s
15fb0 72 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 rand((unsigned i
15fc0 6e 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 nt) time((time_t
15fd0 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 *) NULL));.
15fe0 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 do {..for (i = 0
15ff0 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b ; i < 16; i++) {
16000 0a 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 .. rnd_seed[i
16010 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 ] = 1 + (char) (
16020 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 255.0 * rand()/(
16030 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a RAND_MAX+1.0));.
16040 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e .}..RAND_seed(rn
16050 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 d_seed, sizeof(r
16060 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d nd_seed));. }
16070 20 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 while (RAND_sta
16080 74 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e tus() != 1);.#en
16090 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 dif..#if defined
160a0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
160b0 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
160c0 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d _THREADS)..Tcl_M
160d0 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 utexUnlock(&init
160e0 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 _mx);.#endif...r
160f0 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d eturn(status);.}
16100 0a .