0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61 (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69 some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68 ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32 pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72 ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79 poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53 right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29 *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61 2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68 st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64 * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61 dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64 .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74 ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 full fileevent
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 Also work done
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68 ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 e impetus to do
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 pts.h".#include
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 rsa.h>.#include
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61 <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72 10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76 "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69 1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72 dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29 #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74 r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69 _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 ar *key,...char
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 tes, int level,
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 mask))..#define
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74 /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65 L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23 "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72 endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64 ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64 _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65 slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69 ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42 g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74 ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20 o/cryptlib.c of
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70 OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74 enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63 t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53 .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65 SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45 ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a ADS */../*******
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f *************/./
09a0: 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 * Callbacks
09b0: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a */./*********
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0c 0a ***********/....
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 --------. *. * I
0a20: 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 nfoCallback --.
0a30: 2a 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 *. *.monitors SS
0a40: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f L connection pro
0a50: 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c cess. *. * Resul
0a60: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
0a70: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
0a80: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
0a90: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
0aa0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ae0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
0af0: 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 void.InfoCallbac
0b00: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
0b10: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 , int where, int
0b20: 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 ret) {. Stat
0b30: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
0b40: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 tate*)SSL_get_ap
0b50: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 p_data((SSL *)ss
0b60: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 l);. Tcl_Inte
0b70: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
0b80: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
0b90: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
0ba0: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 tr;. char *ma
0bb0: 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 jor; char *minor
0bc0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
0bd0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
0be0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
0bf0: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
0c00: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e j*)NULL)..return
0c10: 3b 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 ;.. cmdPtr =
0c20: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
0c30: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
0c40: 61 63 6b 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 ack);..#if 0.
0c50: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c if (where & SSL
0c60: 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65 _CB_ALERT) {..se
0c70: 76 20 3d 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79 v = SSL_alert_ty
0c80: 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 pe_string_long(r
0c90: 65 74 29 3b 0a 09 69 66 20 28 73 74 72 63 6d 70 et);..if (strcmp
0ca0: 28 73 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d (sev, "fatal")==
0cb0: 30 29 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65 0) {./* Map to e
0cc0: 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73 rror */.. Tls
0cd0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
0ce0: 20 53 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20 SSL_ERROR(ssl,
0cf0: 30 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 0));.. return
0d00: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ;..}. }.#endi
0d10: 66 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 f. if (where
0d20: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 & SSL_CB_HANDSHA
0d30: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a KE_START) {..maj
0d40: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 or = "handshake"
0d50: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 ;..minor = "star
0d60: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 t";. } else i
0d70: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0d80: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 B_HANDSHAKE_DONE
0d90: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 ) {..major = "ha
0da0: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 ndshake";..minor
0db0: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d = "done";. }
0dc0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 else {..if (whe
0dd0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 re & SSL_CB_ALER
0de0: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 T)..major = "ale
0df0: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 rt";..else if (w
0e00: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f here & SSL_ST_CO
0e10: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 NNECT).major = "
0e20: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 connect";..else
0e30: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
0e40: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f ST_ACCEPT)..majo
0e50: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 r = "accept";..e
0e60: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 lse.....major =
0e70: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 "unknown";...if
0e80: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
0e90: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 READ)..minor = "
0ea0: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 read";..else if
0eb0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
0ec0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 WRITE)..minor =
0ed0: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 "write";..else i
0ee0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0ef0: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d B_LOOP)..minor =
0f00: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 "loop";..else i
0f10: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0f20: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d B_EXIT)..minor =
0f30: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 "exit";..else..
0f40: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e ...minor = "unkn
0f50: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 own";. }..
0f60: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
0f70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
0f80: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
0f90: 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f wStringObj("info
0fa0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
0fb0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
0fc0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
0fd0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
0fe0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
0ff0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
1000: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
1010: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
1020: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1030: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1040: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
1050: 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b Obj(major, -1));
1060: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1070: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1080: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
1090: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
10a0: 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 inor, -1));..
10b0: 20 69 66 20 28 77 68 65 72 65 20 26 20 28 53 53 if (where & (SS
10c0: 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 53 4c 5f 43 42 L_CB_LOOP|SSL_CB
10d0: 5f 45 58 49 54 29 29 20 7b 0a 09 54 63 6c 5f 4c _EXIT)) {..Tcl_L
10e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1100: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
1110: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 StringObj(SSL_st
1120: 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 ate_string_long(
1130: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ssl), -1));.
1140: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 } else if (where
1150: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 & SSL_CB_ALERT)
1160: 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a {..const char *
1170: 63 70 20 3d 20 28 63 68 61 72 20 2a 29 20 53 53 cp = (char *) SS
1180: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 L_alert_desc_str
1190: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 0a ing_long(ret);..
11a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11c0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
11d0: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d wStringObj(cp, -
11e0: 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 1));. } else
11f0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
1200: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
1210: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
1220: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1230: 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 j(SSL_state_stri
1240: 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 ng_long(ssl), -1
1250: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 ));. }. Tc
1260: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 l_Preserve((Clie
1270: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
1280: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 . Tcl_Preserv
1290: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
12a0: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 tatePtr);.. T
12b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
12c0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 28 76 6f cmdPtr);. (vo
12d0: 69 64 29 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 id) Tcl_EvalObjE
12e0: 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 x(interp, cmdPtr
12f0: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 , TCL_EVAL_GLOBA
1300: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 L);. Tcl_Decr
1310: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
1320: 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 ;.. Tcl_Relea
1330: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
1340: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 statePtr);. T
1350: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
1360: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
1370: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
1380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
13c0: 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 . * VerifyCallba
13d0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 ck --. *. *.Moni
13e0: 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 tors SSL certifi
13f0: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 cate validation
1400: 70 72 6f 63 65 73 73 2e 0a 20 2a 09 54 68 69 73 process.. *.This
1410: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 is called whene
1420: 76 65 72 20 61 20 63 65 72 74 69 66 69 63 61 74 ver a certificat
1430: 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 0a 20 e is inspected.
1440: 2a 09 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 *.or decided inv
1450: 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 alid.. *. * Resu
1460: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 lts:. *.A callba
1470: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 ck bound to the
1480: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72 socket may retur
1490: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 n one of:. *.
14a0: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 0...- the certi
14b0: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 ficate is deemed
14c0: 20 69 6e 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 invalid. *.
14d0: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 1...- the certif
14e0: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 icate is deemed
14f0: 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 65 6d 70 valid. *. emp
1500: 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 ty string.- no c
1510: 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 hange to certifi
1520: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a cate validation.
1530: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
1540: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 ts:. *.The err f
1550: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 ield of the curr
1560: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 ently operative
1570: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 State is set. *.
1580: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 to a string de
1590: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c scribing the SSL
15a0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 negotiation fai
15b0: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d lure reason. *--
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1600: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
1610: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 .VerifyCallback(
1620: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f int ok, X509_STO
1630: 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 RE_CTX *ctx) {.
1640: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
1650: 74 72 2c 20 2a 72 65 73 75 6c 74 3b 0a 20 20 20 tr, *result;.
1660: 20 63 68 61 72 20 2a 65 72 72 53 74 72 2c 20 2a char *errStr, *
1670: 73 74 72 69 6e 67 3b 0a 20 20 20 20 69 6e 74 20 string;. int
1680: 6c 65 6e 67 74 68 3b 0a 20 20 20 20 53 53 4c 20 length;. SSL
1690: 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 *ssl..= (SSL*)
16a0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 X509_STORE_CTX_g
16b0: 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20 et_ex_data(ctx,
16c0: 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f SSL_get_ex_data_
16d0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 X509_STORE_CTX_i
16e0: 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20 dx());. X509
16f0: 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53 *cert..= X509_S
1700: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 TORE_CTX_get_cur
1710: 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a rent_cert(ctx);.
1720: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
1730: 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53 Ptr.= (State*)SS
1740: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 L_get_app_data(s
1750: 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 sl);. Tcl_Int
1760: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
1770: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
1780: 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d int depth..=
1790: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f X509_STORE_CTX_
17a0: 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 get_error_depth(
17b0: 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 ctx);. int er
17c0: 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f r..= X509_STORE_
17d0: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 CTX_get_error(ct
17e0: 78 29 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 x);. int code
17f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
1800: 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29 Verify: %d", ok)
1810: 3b 0a 0a 20 20 20 20 69 66 20 28 21 6f 6b 29 20 ;.. if (!ok)
1820: 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63 68 61 {..errStr = (cha
1830: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 r*)X509_verify_c
1840: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 ert_error_string
1850: 28 65 72 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 (err);. } els
1860: 65 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63 e {..errStr = (c
1870: 68 61 72 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a har *)0;. }..
1880: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
1890: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
18a0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
18b0: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 .if (statePtr->v
18c0: 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 flags & SSL_VERI
18d0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
18e0: 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 ER_CERT) {..
18f0: 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c return ok;..} el
1900: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e se {.. return
1910: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 1;..}. }.
1920: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
1930: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
1940: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
1950: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1960: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1970: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
1980: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
1990: 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 verify", -1));.
19a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
19b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
19c0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
19d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
19e0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
19f0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
1a00: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
1a10: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1a20: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1a30: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
1a40: 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a IntObj(depth));.
1a50: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
1a60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
1a70: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 erp, cmdPtr, Tls
1a80: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 _NewX509Obj(inte
1a90: 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 rp, cert));.
1aa0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1ab0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1ac0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
1ad0: 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 IntObj(ok));.
1ae0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
1af0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
1b00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
1b10: 77 53 74 72 69 6e 67 4f 62 6a 28 65 72 72 53 74 wStringObj(errSt
1b20: 72 20 3f 20 65 72 72 53 74 72 20 3a 20 22 22 2c r ? errStr : "",
1b30: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f -1));.. Tcl_
1b40: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
1b50: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
1b60: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
1b70: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
1b80: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 73 74 61 tePtr);.. sta
1b90: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 tePtr->flags |=
1ba0: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b TLS_TCL_CALLBACK
1bb0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 ;.. Tcl_IncrR
1bc0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
1bd0: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f . code = Tcl_
1be0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 EvalObjEx(interp
1bf0: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 , cmdPtr, TCL_EV
1c00: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 AL_GLOBAL);.
1c10: 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f if (code != TCL_
1c20: 4f 4b 29 20 7b 0a 09 2f 2a 20 49 74 20 67 6f 74 OK) {../* It got
1c30: 20 61 6e 20 65 72 72 6f 72 20 2d 20 72 65 6a 65 an error - reje
1c40: 63 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61 ct the certifica
1c50: 74 65 2e 09 09 2a 2f 0a 23 69 66 20 28 54 43 4c te...*/.#if (TCL
1c60: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d _MAJOR_VERSION =
1c70: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e = 8) && (TCL_MIN
1c80: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a OR_VERSION < 6).
1c90: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
1ca0: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 rror(interp);.#e
1cb0: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f lse..Tcl_Backgro
1cc0: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 undException(int
1cd0: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 erp, code);.#end
1ce0: 69 66 0a 09 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 if..ok = 0;.
1cf0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 75 6c 74 } else {..result
1d00: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 = Tcl_GetObjRes
1d10: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 73 74 ult(interp);..st
1d20: 72 69 6e 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 ring = Tcl_GetSt
1d30: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75 ringFromObj(resu
1d40: 6c 74 2c 20 26 6c 65 6e 67 74 68 29 3b 0a 09 2f lt, &length);../
1d50: 2a 20 41 6e 20 65 6d 70 74 79 20 72 65 73 75 6c * An empty resul
1d60: 74 20 6c 65 61 76 65 73 20 76 65 72 69 66 69 63 t leaves verific
1d70: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e ation unchanged.
1d80: 09 2a 2f 0a 09 69 66 20 28 73 74 72 69 6e 67 20 .*/..if (string
1d90: 21 3d 20 4e 55 4c 4c 20 26 26 20 6c 65 6e 67 74 != NULL && lengt
1da0: 68 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 63 6f h > 0) {.. co
1db0: 64 65 20 3d 20 54 63 6c 5f 47 65 74 49 6e 74 46 de = Tcl_GetIntF
1dc0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 romObj(interp, r
1dd0: 65 73 75 6c 74 2c 20 26 6f 6b 29 3b 0a 09 20 20 esult, &ok);..
1de0: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 if (code != TC
1df0: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c L_OK) {.#if (TCL
1e00: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d _MAJOR_VERSION =
1e10: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e = 8) && (TCL_MIN
1e20: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a OR_VERSION < 6).
1e30: 09 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
1e40: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 Error(interp);.#
1e50: 65 6c 73 65 0a 09 09 54 63 6c 5f 42 61 63 6b 67 else...Tcl_Backg
1e60: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 roundException(i
1e70: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 nterp, code);.#e
1e80: 6e 64 69 66 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 ndif...ok = 0;..
1e90: 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 }..}. }.
1ea0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
1eb0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 unt(cmdPtr);..
1ec0: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 statePtr->flag
1ed0: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 s &= ~(TLS_TCL_C
1ee0: 41 4c 4c 42 41 43 4b 29 3b 0a 0a 20 20 20 20 54 ALLBACK);.. T
1ef0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
1f00: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
1f10: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 );. Tcl_Relea
1f20: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
1f30: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 interp);. ret
1f40: 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 urn(ok);./* By d
1f50: 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 efault, leave ve
1f60: 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 rification uncha
1f70: 6e 67 65 64 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a nged..*/.}.../*.
1f80: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fc0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
1fd0: 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 Error --. *. *.C
1fe0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 alls callback wi
1ff0: 74 68 20 24 66 64 20 61 6e 64 20 24 6d 73 67 20 th $fd and $msg
2000: 2d 20 73 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 - so the callbac
2010: 6b 20 63 61 6e 20 64 65 63 69 64 65 0a 20 2a 09 k can decide. *.
2020: 77 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 what to do with
2030: 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 errors.. *. * Si
2040: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 de effects:. *.T
2050: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 he err field of
2060: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 the currently op
2070: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73 erative State is
2080: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 set. *. to a s
2090: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 tring describing
20a0: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 the SSL negotia
20b0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 tion failure rea
20c0: 73 6f 6e 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d son. *----------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
2110: 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 id.Tls_Error(Sta
2120: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 te *statePtr, ch
2130: 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 ar *msg) {. T
2140: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
2150: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
2160: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
2170: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
2180: 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 nt code;.. dp
2190: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
21a0: 0a 0a 20 20 20 20 69 66 20 28 6d 73 67 20 26 26 .. if (msg &&
21b0: 20 2a 6d 73 67 29 20 7b 0a 09 54 63 6c 5f 53 65 *msg) {..Tcl_Se
21c0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
21d0: 70 2c 20 22 53 53 4c 22 2c 20 6d 73 67 2c 20 28 p, "SSL", msg, (
21e0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 char *)NULL);.
21f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6d 73 67 20 } else {..msg
2200: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
2210: 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 romObj(Tcl_GetOb
2220: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c jResult(interp),
2230: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 NULL);. }.
2240: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 statePtr->err
2250: 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 69 66 20 28 = msg;.. if (
2260: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
2270: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 ck == (Tcl_Obj*)
2280: 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 NULL) {..char bu
2290: 66 5b 42 55 46 53 49 5a 5d 3b 0a 09 73 70 72 69 f[BUFSIZ];..spri
22a0: 6e 74 66 28 62 75 66 2c 20 22 53 53 4c 20 63 68 ntf(buf, "SSL ch
22b0: 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 3a 20 65 72 annel \"%s\": er
22c0: 72 6f 72 3a 20 25 73 22 2c 0a 09 20 20 20 20 54 ror: %s",.. T
22d0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
22e0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
22f0: 29 2c 20 6d 73 67 29 3b 0a 09 54 63 6c 5f 53 65 ), msg);..Tcl_Se
2300: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
2310: 62 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c buf, TCL_VOLATIL
2320: 45 29 3b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a E);.#if (TCL_MAJ
2330: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
2340: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
2350: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
2360: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
2370: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
2380: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
2390: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
23a0: 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 23 65 6e TCL_ERROR);.#en
23b0: 64 69 66 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 dif..return;.
23c0: 20 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 }. cmdPtr =
23d0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
23e0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
23f0: 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c ack);.. Tcl_L
2400: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2410: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2420: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
2430: 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 gObj("error", -1
2440: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2450: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2460: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2470: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
2480: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
2490: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
24a0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b tr->self), -1));
24b0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
24c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
24d0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
24e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
24f0: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 sg, -1));.. T
2500: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
2510: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
2520: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 ;. Tcl_Preser
2530: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
2540: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
2550: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
2560: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
2570: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
2580: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
2590: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
25a0: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
25b0: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
25c0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
25d0: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
25e0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
25f0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
2600: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
2610: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
2620: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
2630: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
2640: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
2650: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
2660: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
2670: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 Tcl_Release((C
2680: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
2690: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 Ptr);. Tcl_Re
26a0: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
26b0: 61 29 20 69 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a a) interp);.}...
26c0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2700: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b --------. *. * K
2710: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d eyLogCallback --
2720: 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 63 . *. *.Write rec
2730: 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 20 74 eived key data t
2740: 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 o log file.. *.
2750: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
2760: 20 2a 09 6e 6f 6e 65 0a 20 2a 2d 2d 2d 2d 2d 2d *.none. *------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
27b0: 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c /.void KeyLogCal
27c0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
27d0: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 *ssl, const char
27e0: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 *line) {. ch
27f0: 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 ar *str = getenv
2800: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b (SSLKEYLOGFILE);
2810: 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 20 . FILE *fd;.
2820: 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66 if (str) {..f
2830: 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 d = fopen(str, "
2840: 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 a");..fprintf(fd
2850: 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a , "%s\n",line);.
2860: 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 .fclose(fd);.
2870: 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d }.}.../*. *----
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
28c0: 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 43 61 *. * PasswordCa
28d0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 llback --. *. *.
28e0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 Called when a pa
28f0: 73 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 ssword is needed
2900: 20 74 6f 20 75 6e 70 61 63 6b 20 52 53 41 20 61 to unpack RSA a
2910: 6e 64 20 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 nd PEM keys.. *.
2920: 45 76 61 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 Evals any bound
2930: 70 61 73 73 77 6f 72 64 20 73 63 72 69 70 74 20 password script
2940: 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 and returns the
2950: 72 65 73 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 result as. *.the
2960: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 password string
2970: 2e 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
29c0: 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 ic int.PasswordC
29d0: 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 allback(char *bu
29e0: 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 f, int size, int
29f0: 20 76 65 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 verify, void *u
2a00: 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 data) {. Stat
2a10: 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 e *statePtr.= (S
2a20: 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 tate *) udata;.
2a30: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
2a40: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
2a50: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
2a60: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
2a70: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 int code;..
2a80: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
2a90: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
2aa0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
2ab0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 == NULL) {..if
2ac0: 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 (Tcl_EvalEx(inte
2ad0: 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f rp, "tls::passwo
2ae0: 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 rd", -1, TCL_EVA
2af0: 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c L_GLOBAL) == TCL
2b00: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 _OK) {.. char
2b10: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 *ret = (char *)
2b20: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 Tcl_GetStringRe
2b30: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 sult(interp);..
2b40: 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 strncpy(buf,
2b50: 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 ret, (size_t) si
2b60: 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e ze);.. return
2b70: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 (int)strlen(ret
2b80: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 );..} else {..
2b90: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a return -1;..}.
2ba0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 }.. cmdPt
2bb0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
2bc0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 eObj(statePtr->p
2bd0: 61 73 73 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54 assword);.. T
2be0: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
2bf0: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
2c00: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 ;. Tcl_Preser
2c10: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
2c20: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
2c30: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
2c40: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
2c50: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
2c60: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
2c70: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
2c80: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
2c90: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
2ca0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
2cb0: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
2cc0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
2cd0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
2ce0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
2cf0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
2d00: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
2d10: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
2d20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
2d30: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
2d40: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
2d50: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
2d60: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
2d70: 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 ePtr);.. if (
2d80: 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 code == TCL_OK)
2d90: 7b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 {..char *ret = (
2da0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 char *) Tcl_GetS
2db0: 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 tringResult(inte
2dc0: 72 70 29 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e rp);..if (strlen
2dd0: 28 72 65 74 29 20 3c 20 73 69 7a 65 20 2d 20 31 (ret) < size - 1
2de0: 29 20 7b 0a 09 20 20 20 20 73 74 72 6e 63 70 79 ) {.. strncpy
2df0: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 (buf, ret, (size
2e00: 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 _t) size);..
2e10: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
2e20: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
2e30: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 ;.. return (i
2e40: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a nt)strlen(ret);.
2e50: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c .}. }. Tcl
2e60: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
2e70: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
2e80: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76 return -1;..v
2e90: 65 72 69 66 79 20 3d 20 76 65 72 69 66 79 3b 0a erify = verify;.
2ea0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
2ef0: 20 2a 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 * SessionCallba
2f00: 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d ck for Clients -
2f10: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 -. *. *.Called w
2f20: 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f hen a new sessio
2f30: 6e 20 74 69 63 6b 65 74 20 68 61 73 20 62 65 65 n ticket has bee
2f40: 6e 20 72 65 63 65 69 76 65 64 2e 20 49 6e 20 54 n received. In T
2f50: 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d LS 1.3. *.this m
2f60: 61 79 20 62 65 20 72 65 63 65 69 76 65 64 20 6d ay be received m
2f70: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 ultiple times af
2f80: 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b ter the handshak
2f90: 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 e. For. *.earlie
2fa0: 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 r versions, this
2fb0: 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 will be receive
2fc0: 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e d during the han
2fd0: 64 73 68 61 6b 65 2e 0a 20 2a 0a 20 2a 20 52 65 dshake.. *. * Re
2fe0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
2ff0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
3000: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
3010: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
3020: 29 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ). *------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
3070: 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 ic int.SessionCa
3080: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
3090: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 *ssl, SSL_SESSI
30a0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 ON *session) {.
30b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
30c0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr = (State*)SSL
30d0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 _get_app_data((S
30e0: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 SL *)ssl);. T
30f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
3100: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
3110: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
3120: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 j *cmdPtr;. c
3130: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
3140: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 ar *ticket;.
3150: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
3160: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b har *session_id;
3170: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 . int len;.
3180: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 int code;.
3190: 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 0a 20 20 size_t len2;..
31a0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
31b0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
31c0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
31d0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
31e0: 4c 4c 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 0a LL)..return 0;..
31f0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
3200: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
3210: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
3220: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
3230: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3240: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3250: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3260: 6a 28 20 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 j( "session", -1
3270: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 ));.. /* Sess
3280: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 ion id */. se
3290: 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 ssion_id = SSL_S
32a0: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 ESSION_get0_id_c
32b0: 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 ontext(session,
32c0: 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c &len);. Tcl_L
32d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
32e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
32f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
3300: 67 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c gObj(session_id,
3310: 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 len));.. /*
3320: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a Session ticket *
3330: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f /. SSL_SESSIO
3340: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 N_get0_ticket(se
3350: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
3360: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f &len2);. Tcl_
3370: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3380: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3390: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
33a0: 6e 67 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 ngObj(ticket, (i
33b0: 6e 74 29 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 nt)len2));..
33c0: 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 /* Lifetime - nu
33d0: 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 mber of seconds
33e0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f */. Tcl_ListO
33f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3400: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
3410: 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 .Tcl_NewLongObj(
3420: 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 (long) SSL_SESSI
3430: 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 ON_get_ticket_li
3440: 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 fetime_hint(sess
3450: 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 54 63 6c ion)));.. Tcl
3460: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
3470: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
3480: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
3490: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
34a0: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 atePtr);.. Tc
34b0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
34c0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 mdPtr);. code
34d0: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 = Tcl_EvalObjEx
34e0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
34f0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
3500: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 );. if (code
3510: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 != TCL_OK) {.#if
3520: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 (TCL_MAJOR_VERS
3530: 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 ION == 8) && (TC
3540: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MINOR_VERSION
3550: 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 < 6)..Tcl_Backgr
3560: 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 oundError(interp
3570: 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 );.#else..Tcl_Ba
3580: 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f ckgroundExceptio
3590: 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b n(interp, code);
35a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 .#endif. }.
35b0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
35c0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 nt(cmdPtr);..
35d0: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c Tcl_Release((Cl
35e0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
35f0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c tr);. Tcl_Rel
3600: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 ease((ClientData
3610: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 ) interp);. r
3620: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0c 0a 2f 2a 0a eturn 1;.}.../*.
3630: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3670: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e -----. *. * ALPN
3680: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 Callback for Se
3690: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 53 rvers --. *. *.S
36a0: 65 6c 65 63 74 20 77 68 69 63 68 20 70 72 6f 74 elect which prot
36b0: 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 ocol (http/1.1,
36c0: 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 74 6f h2, h3, etc.) to
36d0: 20 75 73 65 20 66 6f 72 20 74 68 65 0a 20 2a 09 use for the. *.
36e0: 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 incoming connect
36f0: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ion.. *. * Resul
3700: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
3710: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
3720: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
3730: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
3740: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
3750: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s:. *.SSL_TLSEXT
3760: 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 _ERR_OK: ALPN pr
3770: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e otocol selected.
3780: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
3790: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
37a0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 L_TLSEXT_ERR_ALE
37b0: 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 RT_FATAL: There
37c0: 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 was no overlap b
37d0: 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e etween the clien
37e0: 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c t's. *. suppl
37f0: 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 ied list and the
3800: 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 server configur
3810: 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 ation. The conne
3820: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 ction will be ab
3830: 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c orted.. *.SSL_TL
3840: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 SEXT_ERR_NOACK:
3850: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f ALPN protocol no
3860: 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e t selected, e.g.
3870: 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 , because no ALP
3880: 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f N. *. protoco
3890: 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 ls are configure
38a0: 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 d for this conne
38b0: 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 ction. The conne
38c0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
38d0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
3920: 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c atic int.ALPNCal
3930: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
3940: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 *ssl, const unsi
3950: 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c gned char **out,
3960: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
3970: 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 outlen,..const u
3980: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e nsigned char *in
3990: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 , unsigned int i
39a0: 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 nlen, void *arg)
39b0: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
39c0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a atePtr = (State*
39d0: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e )arg;. Tcl_In
39e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
39f0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
3a00: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
3a10: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f dPtr;. int co
3a20: 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 de;.. dprintf
3a30: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
3a40: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
3a50: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f allback == (Tcl_
3a60: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 Obj*)NULL)..retu
3a70: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
3a80: 52 5f 4f 4b 3b 0a 0a 20 20 20 20 63 6d 64 50 74 R_OK;.. cmdPt
3a90: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
3aa0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 eObj(statePtr->c
3ab0: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54 allback);.. T
3ac0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3ad0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3ae0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
3af0: 74 72 69 6e 67 4f 62 6a 28 20 22 61 6c 70 6e 22 tringObj( "alpn"
3b00: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c , -1));.. Tcl
3b10: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
3b20: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
3b30: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
3b40: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
3b50: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 atePtr);.. Tc
3b60: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
3b70: 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 mdPtr);. code
3b80: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 = Tcl_EvalObjEx
3b90: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3ba0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
3bb0: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 );. if (code
3bc0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 != TCL_OK) {.#if
3bd0: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 (TCL_MAJOR_VERS
3be0: 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 ION == 8) && (TC
3bf0: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MINOR_VERSION
3c00: 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 < 6)..Tcl_Backgr
3c10: 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 oundError(interp
3c20: 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 );.#else..Tcl_Ba
3c30: 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f ckgroundExceptio
3c40: 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b n(interp, code);
3c50: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 .#endif. }.
3c60: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
3c70: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 nt(cmdPtr);..
3c80: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c Tcl_Release((Cl
3c90: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
3ca0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c tr);. Tcl_Rel
3cb0: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 ease((ClientData
3cc0: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 ) interp);. r
3cd0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
3ce0: 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a _ERR_OK;.}.../*.
3cf0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d30: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 -----. *. * SNI
3d40: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 Callback for Ser
3d50: 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 vers --. *. *.Pe
3d60: 72 66 6f 72 6d 20 73 65 72 76 65 72 20 6e 61 6d rform server nam
3d70: 65 20 73 65 6c 65 63 74 69 6f 6e 0a 20 2a 0a 20 e selection. *.
3d80: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
3d90: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
3da0: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
3db0: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
3dc0: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 ined). *. * Retu
3dd0: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c rn codes:. *.SSL
3de0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 _TLSEXT_ERR_OK:
3df0: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 SNI hostname is
3e00: 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f accepted. The co
3e10: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
3e20: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es.. *.SSL_TLSEX
3e30: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 T_ERR_ALERT_FATA
3e40: 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 L: SNI hostname
3e50: 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2e is not accepted.
3e60: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a The connection.
3e70: 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 65 *. is aborte
3e80: 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 61 d. Default for a
3e90: 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f 55 lert is SSL_AD_U
3ea0: 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 NRECOGNIZED_NAME
3eb0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
3ec0: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e ERR_ALERT_WARNIN
3ed0: 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 G: SNI hostname
3ee0: 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2c is not accepted,
3ef0: 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20 warning alert.
3f00: 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 20 *. sent (not
3f10: 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 in TLSv1.3). The
3f20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
3f30: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c inues.. *.SSL_TL
3f40: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 SEXT_ERR_NOACK:
3f50: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 SNI hostname is
3f60: 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 not accepted and
3f70: 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 not acknowledge
3f80: 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 d,. *. e.g. i
3f90: 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 f SNI has not be
3fa0: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 en configured. T
3fb0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
3fc0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d ntinues.. *. *--
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4010: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
4020: 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e .SNICallback(con
4030: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 st SSL *ssl, int
4040: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 *alert, void *a
4050: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 rg) {. State
4060: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
4070: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c te*)arg;. Tcl
4080: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
4090: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
40a0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
40b0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 *cmdPtr;. int
40c0: 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 code;. char
40d0: 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 *servername = NU
40e0: 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 LL;.. dprintf
40f0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
4100: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
4110: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f allback == (Tcl_
4120: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 Obj*)NULL) {..re
4130: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
4140: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c ERR_OK;. } el
4150: 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 se if (ssl == NU
4160: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
4170: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
4180: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 CK;. }.. s
4190: 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f ervername = SSL_
41a0: 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 get_servername(s
41b0: 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 sl, TLSEXT_NAMET
41c0: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a YPE_host_name);.
41d0: 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e if (!servern
41e0: 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d ame || servernam
41f0: 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a e[0] == '\0') {.
4200: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 return S
4210: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
4220: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ACK;. }..
4230: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
4240: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
4250: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a tr->callback);..
4260: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4270: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4280: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
4290: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 22 _NewStringObj( "
42a0: 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 sni", -1));.
42b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
42c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
42d0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
42e0: 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 StringObj(server
42f0: 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 name , -1));..
4300: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
4310: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
4320: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 rp);. Tcl_Pre
4330: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 serve((ClientDat
4340: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
4350: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
4360: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
4370: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c code = Tcl_Eval
4380: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d ObjEx(interp, cm
4390: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 dPtr, TCL_EVAL_G
43a0: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 LOBAL);. if (
43b0: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 code != TCL_OK)
43c0: 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 {.#if (TCL_MAJOR
43d0: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 _VERSION == 8) &
43e0: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 & (TCL_MINOR_VER
43f0: 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 SION < 6)..Tcl_B
4400: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 ackgroundError(i
4410: 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 nterp);.#else..T
4420: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 cl_BackgroundExc
4430: 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 eption(interp, c
4440: 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 ode);.#endif.
4450: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 }. Tcl_DecrR
4460: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
4470: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 .. Tcl_Releas
4480: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
4490: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 tatePtr);. Tc
44a0: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
44b0: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
44c0: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 return SSL_T
44d0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a LSEXT_ERR_OK;.}.
44e0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
44f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
4530: 20 48 65 6c 6c 6f 20 43 61 6c 6c 62 61 63 6b 20 Hello Callback
4540: 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 for Servers --.
4550: 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 73 65 72 *. *.Used by ser
4560: 76 65 72 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 ver to examine t
4570: 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 he server name i
4580: 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 ndication (SNI)
4590: 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f extension. *.pro
45a0: 76 69 64 65 64 20 62 79 20 74 68 65 20 63 6c 69 vided by the cli
45b0: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 ent in order to
45c0: 73 65 6c 65 63 74 20 61 6e 20 61 70 70 72 6f 70 select an approp
45d0: 72 69 61 74 65 20 63 65 72 74 69 66 69 63 61 74 riate certificat
45e0: 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c e to. *.present,
45f0: 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 and make other
4600: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 64 configuration ad
4610: 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 justments releva
4620: 6e 74 20 74 6f 20 74 68 61 74 20 73 65 72 76 65 nt to that serve
4630: 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 r. *.name and it
4640: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e s configuration.
4650: 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20 73 This includes s
4660: 77 61 70 70 69 6e 67 20 6f 75 74 20 74 68 65 20 wapping out the
4670: 61 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 associated. *.SS
4680: 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d L_CTX pointer, m
4690: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 65 72 odifying the ser
46a0: 76 65 72 27 73 20 6c 69 73 74 20 6f 66 20 70 65 ver's list of pe
46b0: 72 6d 69 74 74 65 64 20 54 4c 53 20 76 65 72 73 rmitted TLS vers
46c0: 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e ions,. *.changin
46d0: 67 20 74 68 65 20 73 65 72 76 65 72 27 73 20 63 g the server's c
46e0: 69 70 68 65 72 20 6c 69 73 74 20 69 6e 20 72 65 ipher list in re
46f0: 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 63 6c sponse to the cl
4700: 69 65 6e 74 27 73 20 63 69 70 68 65 72 20 6c 69 ient's cipher li
4710: 73 74 2c 20 65 74 63 2e 0a 20 2a 0a 20 2a 20 52 st, etc.. *. * R
4720: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
4730: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
4740: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
4750: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
4760: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 d). *. * Return
4770: 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c codes:. *.SSL_CL
4780: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 IENT_HELLO_RETRY
4790: 20 3d 20 73 75 73 70 65 6e 64 20 74 68 65 20 68 = suspend the h
47a0: 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 andshake, and th
47b0: 65 20 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 e handshake func
47c0: 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e tion will return
47d0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 immediately. *.
47e0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
47f0: 5f 45 52 52 4f 52 20 3d 20 66 61 69 6c 75 72 65 _ERROR = failure
4800: 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e , terminate conn
4810: 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 ection. Set aler
4820: 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e t to error code.
4830: 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 . *.SSL_CLIENT_H
4840: 45 4c 4c 4f 5f 53 55 43 43 45 53 53 20 3d 20 73 ELLO_SUCCESS = s
4850: 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d uccess. *. *----
4860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
48a0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 */.static int.H
48b0: 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e elloCallback(con
48c0: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 st SSL *ssl, int
48d0: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 *alert, void *a
48e0: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 rg) {. State
48f0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
4900: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c te*)arg;. Tcl
4910: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
4920: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
4930: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
4940: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 *cmdPtr;. int
4950: 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 code;.. dpri
4960: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
4970: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
4980: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
4990: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 cl_Obj*)NULL)..r
49a0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
49b0: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a _HELLO_SUCCESS;.
49c0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
49d0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
49e0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
49f0: 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 k);.. Tcl_Lis
4a00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4a10: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4a20: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
4a30: 62 6a 28 20 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 bj( "hello", -1)
4a40: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 53 4c 5f 63 );.. /* SSL_c
4a50: 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 lient_hello_get0
4a60: 5f 72 61 6e 64 6f 6d 28 29 2c 20 53 53 4c 5f 63 _random(), SSL_c
4a70: 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 lient_hello_get0
4a80: 5f 73 65 73 73 69 6f 6e 5f 69 64 28 29 2c 20 53 _session_id(), S
4a90: 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f SL_client_hello_
4aa0: 67 65 74 30 5f 63 69 70 68 65 72 73 28 29 2c 20 get0_ciphers(),
4ab0: 61 6e 64 20 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 and SSL_client_h
4ac0: 65 6c 6c 6f 5f 67 65 74 30 5f 63 6f 6d 70 72 65 ello_get0_compre
4ad0: 73 73 69 6f 6e 5f 6d 65 74 68 6f 64 73 28 29 20 ssion_methods()
4ae0: 70 72 6f 76 69 64 65 20 61 63 63 65 73 73 20 74 provide access t
4af0: 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 o the correspond
4b00: 69 6e 67 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 ing ClientHello
4b10: 66 69 65 6c 64 73 2c 20 72 65 74 75 72 6e 69 6e fields, returnin
4b20: 67 20 74 68 65 20 66 69 65 6c 64 20 6c 65 6e 67 g the field leng
4b30: 74 68 20 61 6e 64 20 6f 70 74 69 6f 6e 61 6c 6c th and optionall
4b40: 79 20 73 65 74 74 69 6e 67 20 61 6e 20 6f 75 74 y setting an out
4b50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 pointer to the
4b60: 6f 63 74 65 74 73 20 6f 66 20 74 68 61 74 20 66 octets of that f
4b70: 69 65 6c 64 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a ield. */.. /*
4b80: 20 53 69 6d 69 6c 61 72 6c 79 2c 20 53 53 4c 5f Similarly, SSL_
4b90: 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 client_hello_get
4ba0: 30 5f 65 78 74 28 29 20 70 72 6f 76 69 64 65 73 0_ext() provides
4bb0: 20 61 63 63 65 73 73 20 74 6f 20 69 6e 64 69 76 access to indiv
4bc0: 69 64 75 61 6c 20 65 78 74 65 6e 73 69 6f 6e 73 idual extensions
4bd0: 20 66 72 6f 6d 20 74 68 65 20 43 6c 69 65 6e 74 from the Client
4be0: 48 65 6c 6c 6f 20 6f 6e 20 61 20 70 65 72 2d 65 Hello on a per-e
4bf0: 78 74 65 6e 73 69 6f 6e 20 62 61 73 69 73 2e 20 xtension basis.
4c00: 46 6f 72 20 74 68 65 20 70 72 6f 76 69 64 65 64 For the provided
4c10: 20 77 69 72 65 20 70 72 6f 74 6f 63 6f 6c 20 65 wire protocol e
4c20: 78 74 65 6e 73 69 6f 6e 20 74 79 70 65 20 76 61 xtension type va
4c30: 6c 75 65 2c 20 74 68 65 20 65 78 74 65 6e 73 69 lue, the extensi
4c40: 6f 6e 20 76 61 6c 75 65 20 61 6e 64 20 6c 65 6e on value and len
4c50: 67 74 68 20 61 72 65 20 72 65 74 75 72 6e 65 64 gth are returned
4c60: 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 70 in the output p
4c70: 61 72 61 6d 65 74 65 72 73 20 28 69 66 20 70 72 arameters (if pr
4c80: 65 73 65 6e 74 29 2e 20 2a 2f 0a 0a 0a 20 20 20 esent). */...
4c90: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 Tcl_Preserve((C
4ca0: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 lientData) inter
4cb0: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 p);. Tcl_Pres
4cc0: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
4cd0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 ) statePtr);..
4ce0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
4cf0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
4d00: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f code = Tcl_EvalO
4d10: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 bjEx(interp, cmd
4d20: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c Ptr, TCL_EVAL_GL
4d30: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 OBAL);. if (c
4d40: 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ode != TCL_OK) {
4d50: 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f .#if (TCL_MAJOR_
4d60: 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 VERSION == 8) &&
4d70: 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 (TCL_MINOR_VERS
4d80: 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 ION < 6)..Tcl_Ba
4d90: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e ckgroundError(in
4da0: 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 terp);.#else..Tc
4db0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 l_BackgroundExce
4dc0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f ption(interp, co
4dd0: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 de);.#endif.
4de0: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 }. Tcl_DecrRe
4df0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
4e00: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 . Tcl_Release
4e10: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
4e20: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c atePtr);. Tcl
4e30: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
4e40: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
4e50: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c return SSL_CL
4e60: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 IENT_HELLO_SUCCE
4e70: 53 53 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a SS;.}.../*******
4e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f *************/./
4e90: 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 * Commands
4ea0: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a */./*********
4eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a ***********/../*
4ec0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f00: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 ------. *. * Cip
4f10: 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 hersObjCmd -- li
4f20: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 st available cip
4f30: 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 hers. *. *.This
4f40: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
4f50: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
4f60: 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 the "tls::cipher
4f70: 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f s" command. *.to
4f80: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 list available
4f90: 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 ciphers, based u
4fa0: 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c pon protocol sel
4fb0: 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 ected.. *. * Res
4fc0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
4fd0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c ard Tcl result l
4fe0: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ist.. *. * Side
4ff0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 effects:. *.cons
5000: 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 tructs and destr
5010: 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 oys SSL context
5020: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d (CTX). *. *-----
5030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5070: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 */.static const
5080: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b char *protocols[
5090: 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 ] = {.."ssl2", "
50a0: 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 ssl3", "tls1", "
50b0: 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 tls1.1", "tls1.2
50c0: 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c ", "tls1.3", NUL
50d0: 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 L.};.enum protoc
50e0: 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c ol {. TLS_SSL
50f0: 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 2, TLS_SSL3, TLS
5100: 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f _TLS1, TLS_TLS1_
5110: 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 1, TLS_TLS1_2, T
5120: 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e LS_TLS1_3, TLS_N
5130: 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 ONE.};..static i
5140: 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 nt.CiphersObjCmd
5150: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
5160: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
5170: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
5180: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
5190: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
51a0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
51b0: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 tr = NULL;. S
51c0: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 SL_CTX *ctx = NU
51d0: 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c LL;. SSL *ssl
51e0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 = NULL;. STA
51f0: 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 CK_OF(SSL_CIPHER
5200: 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 ) *sk;. char
5210: 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d *cp, buf[BUFSIZ]
5220: 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c ;. int index,
5230: 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 verbose = 0, us
5240: 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b e_supported = 0;
5250: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
5260: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
5270: 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 ((objc < 2) ||
5280: 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 (objc > 4)) {..T
5290: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
52a0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
52b0: 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 "protocol ?verb
52c0: 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f ose? ?supported?
52d0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
52e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
52f0: 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 if (Tcl_GetInde
5300: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c xFromObj(interp,
5310: 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 objv[1], protoc
5320: 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c ols, "protocol",
5330: 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 0, &index) != T
5340: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
5350: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
5360: 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 }. if ((objc
5370: 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 > 2) && Tcl_GetB
5380: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e ooleanFromObj(in
5390: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 terp, objv[2], &
53a0: 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f verbose) != TCL_
53b0: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
53c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
53d0: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 if ((objc > 3
53e0: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c ) && Tcl_GetBool
53f0: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 eanFromObj(inter
5400: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 p, objv[3], &use
5410: 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 _supported) != T
5420: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
5430: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
5440: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 }.. switch ((
5450: 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e enum protocol)in
5460: 64 65 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 dex) {..case TLS
5470: 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 _SSL2:.#if OPENS
5480: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
5490: 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c R >= 0x10100000L
54a0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 || defined(NO_S
54b0: 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 SL2) || defined(
54c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
54d0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
54e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
54f0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
5500: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
5510: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
5520: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
5530: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
5540: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f .. ctx = SSL_
5550: 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65 CTX_new(SSLv2_me
5560: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a thod()); break;.
5570: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 #endif..case TLS
5580: 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e _SSL3:.#if defin
5590: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 ed(NO_SSL3) || d
55a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
55b0: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e O_SSL3) || defin
55c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
55d0: 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 L3_METHOD)..
55e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
55f0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
5600: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
5610: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
5620: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
5630: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
5640: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
5650: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
5660: 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 w(SSLv3_method()
5670: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
5680: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a ..case TLS_TLS1:
5690: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
56a0: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 TLS1) || defined
56b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
56c0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
56d0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 NSSL_NO_TLS1_MET
56e0: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 HOD).. Tcl_Ap
56f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
5700: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
5710: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
5720: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
5730: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
5740: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
5750: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 else.. ctx =
5760: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 SSL_CTX_new(TLSv
5770: 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 1_method()); bre
5780: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
5790: 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 TLS_TLS1_1:.#if
57a0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
57b0: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
57c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
57d0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
57e0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d NSSL_NO_TLS1_1_M
57f0: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
5800: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
5810: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
5820: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
5830: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
5840: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
5850: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
5860: 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 .#else.. ctx
5870: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c = SSL_CTX_new(TL
5880: 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b Sv1_1_method());
5890: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
58a0: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a case TLS_TLS1_2:
58b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
58c0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e TLS1_2) || defin
58d0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
58e0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
58f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
5900: 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 _2_METHOD)..
5910: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
5920: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
5930: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
5940: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
5950: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
5960: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
5970: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
5980: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
5990: 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 w(TLSv1_2_method
59a0: 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 ()); break;.#end
59b0: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
59c0: 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 1_3:.#if defined
59d0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 (NO_TLS1_3) || d
59e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
59f0: 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 O_TLS1_3).. T
5a00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
5a10: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
5a20: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
5a30: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
5a40: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
5a50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
5a60: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 OR;.#else.. c
5a70: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
5a80: 28 54 4c 53 5f 6d 65 74 68 6f 64 28 29 29 3b 0a (TLS_method());.
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 53 53 4c 5f SSL_
5aa0: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 CTX_set_min_prot
5ab0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 o_version(ctx, T
5ac0: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a LS1_3_VERSION);.
5ad0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
5ae0: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _max_proto_versi
5af0: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 on(ctx, TLS1_3_V
5b00: 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 ERSION);.. br
5b10: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 eak;.#endif..def
5b20: 61 75 6c 74 3a 0a 09 20 20 20 20 62 72 65 61 6b ault:.. break
5b30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
5b40: 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ctx == NULL) {..
5b50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
5b60: 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 (interp, REASON(
5b70: 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ), NULL);..retur
5b80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
5b90: 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 }.. ssl = SS
5ba0: 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 L_new(ctx);.
5bb0: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 if (ssl == NULL)
5bc0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
5bd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 sult(interp, REA
5be0: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 SON(), NULL);..S
5bf0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
5c00: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
5c10: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
5c20: 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 /* Use list and
5c30: 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 order as would b
5c40: 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 e sent in a Clie
5c50: 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 ntHello or all a
5c60: 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 vailable ciphers
5c70: 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f */. if (use_
5c80: 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b supported) {..sk
5c90: 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 = SSL_get1_supp
5ca0: 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 orted_ciphers(ss
5cb0: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b l);. } else {
5cc0: 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 ..sk = SSL_get_c
5cd0: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 iphers(ssl);.
5ce0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 }.. if (sk !
5cf0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 = NULL) {..if (!
5d00: 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 verbose) {..
5d10: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
5d20: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
5d30: 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 ;.. for (int
5d40: 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 i = 0; i < sk_SS
5d50: 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 L_CIPHER_num(sk)
5d60: 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 ; i++) {...const
5d70: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d SSL_CIPHER *c =
5d80: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 sk_SSL_CIPHER_v
5d90: 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 alue(sk, i);...i
5da0: 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f f (c == NULL) co
5db0: 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 ntinue;..../* ci
5dc0: 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f pher name or (NO
5dd0: 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 NE) */...cp = SS
5de0: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d L_CIPHER_get_nam
5df0: 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d e(c);...if (cp =
5e00: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 = NULL) break;..
5e10: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
5e20: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5e30: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
5e40: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d wStringObj(cp, -
5e50: 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 1));.. }...}
5e60: 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 else {.. objP
5e70: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 tr = Tcl_NewStri
5e80: 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 ngObj("",0);..
5e90: 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 for (int i = 0
5ea0: 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 ; i < sk_SSL_CIP
5eb0: 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b HER_num(sk); i++
5ec0: 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f ) {...const SSL_
5ed0: 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 CIPHER *c = sk_S
5ee0: 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 SL_CIPHER_value(
5ef0: 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 sk, i);...if (c
5f00: 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 == NULL) continu
5f10: 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c e;..../* textual
5f20: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 description of
5f30: 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 the cipher */...
5f40: 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 if (SSL_CIPHER_d
5f50: 65 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 escription(c, bu
5f60: 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 f, sizeof(buf))
5f70: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 != NULL) {...
5f80: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a Tcl_AppendToObj
5f90: 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 69 (objPtr, buf, (i
5fa0: 6e 74 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 nt) strlen(buf))
5fb0: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 ;...} else {...
5fc0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f Tcl_AppendToO
5fd0: 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e bj(objPtr, "UNKN
5fe0: 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a OWN\n", 8);...}.
5ff0: 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 . }..}..if (u
6000: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a se_supported) {.
6010: 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 . sk_SSL_CIPH
6020: 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a ER_free(sk);..}.
6030: 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 }. SSL_fr
6040: 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c ee(ssl);. SSL
6050: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
6060: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
6070: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
6080: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
6090: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e n TCL_OK;..clien
60a0: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
60b0: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ta;.}.../*. *---
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 2d 2d 2d 2d 2d 2d ----------------
6100: 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 . *. * Protocols
6110: 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 ObjCmd -- list a
6120: 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f vailable protoco
6130: 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 ls. *. *.This pr
6140: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
6150: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 ed to process th
6160: 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c e "tls::protocol
6170: 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f s" command. *.to
6180: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 list available
6190: 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a protocols.. *. *
61a0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
61b0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
61c0: 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 lt list.. *. * S
61d0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
61e0: 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d none. *. *------
61f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
6230: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f /.static int.Pro
6240: 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 tocolsObjCmd(Cli
6250: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
6260: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
6270: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
6280: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
6290: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
62a0: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a cl_Obj *objPtr;.
62b0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
62c0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
62d0: 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 (objc != 1) {..T
62e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
62f0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
6300: 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 "");..return TC
6310: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
6320: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
6330: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
6340: 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 ULL);..#if OPENS
6350: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
6360: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 R < 0x10100000L
6370: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 && !defined(NO_S
6380: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL2) && !defined
6390: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
63a0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
63b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
63c0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
63d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
63e0: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 protocols[TLS_SS
63f0: 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 L2], -1));.#endi
6400: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
6410: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
6420: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
6430: 53 4c 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 SL3). Tcl_Lis
6440: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
6450: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
6460: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
6470: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
6480: 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 _SSL3], -1));.#e
6490: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
64a0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 d(NO_TLS1) && !d
64b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
64c0: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 54 63 6c 5f O_TLS1). Tcl_
64d0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
64e0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
64f0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
6500: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
6510: 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b TLS_TLS1], -1));
6520: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
6530: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
6540: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
6550: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 SSL_NO_TLS1_1).
6560: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
6570: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
6580: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
6590: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
65a0: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f tocols[TLS_TLS1_
65b0: 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 1], -1));.#endif
65c0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
65d0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
65e0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
65f0: 54 4c 53 31 5f 32 29 0a 20 20 20 20 54 63 6c 5f TLS1_2). Tcl_
6600: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
6610: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
6620: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
6630: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
6640: 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 TLS_TLS1_2], -1)
6650: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
6660: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
6670: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
6680: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
6690: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
66a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
66b0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
66c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
66d0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 rotocols[TLS_TLS
66e0: 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 1_3], -1));.#end
66f0: 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f if.. Tcl_SetO
6700: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
6710: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
6720: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
6730: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
6740: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a tData;.}.../*. *
6750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6790: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 ---. *. * Handsh
67a0: 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a akeObjCmd --. *.
67b0: 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 *.This command
67c0: 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 is used to verif
67d0: 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 y whether the ha
67e0: 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c ndshake is compl
67f0: 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 ete. *.or not..
6800: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
6810: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
6820: 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 result. 1 means
6830: 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 handshake comple
6840: 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 te, 0 means pend
6850: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ing.. *. * Side
6860: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
6870: 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 force SSL negoti
6880: 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c ation to take pl
6890: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ace.. *. *------
68a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
68b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
68c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
68d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
68e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e /.static int Han
68f0: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 dshakeObjCmd(Cli
6900: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
6910: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
6920: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
6930: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
6940: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
6950: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
6960: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 /* The c
6970: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 hannel to set a
6980: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 mode on. */.
6990: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
69a0: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e /* clien
69b0: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
69c0: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f socket */. co
69d0: 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 nst char *errStr
69e0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 = NULL;. int
69f0: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e ret = 1;. in
6a00: 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 t err = 0;..
6a10: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
6a20: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
6a30: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 != 2) {..Tcl_Wr
6a40: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
6a50: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
6a60: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 nnel");..return(
6a70: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
6a80: 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 }.. chan = Tc
6a90: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
6aa0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 erp, Tcl_GetStri
6ab0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 ngFromObj(objv[1
6ac0: 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b ], NULL), NULL);
6ad0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
6ae0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
6af0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 ULL) {..return(T
6b00: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
6b10: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
6b20: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
6b30: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
6b40: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
6b50: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
6b60: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
6b70: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
6b80: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
6b90: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
6ba0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
6bb0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
6bc0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
6bd0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
6be0: 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 ame(chan), "\":
6bf0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
6c00: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 l", NULL);..retu
6c10: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
6c20: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 }. statePt
6c30: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c r = (State *)Tcl
6c40: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
6c50: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a nceData(chan);..
6c60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
6c70: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 ling Tls_WaitFor
6c80: 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 Connect");. r
6c90: 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 et = Tls_WaitFor
6ca0: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 Connect(statePtr
6cb0: 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 , &err, 1);.
6cc0: 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 dprintf("Tls_Wai
6cd0: 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 tForConnect retu
6ce0: 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b rned: %i", ret);
6cf0: 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 .. if (ret <
6d00: 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 0 && ((statePtr-
6d10: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c >flags & TLS_TCL
6d20: 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 _ASYNC) && (err
6d30: 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 == EAGAIN))) {..
6d40: 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 dprintf("Async s
6d50: 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 et and err = EAG
6d60: 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b AIN");..ret = 0;
6d70: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
6d80: 72 65 74 20 3c 20 30 29 20 7b 0a 09 65 72 72 53 ret < 0) {..errS
6d90: 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 tr = statePtr->e
6da0: 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 rr;..Tcl_ResetRe
6db0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 sult(interp);..T
6dc0: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 cl_SetErrno(err)
6dd0: 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 ;...if (!errStr
6de0: 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 || (*errStr == 0
6df0: 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 )) {.. errStr
6e00: 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f = Tcl_PosixErro
6e10: 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 r(interp);..}...
6e20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
6e30: 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 (interp, "handsh
6e40: 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 ake failed: ", e
6e50: 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 rrStr, (char *)
6e60: 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 NULL);..dprintf(
6e70: 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 "Returning TCL_E
6e80: 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 RROR with handsh
6e90: 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c ake failed: %s",
6ea0: 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 errStr);..retur
6eb0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
6ec0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 } else {..if (
6ed0: 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 err != 0) {..
6ee0: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e dprintf("Got an
6ef0: 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f error with a co
6f00: 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b mpleted handshak
6f10: 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 e: err = %i", er
6f20: 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b r);..}..ret = 1;
6f30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 . }.. dpri
6f40: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 ntf("Returning T
6f50: 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 CL_OK with data
6f60: 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 \"%i\"", ret);.
6f70: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
6f80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
6f90: 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b NewIntObj(ret));
6fa0: 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f . return(TCL_
6fb0: 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 OK);..clientData
6fc0: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d = clientData;.}
6fd0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
6fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
7020: 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d ImportObjCmd --
7030: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
7040: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
7050: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 to process the
7060: 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a "ssl" command. *
7070: 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d . *.The ssl comm
7080: 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f and pushes SSL o
7090: 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e ver a (newly con
70a0: 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b nected) tcp sock
70b0: 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 et. *. * Results
70c0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
70d0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
70e0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
70f0: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 *.May modify th
7100: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e e behavior of an
7110: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a IO channel.. *.
7120: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
7130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7160: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
7170: 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d int.ImportObjCm
7180: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
7190: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
71a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
71b0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
71c0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
71d0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
71e0: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 chan;../* The ch
71f0: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
7200: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 ode on. */. S
7210: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 tate *statePtr;.
7220: 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 ./* client state
7230: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 for ssl socket
7240: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a */. SSL_CTX *
7250: 63 74 78 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ctx. = NU
7260: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 LL;. Tcl_Obj
7270: 2a 73 63 72 69 70 74 09 20 20 20 20 20 20 20 20 *script.
7280: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
7290: 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 20 Obj *password.
72a0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
72b0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 Tcl_DString up
72c0: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
72d0: 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e ation, upperChan
72e0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 nelBlocking, upp
72f0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
7300: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 g, upperChannelE
7310: 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 OFChar;. int
7320: 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e idx, len;. in
7330: 74 20 66 6c 61 67 73 09 09 20 20 20 20 20 20 20 t flags..
7340: 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b = TLS_TCL_INIT;
7350: 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 . int server.
7360: 09 20 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a . = 0;./*
7370: 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 is connection i
7380: 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f ncoming or outgo
7390: 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 ing? */. char
73a0: 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 *keyfile.
73b0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 = NULL;. ch
73c0: 61 72 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20 ar *certfile.
73d0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
73e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
73f0: 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 key .= NULL;.
7400: 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20 int key_len
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 =
7420: 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 0;. unsigned
7430: 63 68 61 72 20 2a 63 65 72 74 20 20 20 20 20 20 char *cert
7440: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
7450: 6e 74 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 nt cert_len
7460: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a = 0;.
7470: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 char *cipher
7480: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c s. = NULL
7490: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ;. char *ciph
74a0: 65 72 73 75 69 74 65 73 09 20 20 20 20 20 20 20 ersuites.
74b0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
74c0: 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20 r *CAfile.
74d0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 = NULL;. ch
74e0: 61 72 20 2a 43 41 64 69 72 09 09 20 20 20 20 20 ar *CAdir..
74f0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 = NULL;. c
7500: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20 har *DHparams.
7510: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
7520: 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 char *model..
7530: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
7540: 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e char *servern
7550: 61 6d 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ame. = NU
7560: 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 LL;./* hostname
7570: 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 for Server Name
7580: 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 Indication */.
7590: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
75a0: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
75b0: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 d = NULL;. Tc
75c0: 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e l_Obj *alpn..= N
75d0: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c ULL;. int ssl
75e0: 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 2 = 0, ssl3 = 0;
75f0: 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 . int tls1 =
7600: 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 1, tls1_1 = 1, t
7610: 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f ls1_2 = 1, tls1_
7620: 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 3 = 1;. int p
7630: 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 roto = 0, level
7640: 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 = -1;. int ve
7650: 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 rify = 0, requir
7660: 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d e = 0, request =
7670: 20 31 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 1;.. dprintf
7680: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 ("Called");..#if
7690: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
76a0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
76b0: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 0000L && !define
76c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
76d0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 2) && !defined(N
76e0: 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e O_SSL2) && defin
76f0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 ed(NO_SSL3) && d
7700: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
7710: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
7720: 53 31 5f 31 29 20 26 26 20 64 65 66 69 6e 65 64 S1_1) && defined
7730: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 64 (NO_TLS1_2) && d
7740: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
7750: 29 0a 20 20 20 20 73 73 6c 32 20 3d 20 31 3b 0a ). ssl2 = 1;.
7760: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
7770: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
7780: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
7790: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 66 (NO_SSL3) && def
77a0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
77b0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
77c0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f ) && defined(NO_
77d0: 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66 69 6e TLS1_1) && defin
77e0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 ed(NO_TLS1_2) &&
77f0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
7800: 5f 33 29 0a 20 20 20 20 73 73 6c 33 20 3d 20 31 _3). ssl3 = 1
7810: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
7820: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c ined(NO_TLS1) ||
7830: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7840: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c _NO_TLS1). tl
7850: 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 s1 = 0;.#endif.#
7860: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
7870: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
7880: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
7890: 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d _1). tls1_1 =
78a0: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 0;.#endif.#if d
78b0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
78c0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
78d0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a NSSL_NO_TLS1_2).
78e0: 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a tls1_2 = 0;.
78f0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
7900: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
7910: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7920: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
7930: 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 tls1_3 = 0;.#end
7940: 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 if.. if (objc
7950: 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f < 2) {..Tcl_Wro
7960: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
7970: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
7980: 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b nel ?options?");
7990: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
79a0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 OR;. }.. c
79b0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
79c0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
79d0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
79e0: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 j(objv[1], NULL)
79f0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 , NULL);. if
7a00: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
7a10: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
7a20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7a30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
7a40: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
7a50: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
7a60: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
7a70: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
7a80: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
7a90: 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 );.. for (idx
7aa0: 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 = 2; idx < objc
7ab0: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 ; idx++) {..char
7ac0: 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 *opt = Tcl_GetS
7ad0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
7ae0: 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a v[idx], NULL);..
7af0: 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 .if (opt[0] != '
7b00: 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a -').. break;.
7b10: 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 ..OPTSTR("-cadir
7b20: 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 ", CAdir);..OPTS
7b30: 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 TR("-cafile", CA
7b40: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 file);..OPTSTR("
7b50: 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74 -certfile", cert
7b60: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 file);..OPTSTR("
7b70: 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 -cipher", cipher
7b80: 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 s);..OPTSTR("-ci
7b90: 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 29 phers", ciphers)
7ba0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 ;..OPTSTR("-ciph
7bb0: 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 65 ersuites", ciphe
7bc0: 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 rsuites);..OPTOB
7bd0: 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 J("-command", sc
7be0: 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 ript);..OPTSTR("
7bf0: 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61 -dhparams", DHpa
7c00: 72 61 6d 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 rams);..OPTSTR("
7c10: 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 -keyfile", keyfi
7c20: 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d le);..OPTSTR("-m
7c30: 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 odel", model);..
7c40: 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 OPTOBJ("-passwor
7c50: 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 d", password);..
7c60: 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 OPTBOOL("-requir
7c70: 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f e", require);..O
7c80: 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 PTBOOL("-request
7c90: 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 ", request);..OP
7ca0: 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 6c TINT("-securityl
7cb0: 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 evel", level);..
7cc0: 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 OPTBOOL("-server
7cd0: 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 ", server);..OPT
7ce0: 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 STR("-servername
7cf0: 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a ", servername);.
7d00: 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f .OPTSTR("-sessio
7d10: 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 n_id", session_i
7d20: 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c d);..OPTOBJ("-al
7d30: 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 pn", alpn);..OPT
7d40: 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 BOOL("-ssl2", ss
7d50: 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d l2);..OPTBOOL("-
7d60: 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f ssl3", ssl3);..O
7d70: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 PTBOOL("-tls1",
7d80: 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 tls1);..OPTBOOL(
7d90: 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f "-tls1.1", tls1_
7da0: 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 1);..OPTBOOL("-t
7db0: 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b ls1.2", tls1_2);
7dc0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 ..OPTBOOL("-tls1
7dd0: 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f .3", tls1_3);..O
7de0: 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 PTBYTE("-cert",
7df0: 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b cert, cert_len);
7e00: 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 ..OPTBYTE("-key"
7e10: 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b , key, key_len);
7e20: 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f ...OPTBAD("optio
7e30: 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 n", "-alpn, -cad
7e40: 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 ir, -cafile, -ce
7e50: 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d rt, -certfile, -
7e60: 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 cipher, -ciphers
7e70: 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c uites, -command,
7e80: 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 -dhparams, -key
7e90: 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 , -keyfile, -mod
7ea0: 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d el, -password, -
7eb0: 72 65 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73 require, -reques
7ec0: 74 2c 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65 t, -securityleve
7ed0: 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 l, -server, -ser
7ee0: 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f vername, -sessio
7ef0: 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 n_id, -ssl2, -ss
7f00: 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 l3, -tls1, -tls1
7f10: 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 6f 72 20 .1, -tls1.2, or
7f20: 2d 74 6c 73 31 2e 33 22 29 3b 0a 0a 09 72 65 74 -tls1.3");...ret
7f30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
7f40: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 }. if (req
7f50: 75 65 73 74 29 09 20 20 20 20 76 65 72 69 66 79 uest). verify
7f60: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 |= SSL_VERIFY_C
7f70: 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c LIENT_ONCE | SSL
7f80: 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 _VERIFY_PEER;.
7f90: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 if (request &&
7fa0: 20 72 65 71 75 69 72 65 29 20 76 65 72 69 66 79 require) verify
7fb0: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 |= SSL_VERIFY_F
7fc0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 AIL_IF_NO_PEER_C
7fd0: 45 52 54 3b 0a 20 20 20 20 69 66 20 28 76 65 72 ERT;. if (ver
7fe0: 69 66 79 20 3d 3d 20 30 29 09 76 65 72 69 66 79 ify == 0).verify
7ff0: 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f = SSL_VERIFY_NO
8000: 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c NE;.. proto |
8010: 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 = (ssl2 ? TLS_PR
8020: 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 OTO_SSL2 : 0);.
8030: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c proto |= (ssl
8040: 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 3 ? TLS_PROTO_SS
8050: 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f L3 : 0);. pro
8060: 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c to |= (tls1 ? TL
8070: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 S_PROTO_TLS1 : 0
8080: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
8090: 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 (tls1_1 ? TLS_PR
80a0: 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b OTO_TLS1_1 : 0);
80b0: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 . proto |= (t
80c0: 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 ls1_2 ? TLS_PROT
80d0: 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 O_TLS1_2 : 0);.
80e0: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 proto |= (tls
80f0: 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 1_3 ? TLS_PROTO_
8100: 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 TLS1_3 : 0);..
8110: 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 /* reset to NU
8120: 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 LL if blank stri
8130: 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 ng provided */.
8140: 20 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 if (cert && !
8150: 2a 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 *cert)..
8160: 63 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e cert. = N
8170: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 ULL;. if (key
8180: 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 && !*key)..
8190: 20 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 key.
81a0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
81b0: 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 certfile && !*ce
81c0: 72 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 rtfile)
81d0: 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b certfile.= NULL;
81e0: 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 . if (keyfile
81f0: 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 && !*keyfile)..
8200: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 keyfile.
8210: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
8220: 63 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 ciphers && !*cip
8230: 68 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 hers). ci
8240: 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 phers. =
8250: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 NULL;. if (ci
8260: 70 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a phersuites && !*
8270: 63 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 ciphersuites) ci
8280: 70 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 phersuites =
8290: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 NULL;. if (CA
82a0: 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 file && !*CAfile
82b0: 29 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 ). CAfile
82c0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
82d0: 0a 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26 . if (CAdir &
82e0: 26 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 & !*CAdir).
82f0: 20 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20 CAdir.
8300: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
8310: 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 (DHparams && !*D
8320: 48 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 Hparams).
8330: 20 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 DHparams
8340: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a = NULL;.. /*
8350: 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a new SSL state *
8360: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 /. statePtr..
8370: 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c = (State *) ckal
8380: 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 loc((unsigned) s
8390: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 izeof(State));.
83a0: 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 memset(stateP
83b0: 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 tr, 0, sizeof(St
83c0: 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 ate));.. stat
83d0: 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c ePtr->flags.= fl
83e0: 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 ags;. statePt
83f0: 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 r->interp.= inte
8400: 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 rp;. statePtr
8410: 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 ->vflags.= verif
8420: 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d y;. statePtr-
8430: 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 >err.= "";..
8440: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 /* allocate scri
8450: 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 pt */. if (sc
8460: 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 ript) {..(void)
8470: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
8480: 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 mObj(script, &le
8490: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
84a0: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 . statePtr->c
84b0: 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 allback = script
84c0: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 ;.. Tcl_IncrR
84d0: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
84e0: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a ->callback);..}.
84f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c }.. /* al
8500: 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 locate password
8510: 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 */. if (passw
8520: 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 ord) {..(void) T
8530: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
8540: 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c Obj(password, &l
8550: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b en);..if (len) {
8560: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
8570: 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 password = passw
8580: 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e ord;.. Tcl_In
8590: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
85a0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a Ptr->password);.
85b0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 .}. }.. if
85c0: 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 (model != NULL)
85d0: 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f {..int mode;../
85e0: 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c * Get the "model
85f0: 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 " context */..ch
8600: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
8610: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 nel(interp, mode
8620: 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 l, &mode);..if (
8630: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
8640: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 nnel) NULL) {..
8650: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
8660: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
8670: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
8680: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 ERROR;..}.../*..
8690: 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 * Make sure to
86a0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
86b0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 opmost channel..
86c0: 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f */..chan = Tcl_
86d0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
86e0: 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 an);..if (Tcl_Ge
86f0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
8700: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
8710: 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 lType()) {..
8720: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
8730: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
8740: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
8750: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
8760: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 an),..."\": not
8770: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 a TLS channel",
8780: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
8790: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
87a0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
87b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
87c0: 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 .}..ctx = ((Stat
87d0: 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e e *)Tcl_GetChann
87e0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 elInstanceData(c
87f0: 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 han))->ctx;.
8800: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 } else {..if ((c
8810: 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 tx = CTX_Init(st
8820: 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 atePtr, server,
8830: 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 proto, keyfile,
8840: 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 certfile, key, c
8850: 65 72 74 2c 0a 09 20 20 20 20 6b 65 79 5f 6c 65 ert,.. key_le
8860: 6e 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 n, cert_len, CAd
8870: 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 ir, CAfile, ciph
8880: 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 ers, ciphersuite
8890: 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 s, level, DHpara
88a0: 6d 73 29 29 20 3d 3d 20 28 53 53 4c 5f 43 54 58 ms)) == (SSL_CTX
88b0: 2a 29 30 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f *)0) {.. Tls_
88c0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
88d0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
88e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
88f0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 .}. }.. st
8900: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 atePtr->ctx = ct
8910: 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 x;.. /*.
8920: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b * We need to mak
8930: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 e sure that the
8940: 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e channel works in
8950: 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65 binary (for the
8960: 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69 . * encrypti
8970: 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f on not to get go
8980: 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a ofed up).. *
8990: 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f We only want to
89a0: 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66 adjust the buff
89b0: 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 ering in pre-v2
89c0: 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a channels, where.
89d0: 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e * each chan
89e0: 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b nel in the stack
89f0: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20 maintained its
8a00: 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20 own buffers..
8a10: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 */. Tcl_DSt
8a20: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
8a30: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
8a40: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 n);. Tcl_DStr
8a50: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
8a60: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a annelBlocking);.
8a70: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
8a80: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
8a90: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 lEOFChar);. T
8aa0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
8ab0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
8ac0: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 ding);. Tcl_G
8ad0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
8ae0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
8af0: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 eofchar", &upper
8b00: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
8b10: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
8b20: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
8b30: 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 , chan, "-encodi
8b40: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e ng", &upperChann
8b50: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 elEncoding);.
8b60: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
8b70: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
8b80: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f an, "-translatio
8b90: 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 n", &upperChanne
8ba0: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 lTranslation);.
8bb0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
8bc0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
8bd0: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 chan, "-blocking
8be0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
8bf0: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 Blocking);. T
8c00: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
8c10: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
8c20: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
8c30: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 , "binary");.
8c40: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
8c50: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
8c60: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c an, "-blocking",
8c70: 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 "true");. dp
8c80: 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 rintf("Consuming
8c90: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 Tcl channel %s"
8ca0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
8cb0: 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 Name(chan));.
8cc0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 statePtr->self
8cd0: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e = Tcl_StackChann
8ce0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 el(interp, Tls_C
8cf0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 hannelType(), (C
8d00: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
8d10: 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 Ptr, (TCL_READAB
8d20: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c LE | TCL_WRITABL
8d30: 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 E), chan);. d
8d40: 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 printf("Created
8d50: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 channel named %s
8d60: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
8d70: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
8d80: 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 self));. if (
8d90: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
8da0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
8db0: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 NULL) {../*.. *
8dc0: 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 No use of Tcl_Ev
8dd0: 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 entuallyFree bec
8de0: 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 ause no possible
8df0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 Tcl_Preserve...
8e00: 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 */..Tls_Free((c
8e10: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
8e20: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
8e30: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
8e40: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
8e50: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
8e60: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 tePtr->self, "-t
8e70: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c ranslation", Tcl
8e80: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
8e90: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
8ea0: 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 lation));. Tc
8eb0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
8ec0: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 on(interp, state
8ed0: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 Ptr->self, "-enc
8ee0: 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 oding", Tcl_DStr
8ef0: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 ingValue(&upperC
8f00: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 hannelEncoding))
8f10: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
8f20: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
8f30: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
8f40: 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 f, "-eofchar", T
8f50: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
8f60: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
8f70: 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f Char));. Tcl_
8f80: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
8f90: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
8fa0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b r->self, "-block
8fb0: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e ing", Tcl_DStrin
8fc0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
8fd0: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a nnelBlocking));.
8fe0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 . /*. * S
8ff0: 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f SL Initializatio
9000: 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 n. */. st
9010: 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 atePtr->ssl = SS
9020: 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e L_new(statePtr->
9030: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 ctx);. if (!s
9040: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a tatePtr->ssl) {.
9050: 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 ./* SSL library
9060: 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 error */..Tcl_Ap
9070: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
9080: 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e p, "couldn't con
9090: 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 struct ssl sessi
90a0: 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c on: ", REASON(),
90b0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
90c0: 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 ..Tls_Free((char
90d0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
90e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
90f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
9100: 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 Set host server
9110: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 name */. if (
9120: 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 69 servername) {..i
9130: 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 f (!SSL_set_tlse
9140: 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 xt_host_name(sta
9150: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 tePtr->ssl, serv
9160: 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 ername) && requi
9170: 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 re) {.. Tcl_A
9180: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
9190: 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c 53 rp, "setting TLS
91a0: 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 6e host name exten
91b0: 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 63 sion failed", (c
91c0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 har *) NULL);.
91d0: 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 Tls_Fr
91e0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
91f0: 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 ePtr);.
9200: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
9210: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 ROR;. }.
9220: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 }.. /* Res
9230: 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a ume session id *
9240: 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f /. if (sessio
9250: 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 n_id && strlen(s
9260: 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 ession_id) <= SS
9270: 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 L_MAX_SID_CTX_LE
9280: 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f NGTH) {../* SSL_
9290: 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f set_session() */
92a0: 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 ..if (!SSL_SESSI
92b0: 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 ON_set1_id_conte
92c0: 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 xt(SSL_get_sessi
92d0: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c on(statePtr->ssl
92e0: 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 ), session_id, (
92f0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 unsigned int) st
9300: 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 rlen(session_id)
9310: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
9320: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
9330: 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 p, "Resume sessi
9340: 6f 6e 20 69 64 20 22 2c 20 73 65 73 73 69 6f 6e on id ", session
9350: 5f 69 64 2c 20 22 20 66 61 69 6c 65 64 22 2c 20 _id, " failed",
9360: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
9370: 20 20 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f Tls_
9380: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
9390: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 atePtr);.
93a0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f return TCL_
93b0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
93c0: 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b . if (alpn) {
93d0: 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 ../* Convert a T
93e0: 63 6c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 cl list into a p
93f0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 rotocol-list in
9400: 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 wire-format */..
9410: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
9420: 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 rotos, *p;..unsi
9430: 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f gned int protos_
9440: 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c len = 0;..int i,
9450: 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f len, cnt;..Tcl_
9460: 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 09 69 66 20 Obj **list;..if
9470: 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 (Tcl_ListObjGetE
9480: 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 lements(interp,
9490: 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 alpn, &cnt, &lis
94a0: 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a t) != TCL_OK) {.
94b0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
94c0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
94d0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
94e0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 2f 2a 20 L_ERROR;..}../*
94f0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 Determine the me
9500: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f mory required fo
9510: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c r the protocol-l
9520: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d ist */..for (i =
9530: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 0; i < cnt; i++
9540: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 ) {.. Tcl_Get
9550: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 StringFromObj(li
9560: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 st[i], &len);..
9570: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 if (len > 255
9580: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
9590: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
95a0: 61 6c 70 6e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 alpn protocol na
95b0: 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 me too long", (c
95c0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
95d0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
95e0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 ) statePtr);...r
95f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
9600: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f .. }.. pro
9610: 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c tos_len += 1 + l
9620: 65 6e 3b 0a 09 7d 0a 09 2f 2a 20 42 75 69 6c 64 en;..}../* Build
9630: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 the complete pr
9640: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 otocol-list */..
9650: 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 protos = ckalloc
9660: 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f (protos_len);../
9670: 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 * protocol-lists
9680: 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 consist of 8-bi
9690: 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 t length-prefixe
96a0: 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 d, byte strings
96b0: 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 */..for (i = 0,
96c0: 70 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 p = protos; i <
96d0: 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 cnt; i++) {..
96e0: 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c char *str = Tcl
96f0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
9700: 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 j(list[i], &len)
9710: 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 ;.. *p++ = le
9720: 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 n;.. memcpy(p
9730: 2c 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 , str, len);..
9740: 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 09 p += len;..}..
9750: 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 /* Note: This fu
9760: 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 73 65 73 nctions reverses
9770: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 the return valu
9780: 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a e convention */.
9790: 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 .if (SSL_set_alp
97a0: 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 n_protos(statePt
97b0: 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 r->ssl, protos,
97c0: 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 protos_len)) {..
97d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
97e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61 sult(interp, "fa
97f0: 69 6c 65 64 20 74 6f 20 73 65 74 20 61 6c 70 6e iled to set alpn
9800: 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 protocols", (ch
9810: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
9820: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
9830: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
9840: 20 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f ckfree(proto
9850: 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 s);.. return
9860: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 2f TCL_ERROR;..}../
9870: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 * SSL_set_alpn_p
9880: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f rotos makes a co
9890: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 py of the protoc
98a0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 63 6b 66 72 ol-list */..ckfr
98b0: 65 65 28 70 72 6f 74 6f 73 29 3b 0a 20 20 20 20 ee(protos);.
98c0: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
98d0: 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 SSL Callbacks.
98e0: 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 */. SSL_s
98f0: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 et_app_data(stat
9900: 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 ePtr->ssl, (void
9910: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a *)statePtr);./*
9920: 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 point back to u
9930: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 s */. SSL_set
9940: 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 _verify(statePtr
9950: 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 ->ssl, verify, V
9960: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a erifyCallback);.
9970: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
9980: 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 info_callback(st
9990: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 49 6e 66 atePtr->ctx, Inf
99a0: 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 oCallback);.
99b0: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 SSL_CTX_sess_set
99c0: 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 _new_cb(statePtr
99d0: 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 ->ctx, SessionCa
99e0: 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a llback);.. /*
99f0: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e Create Tcl_Chan
9a00: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 nel BIO Handler
9a10: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
9a20: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 >p_bio.= BIO_new
9a30: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 _tcl(statePtr, B
9a40: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 IO_NOCLOSE);.
9a50: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d statePtr->bio.=
9a60: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 BIO_new(BIO_f_s
9a70: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 sl());.. if (
9a80: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 server) {../* Se
9a90: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a rver callbacks *
9aa0: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 /..SSL_CTX_set_a
9ab0: 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 lpn_select_cb(st
9ac0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 atePtr->ctx, ALP
9ad0: 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 NCallback, (void
9ae0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 *)statePtr);..S
9af0: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 SL_CTX_set_tlsex
9b00: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 t_servername_arg
9b10: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
9b20: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
9b30: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
9b40: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d tlsext_servernam
9b50: 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 e_callback(state
9b60: 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c Ptr->ctx, SNICal
9b70: 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 lback);..SSL_CTX
9b80: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c _set_client_hell
9b90: 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 o_cb(statePtr->c
9ba0: 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 tx, HelloCallbac
9bb0: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
9bc0: 50 74 72 29 3b 0a 0a 09 73 74 61 74 65 50 74 72 Ptr);...statePtr
9bd0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 ->flags |= TLS_T
9be0: 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f CL_SERVER;..SSL_
9bf0: 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 set_accept_state
9c00: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
9c10: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 53 . } else {..S
9c20: 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 SL_set_connect_s
9c30: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 tate(statePtr->s
9c40: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 sl);. }. S
9c50: 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 SL_set_bio(state
9c60: 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 Ptr->ssl, stateP
9c70: 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 tr->p_bio, state
9c80: 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 Ptr->p_bio);.
9c90: 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 BIO_set_ssl(sta
9ca0: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 tePtr->bio, stat
9cb0: 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e ePtr->ssl, BIO_N
9cc0: 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a OCLOSE);.. /*
9cd0: 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 . * End of S
9ce0: 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a SL Init. */.
9cf0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
9d00: 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f urning %s", Tcl_
9d10: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
9d20: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b tatePtr->self));
9d30: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
9d40: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 lt(interp, (char
9d50: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e *) Tcl_GetChann
9d60: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
9d70: 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 >self), TCL_VOLA
9d80: 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 TILE);.. retu
9d90: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
9da0: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
9db0: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
9dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e00: 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 -. *. * Unimport
9e10: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
9e20: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
9e30: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d s invoked to rem
9e40: 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 ove the topmost
9e50: 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a channel filter..
9e60: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
9e70: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
9e80: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
9e90: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
9ea0: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 May modify the b
9eb0: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f ehavior of an IO
9ec0: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
9ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f10: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
9f20: 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 t.UnimportObjCmd
9f30: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
9f40: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
9f50: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
9f60: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
9f70: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
9f80: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
9f90: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
9fa0: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
9fb0: 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 de on. */.. d
9fc0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
9fd0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
9fe0: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
9ff0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
a000: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
a010: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 nel");..return T
a020: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
a030: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
a040: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
a050: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
a060: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 (objv[1]), NULL)
a070: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
a080: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
a090: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
a0a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
a0b0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
a0c0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
a0d0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
a0e0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
a0f0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
a100: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 nnel(chan);..
a110: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
a120: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
a130: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
a140: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e ()) {..Tcl_Appen
a150: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
a160: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
a170: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
a180: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c Name(chan),..."\
a190: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
a1a0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 nnel", NULL);..r
a1b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
a1c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
a1d0: 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e Tcl_UnstackChann
a1e0: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 el(interp, chan)
a1f0: 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b == TCL_ERROR) {
a200: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
a210: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 OR;. }.. r
a220: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
a230: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
a240: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ntData;.}.../*.
a250: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
a260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a290: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 ----. *. * CTX_I
a2a0: 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 nit -- construct
a2b0: 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 a SSL_CTX insta
a2c0: 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 nce. *. * Result
a2d0: 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 s:. *.A valid SS
a2e0: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f L_CTX instance o
a2f0: 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 r NULL.. *. * Si
a300: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 de effects:. *.c
a310: 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f onstructs SSL co
a320: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 ntext (CTX). *.
a330: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
a340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a370: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
a380: 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e SSL_CTX *.CTX_In
a390: 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 it(State *stateP
a3a0: 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 tr, int isServer
a3b0: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 , int proto, cha
a3c0: 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 r *keyfile, char
a3d0: 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 *certfile,.
a3e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
a3f0: 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ey, unsigned cha
a400: 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 r *cert, int key
a410: 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c _len, int cert_l
a420: 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c en, char *CAdir,
a430: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c . char *CAfil
a440: 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 e, char *ciphers
a450: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 , char *ciphersu
a460: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c ites, int level,
a470: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 char *DHparams)
a480: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 {. Tcl_Inter
a490: 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 p *interp = stat
a4a0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
a4b0: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d SSL_CTX *ctx =
a4c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 NULL;. Tcl_D
a4d0: 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 String ds;. T
a4e0: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a cl_DString ds1;.
a4f0: 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b int off = 0;
a500: 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 . int load_pr
a510: 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 ivate_key;. c
a520: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 onst SSL_METHOD
a530: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 *method;.. dp
a540: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
a550: 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f .. if (!proto
a560: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
a570: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e esult(interp, "n
a580: 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c o valid protocol
a590: 20 73 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c selected", NULL
a5a0: 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f );..return (SSL_
a5b0: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a CTX *)0;. }..
a5c0: 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 /* create SS
a5d0: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 L context */.#if
a5e0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
a5f0: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 _NUMBER >= 0x101
a600: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 00000L || define
a610: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 d(NO_SSL2) || de
a620: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
a630: 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 _SSL2). if (E
a640: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
a650: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b S_PROTO_SSL2)) {
a660: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
a670: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 lt(interp, "SSL2
a680: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
a690: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
a6a0: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
a6b0: 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e X *)0;. }.#en
a6c0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
a6d0: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 NO_SSL3) || defi
a6e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
a6f0: 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 SL3). if (ENA
a700: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
a710: 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 PROTO_SSL3)) {..
a720: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
a730: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 (interp, "SSL3 p
a740: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
a750: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
a760: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
a770: 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 *)0;. }.#endi
a780: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
a790: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 _TLS1) || define
a7a0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
a7b0: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 1). if (ENABL
a7c0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
a7d0: 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 OTO_TLS1)) {..Tc
a7e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
a7f0: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 nterp, "TLS 1.0
a800: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
a810: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
a820: 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 .return (SSL_CTX
a830: 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 *)0;. }.#end
a840: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
a850: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 O_TLS1_1) || def
a860: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
a870: 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 TLS1_1). if (
a880: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
a890: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 LS_PROTO_TLS1_1)
a8a0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
a8b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 esult(interp, "T
a8c0: 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 LS 1.1 protocol
a8d0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
a8e0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 NULL);..return (
a8f0: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 SSL_CTX *)0;.
a900: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
a910: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
a920: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
a930: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 SSL_NO_TLS1_2).
a940: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
a950: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
a960: 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f TLS1_2)) {..Tcl_
a970: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
a980: 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 erp, "TLS 1.2 pr
a990: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
a9a0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 rted", NULL);..r
a9b0: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
a9c0: 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 )0;. }.#endif
a9d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
a9e0: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e TLS1_3) || defin
a9f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
aa00: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e S1_3). if (EN
aa10: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
aa20: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 _PROTO_TLS1_3))
aa30: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
aa40: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
aa50: 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.3 protocol no
aa60: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
aa70: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 LL);..return (SS
aa80: 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d L_CTX *)0;. }
aa90: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 77 69 .#endif.. swi
aaa0: 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 tch (proto) {.#i
aab0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
aac0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
aad0: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 00000L && !defin
aae0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 ed(NO_SSL2) && !
aaf0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
ab00: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 NO_SSL2). cas
ab10: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 e TLS_PROTO_SSL2
ab20: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 :..method = SSLv
ab30: 32 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 2_method();..bre
ab40: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
ab50: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
ab60: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
ab70: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 NSSL_NO_SSL3) &&
ab80: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
ab90: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 L_NO_SSL3_METHOD
aba0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
abb0: 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 ROTO_SSL3:..meth
abc0: 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f od = SSLv3_metho
abd0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
abe0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
abf0: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 (NO_TLS1) && !de
ac00: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
ac10: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
ac20: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
ac30: 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 S1_METHOD). c
ac40: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
ac50: 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c S1:..method = TL
ac60: 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 Sv1_method();..b
ac70: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
ac80: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
ac90: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
aca0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
acb0: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
acc0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
acd0: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 1_METHOD). ca
ace0: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
acf0: 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 1_1:..method = T
ad00: 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b LSv1_1_method();
ad10: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
ad20: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
ad30: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
ad40: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
ad50: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
ad60: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
ad70: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_2_METHOD).
ad80: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
ad90: 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 TLS1_2:..method
ada0: 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 = TLSv1_2_method
adb0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
adc0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
add0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
ade0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
adf0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 O_TLS1_3). ca
ae00: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
ae10: 31 5f 33 3a 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 1_3:../*.. * The
ae20: 20 76 65 72 73 69 6f 6e 20 72 61 6e 67 65 20 69 version range i
ae30: 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 65 s constrained be
ae40: 6c 6f 77 2c 0a 09 20 2a 20 61 66 74 65 72 20 74 low,.. * after t
ae50: 68 65 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 he context is cr
ae60: 65 61 74 65 64 2e 20 20 55 73 65 20 74 68 65 0a eated. Use the.
ae70: 09 20 2a 20 67 65 6e 65 72 69 63 20 6d 65 74 68 . * generic meth
ae80: 6f 64 20 68 65 72 65 2e 0a 09 20 2a 2f 0a 09 6d od here... */..m
ae90: 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 ethod = TLS_meth
aea0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
aeb0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 ndif. default
aec0: 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 :../* Negotiate
aed0: 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c highest availabl
aee0: 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f e SSL/TLS versio
aef0: 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 54 n */..method = T
af00: 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 LS_method();.#if
af10: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
af20: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
af30: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 0000L && !define
af40: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 d(NO_SSL2) && !d
af50: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
af60: 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 O_SSL2)..off |=
af70: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
af80: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 TLS_PROTO_SSL2)
af90: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ? 0 : SSL_OP_N
afa0: 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 O_SSLv2);.#endif
afb0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
afc0: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
afd0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
afe0: 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 L3)..off |= (ENA
aff0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
b000: 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 PROTO_SSL3) ?
b010: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 0 : SSL_OP_NO_SS
b020: 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 Lv3);.#endif.#if
b030: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
b040: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
b050: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a PENSSL_NO_TLS1).
b060: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
b070: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
b080: 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 O_TLS1) ? 0 :
b090: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 SSL_OP_NO_TLSv1)
b0a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
b0b0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
b0c0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
b0d0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a NSSL_NO_TLS1_1).
b0e0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
b0f0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
b100: 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 O_TLS1_1) ? 0 :
b110: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f SSL_OP_NO_TLSv1_
b120: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 1);.#endif.#if !
b130: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
b140: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
b150: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
b160: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
b170: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
b180: 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 OTO_TLS1_2) ? 0
b190: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
b1a0: 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 1_2);.#endif.#if
b1b0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
b1c0: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
b1d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
b1e0: 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 _3)..off |= (ENA
b1f0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
b200: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 PROTO_TLS1_3) ?
b210: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 0 : SSL_OP_NO_TL
b220: 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 Sv1_3);.#endif..
b230: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 break;. }..
b240: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ctx = SSL_CTX_
b250: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 0a 20 20 new(method);..
b260: 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 if (!ctx) {..r
b270: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 eturn(NULL);.
b280: 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 }.. if (gete
b290: 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 nv(SSLKEYLOGFILE
b2a0: 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 )) {..SSL_CTX_se
b2b0: 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 t_keylog_callbac
b2c0: 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c k(ctx, KeyLogCal
b2d0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 lback);. }..#
b2e0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
b2f0: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
b300: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
b310: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 S1_3). if (pr
b320: 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f oto == TLS_PROTO
b330: 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f _TLS1_3) {..SSL_
b340: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 CTX_set_min_prot
b350: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 o_version(ctx, T
b360: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a LS1_3_VERSION);.
b370: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 .SSL_CTX_set_max
b380: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
b390: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
b3a0: 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ON);. }.#endi
b3b0: 66 0a 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 f.. if (!isSe
b3c0: 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 rver) {..SSL_CTX
b3d0: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 _set_options(ctx
b3e0: 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f , SSL_OP_CIPHER_
b3f0: 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 SERVER_PREFERENC
b400: 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53 E);. }.. S
b410: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 SL_CTX_set_app_d
b420: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 ata(ctx, (void*)
b430: 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 interp);./* reme
b440: 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 mber the interpr
b450: 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f eter */. SSL_
b460: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
b470: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 ctx, SSL_OP_ALL)
b480: 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 ;./* all SSL bug
b490: 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a workarounds */.
b4a0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
b4b0: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 options(ctx, off
b4c0: 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 );../* disable p
b4d0: 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 rotocol versions
b4e0: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f */.#if OPENSSL_
b4f0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
b500: 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20 0x10101000L.
b510: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 SSL_CTX_set_mod
b520: 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f e(ctx, SSL_MODE_
b530: 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 AUTO_RETRY);./*
b540: 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 handle new hands
b550: 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 6f hakes in backgro
b560: 75 6e 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 und */.#endif.
b570: 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 SSL_CTX_sess_s
b580: 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 et_cache_size(ct
b590: 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a x, 128);.. /*
b5a0: 20 53 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 Set user define
b5b0: 64 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 d ciphers, ciphe
b5c0: 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 r suites, and se
b5d0: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a curity level */.
b5e0: 20 20 20 20 69 66 20 28 28 28 63 69 70 68 65 72 if (((cipher
b5f0: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 s != NULL) && !S
b600: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 SL_CTX_set_ciphe
b610: 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68 r_list(ctx, ciph
b620: 65 72 73 29 29 20 7c 7c 20 5c 0a 09 28 28 63 69 ers)) || \..((ci
b630: 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 phersuites != NU
b640: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f LL) && !SSL_CTX_
b650: 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 set_ciphersuites
b660: 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 (ctx, ciphersuit
b670: 65 73 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c es))) {.. Tcl
b680: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
b690: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 terp, "Set ciphe
b6a0: 72 73 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 rs failed", (cha
b6b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
b6c0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
b6d0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
b6e0: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 (SSL_CTX *)0;.
b6f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 }.. /* Set
b700: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a security level *
b710: 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 /. if (level
b720: 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 > -1 && level <
b730: 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 6) {../* SSL_set
b740: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 _security_level
b750: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f */..SSL_CTX_set_
b760: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 security_level(c
b770: 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 tx, level);.
b780: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f }.. /* set so
b790: 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a me callbacks */.
b7a0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
b7b0: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 default_passwd_c
b7c0: 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 b(ctx, PasswordC
b7d0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 allback);. SS
b7e0: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c L_CTX_set_defaul
b7f0: 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 t_passwd_cb_user
b800: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 data(ctx, (void
b810: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 *)statePtr);..
b820: 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 /* read a Diff
b830: 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d ie-Hellman param
b840: 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 eters file, or u
b850: 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 se the built-in
b860: 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 one */.#ifdef OP
b870: 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 ENSSL_NO_DH.
b880: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 if (DHparams !=
b890: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
b8a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
b8b0: 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 , "DH parameter
b8c0: 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 support not avai
b8d0: 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 lable", (char *)
b8e0: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
b8f0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
b900: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
b910: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 ;. }.#else.
b920: 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 {..DH* dh;..if
b930: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 (DHparams != NU
b940: 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a LL) {.. BIO *
b950: 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 bio;.. Tcl_DS
b960: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a tringInit(&ds);.
b970: 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e . bio = BIO_n
b980: 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 ew_file(F2N(DHpa
b990: 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 rams, &ds), "r")
b9a0: 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 ;.. if (!bio)
b9b0: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 {...Tcl_DString
b9c0: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c Free(&ds);...Tcl
b9d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
b9e0: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 terp, "Could not
b9f0: 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 find DH paramet
ba00: 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 ers file", (char
ba10: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
ba20: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
ba30: 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
ba40: 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 0a 09 X *)0;.. }...
ba50: 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 dh = PEM_rea
ba60: 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 d_bio_DHparams(b
ba70: 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 io, NULL, NULL,
ba80: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f NULL);.. BIO_
ba90: 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 free(bio);..
baa0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
bab0: 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 &ds);.. if (!
bac0: 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 dh) {...Tcl_Appe
bad0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
bae0: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 "Could not read
baf0: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 DH parameters f
bb00: 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 rom file", (char
bb10: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
bb20: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
bb30: 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
bb40: 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 7d X *)0;.. }..}
bb50: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 68 20 else {.. dh
bb60: 3d 20 67 65 74 5f 64 68 50 61 72 61 6d 73 28 29 = get_dhParams()
bb70: 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 ;..}..SSL_CTX_se
bb80: 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 t_tmp_dh(ctx, dh
bb90: 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 29 3b );..DH_free(dh);
bba0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 . }.#endif..
bbb0: 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 /* set our ce
bbc0: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 rtificate */.
bbd0: 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 load_private_ke
bbe0: 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 y = 0;. if (c
bbf0: 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 ertfile != NULL)
bc00: 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 {..load_private
bc10: 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f _key = 1;...Tcl_
bc20: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
bc30: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f ;...if (SSL_CTX_
bc40: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f use_certificate_
bc50: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 file(ctx, F2N(ce
bc60: 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 rtfile, &ds), SS
bc70: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 L_FILETYPE_PEM)
bc80: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c <= 0) {.. Tcl
bc90: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
bca0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 );.. Tcl_Appe
bcb0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
bcc0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
bcd0: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 certificate file
bce0: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a ", certfile, ":
bcf0: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 ",.... REAS
bd00: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
bd10: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
bd20: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
bd30: 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 return (SSL_C
bd40: 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 7d TX *)0;..}. }
bd50: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 else if (cert !
bd60: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f = NULL) {..load_
bd70: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b private_key = 1;
bd80: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 ..if (SSL_CTX_us
bd90: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 e_certificate_AS
bda0: 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e N1(ctx, cert_len
bdb0: 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a , cert) <= 0) {.
bdc0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
bdd0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
bde0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
bdf0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
be00: 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 to set certific
be10: 61 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 ate: ",....
be20: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
be30: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
be40: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
be50: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 ;.. return (S
be60: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 SL_CTX *)0;..}.
be70: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 } else {..cer
be80: 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 tfile = (char*)X
be90: 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 509_get_default_
bea0: 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 cert_file();...i
beb0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
bec0: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 ertificate_file(
bed0: 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 ctx, certfile, S
bee0: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 SL_FILETYPE_PEM)
bef0: 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 <= 0) {.#if 0..
bf00: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
bf10: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 ree(&ds);.. T
bf20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
bf30: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
bf40: 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 to use default c
bf50: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 ertificate file
bf60: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 ", certfile, ":
bf70: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f ",.... REASO
bf80: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
bf90: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
bfa0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
bfb0: 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 return (SSL_CT
bfc0: 58 20 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 09 7d X *)0;.#endif..}
bfd0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 . }.. /* s
bfe0: 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b et our private k
bff0: 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f ey */. if (lo
c000: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 ad_private_key)
c010: 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d {..if (keyfile =
c020: 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d = NULL && key ==
c030: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 NULL) {.. ke
c040: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 yfile = certfile
c050: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 ;..}...if (keyfi
c060: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 le != NULL) {..
c070: 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 /* get the pr
c080: 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 ivate key associ
c090: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 ated with this c
c0a0: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 ertificate */..
c0b0: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d if (keyfile =
c0c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 = NULL) {...keyf
c0d0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a ile = certfile;.
c0e0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
c0f0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 (SSL_CTX_use_Pri
c100: 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 vateKey_file(ctx
c110: 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 , F2N(keyfile, &
c120: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ds), SSL_FILETYP
c130: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 E_PEM) <= 0) {..
c140: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
c150: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 (&ds);.../* flus
c160: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 h the passphrase
c170: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 which might be
c180: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 left in the resu
c190: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 lt */...Tcl_SetR
c1a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 esult(interp, NU
c1b0: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b LL, TCL_STATIC);
c1c0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
c1d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
c1e0: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 ble to set publi
c1f0: 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 c key file ", ke
c200: 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 yfile, " ",....
c210: 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 REASON()
c220: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
c230: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
c240: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
c250: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20 (SSL_CTX *)0;..
c260: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
c270: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
c280: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 ..} else if (key
c290: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
c2a0: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 if (SSL_CTX_use
c2b0: 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 _PrivateKey_ASN1
c2c0: 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 (EVP_PKEY_RSA, c
c2d0: 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 tx, key,key_len)
c2e0: 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 <= 0) {...Tcl_D
c2f0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
c300: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 .../* flush the
c310: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 passphrase which
c320: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 might be left i
c330: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a n the result */.
c340: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 ..Tcl_SetResult(
c350: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 interp, NULL, TC
c360: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c L_STATIC);...Tcl
c370: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
c380: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
c390: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a set public key:
c3a0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 ", REASON(), (c
c3b0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
c3c0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
c3d0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 53 53 4c );...return (SSL
c3e0: 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d _CTX *)0;.. }
c3f0: 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b ..}../* Now we k
c400: 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 now that a key a
c410: 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 nd cert have bee
c420: 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 n set against..
c430: 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 * the SSL contex
c440: 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 t */..if (!SSL_C
c450: 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 TX_check_private
c460: 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 _key(ctx)) {..
c470: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
c480: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 lt(interp, "priv
c490: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 ate key does not
c4a0: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 match the certi
c4b0: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 ficate public ke
c4c0: 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 y",.... (cha
c4d0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
c4e0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
c4f0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
c500: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d (SSL_CTX *)0;..}
c510: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
c520: 65 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 et verification
c530: 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 CAs */. Tcl_D
c540: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b StringInit(&ds);
c550: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
c560: 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20 Init(&ds1);.
c570: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 if (!SSL_CTX_loa
c580: 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f d_verify_locatio
c590: 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 ns(ctx, F2N(CAfi
c5a0: 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 le, &ds), F2N(CA
c5b0: 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 dir, &ds1)) ||..
c5c0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 !SSL_CTX_set_def
c5d0: 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 ault_verify_path
c5e0: 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a s(ctx)) {.#if 0.
c5f0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
c600: 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 (&ds);..Tcl_DStr
c610: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 ingFree(&ds1);..
c620: 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 /* Don't current
c630: 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20 ly care if this
c640: 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 fails */..Tcl_Ap
c650: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
c660: 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 p, "SSL default
c670: 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c verify paths: ",
c680: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
c690: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f *) NULL);..SSL_
c6a0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
c6b0: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
c6c0: 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 *)0;.#endif.
c6d0: 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a }.. /* https:
c6e0: 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 //sourceforge.ne
c6f0: 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f t/p/tls/bugs/57/
c700: 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 */. /* XXX:T
c710: 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 ODO: Let the use
c720: 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 r supply values
c730: 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 here instead of
c740: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 something that e
c750: 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c xists on the fil
c760: 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 esystem */. i
c770: 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c f (CAfile != NUL
c780: 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 L) {..STACK_OF(X
c790: 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 509_NAME) *certN
c7a0: 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f ames = SSL_load_
c7b0: 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 client_CA_file(F
c7c0: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 2N(CAfile, &ds))
c7d0: 3b 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 ;..if (certNames
c7e0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
c7f0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 SSL_CTX_set_cli
c800: 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c ent_CA_list(ctx,
c810: 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a certNames);..}.
c820: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 }.. Tcl_D
c830: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
c840: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
c850: 46 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 Free(&ds1);.
c860: 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a return ctx;.}...
c870: 2f 2a 0a 20 2a 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 2d 2d 0a 20 2a 0a 20 2a 20 53 --------. *. * S
c8c0: 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 tatusObjCmd -- r
c8d0: 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 eturn certificat
c8e0: 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 e for connected
c8f0: 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 peer.. *. * Resu
c900: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
c910: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
c920: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
c930: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
c940: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
c950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c980: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
c990: 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 int.StatusObjCmd
c9a0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
c9b0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
c9c0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
c9d0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
c9e0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
c9f0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
ca00: 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 tr;. X509 *pe
ca10: 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 er;. Tcl_Obj
ca20: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c *objPtr;. Tcl
ca30: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 _Channel chan;.
ca40: 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c char *channel
ca50: 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a Name, *ciphers;.
ca60: 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 int mode;.
ca70: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
ca80: 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 char *proto;.
ca90: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c unsigned int l
caa0: 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 en;.. dprintf
cab0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
cac0: 20 73 77 69 74 63 68 20 28 6f 62 6a 63 29 20 7b switch (objc) {
cad0: 0a 09 63 61 73 65 20 32 3a 0a 09 20 20 20 20 63 ..case 2:.. c
cae0: 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c hannelName = Tcl
caf0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
cb00: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 j(objv[1], NULL)
cb10: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ;.. break;...
cb20: 63 61 73 65 20 33 3a 0a 09 20 20 20 20 69 66 20 case 3:.. if
cb30: 28 21 73 74 72 63 6d 70 20 28 54 63 6c 5f 47 65 (!strcmp (Tcl_Ge
cb40: 74 53 74 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d tString (objv[1]
cb50: 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a ), "-local")) {.
cb60: 09 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 ..channelName =
cb70: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
cb80: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 mObj(objv[2], NU
cb90: 4c 4c 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 LL);...break;..
cba0: 20 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73 }.. /* els
cbb0: 65 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2e e fall-through .
cbc0: 2e 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 .. */.#if define
cbd0: 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 20 20 20 d(__GNUC__)..
cbe0: 20 5f 5f 61 74 74 72 69 62 75 74 65 5f 5f 28 28 __attribute__((
cbf0: 66 61 6c 6c 74 68 72 6f 75 67 68 29 29 3b 0a 23 fallthrough));.#
cc00: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a endif..default:.
cc10: 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 . Tcl_WrongNu
cc20: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
cc30: 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f objv, "?-local?
cc40: 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 channel");..
cc50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
cc60: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 R;. }.. ch
cc70: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
cc80: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e nel(interp, chan
cc90: 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b nelName, &mode);
cca0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
ccb0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
ccc0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
ccd0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
cce0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
ccf0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
cd00: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
cd10: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
cd20: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
cd30: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 el(chan);. if
cd40: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
cd50: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
cd60: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
cd70: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
cd80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
cd90: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
cda0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
cdb0: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 e(chan),..."\":
cdc0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
cdd0: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 l", NULL);..retu
cde0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
cdf0: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 }. statePtr
ce00: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c = (State *) Tcl
ce10: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
ce20: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 nceData(chan);.
ce30: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 if (objc == 2
ce40: 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f ) {..peer = SSL_
ce50: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 get_peer_certifi
ce60: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 cate(statePtr->s
ce70: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 sl);. } else
ce80: 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 {..peer = SSL_ge
ce90: 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 t_certificate(st
cea0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
ceb0: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 65 65 72 }. if (peer
cec0: 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c ) {..objPtr = Tl
ced0: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 s_NewX509Obj(int
cee0: 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 erp, peer);..if
cef0: 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 20 58 35 (objc == 2) { X5
cf00: 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 20 7d 09_free(peer); }
cf10: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f . } else {..o
cf20: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
cf30: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
cf40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
cf50: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
cf60: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
cf70: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
cf80: 6e 67 4f 62 6a 28 22 73 62 69 74 73 22 2c 20 2d ngObj("sbits", -
cf90: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
cfa0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
cfb0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
cfc0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
cfd0: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 SSL_get_cipher_b
cfe0: 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 its(statePtr->ss
cff0: 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 l, NULL)));..
d000: 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 ciphers = (char
d010: 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 *)SSL_get_cipher
d020: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
d030: 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 . if ((cipher
d040: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 28 73 s != NULL) && (s
d050: 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c 20 22 trcmp(ciphers, "
d060: 28 4e 4f 4e 45 29 22 29 20 21 3d 20 30 29 29 20 (NONE)") != 0))
d070: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
d080: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
d090: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
d0a0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 NewStringObj("ci
d0b0: 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 pher", -1));..Tc
d0c0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
d0d0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
d0e0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
d0f0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f ringObj(SSL_get_
d100: 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d cipher(statePtr-
d110: 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 >ssl), -1));.
d120: 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 }.. /* Verif
d130: 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 y the X509 certi
d140: 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 ficate presented
d150: 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a by the peer */.
d160: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
d170: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
d180: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
d190: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 _NewStringObj("v
d1a0: 61 6c 69 64 61 74 69 6f 6e 22 2c 20 2d 31 29 29 alidation", -1))
d1b0: 3b 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 67 65 ;. if (SSL_ge
d1c0: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 t_verify_result(
d1d0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 21 statePtr->ssl) !
d1e0: 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 = X509_V_OK) {..
d1f0: 2f 2a 20 70 72 6f 74 6f 20 3d 20 22 66 61 69 6c /* proto = "fail
d200: 65 64 22 3b 20 2a 2f 0a 09 70 72 6f 74 6f 20 3d ed"; */..proto =
d210: 20 52 45 41 53 4f 4e 28 29 3b 0a 20 20 20 20 7d REASON();. }
d220: 20 65 6c 73 65 20 7b 0a 09 70 72 6f 74 6f 20 3d else {..proto =
d230: 20 22 6f 6b 22 3b 0a 20 20 20 20 7d 0a 20 20 20 "ok";. }.
d240: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
d250: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
d260: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
d270: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
d280: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 , -1));.. /*
d290: 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 Report the selec
d2a0: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 ted protocol as
d2b0: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 a result of the
d2c0: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 negotiation */.
d2d0: 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e SSL_get0_alpn
d2e0: 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 _selected(stateP
d2f0: 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c tr->ssl, &proto,
d300: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f &len);. Tcl_
d310: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
d320: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
d330: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
d340: 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 ngObj("alpn", -1
d350: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
d360: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
d370: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
d380: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
d390: 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c j((char *)proto,
d3a0: 20 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 20 20 20 (int)len));.
d3b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
d3c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
d3d0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
d3e0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 73 wStringObj("vers
d3f0: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ion", -1));.
d400: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
d410: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
d420: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
d430: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 StringObj(SSL_ge
d440: 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 t_version(stateP
d450: 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a tr->ssl), -1));.
d460: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
d470: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
d480: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
d490: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e n TCL_OK;..clien
d4a0: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
d4b0: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ta;.}.../*. *---
d4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d500: 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f . *. * Connectio
d510: 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 nInfoObjCmd -- r
d520: 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e eturn connection
d530: 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 info from OpenS
d540: 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 SL.. *. * Result
d550: 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 s:. *.A list of
d560: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a connection info.
d570: 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *----------
d580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
d5c0: 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 tatic int Connec
d5d0: 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 tionInfoObjCmd(C
d5e0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
d5f0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
d600: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
d610: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
d620: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
d630: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
d640: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
d650: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
d660: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 on. */. Stat
d670: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a e *statePtr;../*
d680: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f client state fo
d690: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a r ssl socket */.
d6a0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
d6b0: 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 Ptr;. const S
d6c0: 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e SL *ssl;. con
d6d0: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 st SSL_CIPHER *c
d6e0: 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 ipher;. const
d6f0: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 SSL_SESSION *se
d700: 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 ssion;. const
d710: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
d720: 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 proto;. unsig
d730: 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 ned int len;.
d740: 20 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20 long mode;..
d750: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 if (objc != 2)
d760: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
d770: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
d780: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b bjv, "channel");
d790: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
d7a0: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
d7b0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
d7c0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 annel(interp, Tc
d7d0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
d7e0: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c bj(objv[1], NULL
d7f0: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 ), NULL);. if
d800: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
d810: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
d820: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
d830: 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f R);. }.. /
d840: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
d850: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
d860: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
d870: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
d880: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
d890: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c an);. if (Tcl
d8a0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
d8b0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
d8c0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
d8d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d8e0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
d8f0: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
d900: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
d910: 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 n), "\": not a T
d920: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
d930: 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f L);..return(TCL_
d940: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 ERROR);. }..
d950: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
d960: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
d970: 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e LL);.. /* Con
d980: 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a nection info */.
d990: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
d9a0: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
d9b0: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
d9c0: 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 ta(chan);. ss
d9d0: 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 l = statePtr->ss
d9e0: 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 l;. if (ssl !
d9f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 = NULL) {..const
da00: 20 63 68 61 72 20 2a 73 74 61 74 65 3b 0a 0a 09 char *state;...
da10: 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 /* connection st
da20: 61 74 65 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f ate */..if (SSL_
da30: 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 is_init_finished
da40: 28 73 73 6c 29 29 20 7b 0a 09 20 20 20 20 73 74 (ssl)) {.. st
da50: 61 74 65 20 3d 20 22 65 73 74 61 62 6c 69 73 68 ate = "establish
da60: 65 64 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 ed";..} else if
da70: 28 53 53 4c 5f 69 6e 5f 69 6e 69 74 28 73 73 6c (SSL_in_init(ssl
da80: 29 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 )) {.. state
da90: 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 = "handshake";..
daa0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 73 74 } else {.. st
dab0: 61 74 65 20 3d 20 22 69 6e 69 74 69 61 6c 69 7a ate = "initializ
dac0: 69 6e 67 22 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 ing";..}..Tcl_Li
dad0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
dae0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
daf0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
db00: 4f 62 6a 28 22 73 74 61 74 65 22 2c 20 2d 31 29 Obj("state", -1)
db10: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
db20: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
db30: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
db40: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 74 _NewStringObj(st
db50: 61 74 65 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 ate, -1));.../*
db60: 47 65 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 Get server name
db70: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
db80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
db90: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
dba0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
dbb0: 65 72 76 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29 ervername", -1))
dbc0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
dbd0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
dbe0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
dbf0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c NewStringObj(SSL
dc00: 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 _get_servername(
dc10: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 ssl, TLSEXT_NAME
dc20: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c TYPE_host_name),
dc30: 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 -1));.../* Get
dc40: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 54 63 6c protocol */..Tcl
dc50: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
dc60: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
dc70: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
dc80: 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f 6c ingObj("protocol
dc90: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
dca0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
dcb0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
dcc0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
dcd0: 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 Obj(SSL_get_vers
dce0: 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a ion(ssl), -1));.
dcf0: 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 ../* Renegotiati
dd00: 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 54 on allowed */..T
dd10: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
dd20: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
dd30: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
dd40: 74 72 69 6e 67 4f 62 6a 28 22 72 65 6e 65 67 6f tringObj("renego
dd50: 74 69 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a tiation", -1));.
dd60: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
dd70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
dd80: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
dd90: 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 20 20 20 wStringObj(..
dda0: 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f SSL_get_secure_
ddb0: 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 renegotiation_su
ddc0: 70 70 6f 72 74 28 73 73 6c 29 20 3f 20 22 61 6c pport(ssl) ? "al
ddd0: 6c 6f 77 65 64 22 20 3a 20 22 6e 6f 74 20 73 75 lowed" : "not su
dde0: 70 70 6f 72 74 65 64 22 2c 20 2d 31 29 29 3b 0a pported", -1));.
ddf0: 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 ../* Report the
de00: 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f selected protoco
de10: 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 l as a result of
de20: 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 the ALPN negoti
de30: 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 67 65 ation */..SSL_ge
de40: 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 t0_alpn_selected
de50: 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c (ssl, &proto, &l
de60: 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 en);..Tcl_ListOb
de70: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
de80: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
de90: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
dea0: 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 "alpn", -1));..T
deb0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
dec0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
ded0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
dee0: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a tringObj((char *
def0: 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 6c 65 6e )proto, (int)len
df00: 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 ));.../* Get sec
df10: 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 urity level */..
df20: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
df30: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
df40: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
df50: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 75 72 StringObj("secur
df60: 69 74 79 6c 65 76 65 6c 22 2c 20 2d 31 29 29 3b itylevel", -1));
df70: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
df80: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
df90: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
dfa0: 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 ewIntObj(SSL_get
dfb0: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 _security_level(
dfc0: 73 73 6c 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 ssl)));. }..
dfd0: 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 /* Cipher inf
dfe0: 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 o */. cipher
dff0: 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e = SSL_get_curren
e000: 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 t_cipher(ssl);.
e010: 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d if (cipher !=
e020: 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 NULL) {..char b
e030: 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d uf[BUFSIZ] = {0}
e040: 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 ;..int bits, alg
e050: 5f 62 69 74 73 3b 0a 0a 09 54 63 6c 5f 4c 69 73 _bits;...Tcl_Lis
e060: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
e070: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
e080: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
e090: 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29 bj("cipher", -1)
e0a0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
e0b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
e0c0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
e0d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
e0e0: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d L_CIPHER_get_nam
e0f0: 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b e(cipher), -1));
e100: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
e110: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
e120: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
e130: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 ewStringObj("sta
e140: 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 2d 31 29 ndard_name", -1)
e150: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
e160: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
e170: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
e180: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
e190: 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 L_CIPHER_standar
e1a0: 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 d_name(cipher),
e1b0: 2d 31 29 29 3b 0a 0a 09 62 69 74 73 20 3d 20 53 -1));...bits = S
e1c0: 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 SL_CIPHER_get_bi
e1d0: 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f ts(cipher, &alg_
e1e0: 62 69 74 73 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 bits);..Tcl_List
e1f0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
e200: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
e210: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
e220: 6a 28 22 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a j("bits", -1));.
e230: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
e240: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
e250: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
e260: 77 49 6e 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a wIntObj(bits));.
e270: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
e280: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
e290: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
e2a0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 72 wStringObj("secr
e2b0: 65 74 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a et_bits", -1));.
e2c0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
e2d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
e2e0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
e2f0: 77 49 6e 74 4f 62 6a 28 61 6c 67 5f 62 69 74 73 wIntObj(alg_bits
e300: 29 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 ));../* alg_bits
e310: 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 is actual key s
e320: 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 ecret bits. If u
e330: 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 se bits and secr
e340: 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 et (algorithm) b
e350: 69 74 73 20 64 69 66 66 65 72 2c 0a 20 20 20 20 its differ,.
e360: 20 20 20 20 20 20 20 74 68 65 20 72 65 73 74 20 the rest
e370: 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20 of the bits are
e380: 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 fixed, i.e. for
e390: 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 limited export c
e3a0: 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 iphers (bits < 5
e3b0: 36 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 6) */..Tcl_ListO
e3c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e3d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e3e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e3f0: 28 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 ("min_version",
e400: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
e410: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e420: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e430: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e440: 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f (SSL_CIPHER_get_
e450: 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c version(cipher),
e460: 20 2d 31 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c -1));...if (SSL
e470: 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 _CIPHER_descript
e480: 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c ion(cipher, buf,
e490: 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d sizeof(buf)) !=
e4a0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 NULL) {.. Tc
e4b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
e4c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
e4d0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
e4e0: 72 69 6e 67 4f 62 6a 28 22 64 65 73 63 72 69 70 ringObj("descrip
e4f0: 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20 tion", -1));..
e500: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
e510: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
e520: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
e530: 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c ewStringObj(buf,
e540: 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a -1));..}. }.
e550: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 . /* Session
e560: 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 info */. sess
e570: 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 ion = SSL_get_se
e580: 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 ssion(ssl);.
e590: 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e if (session != N
e5a0: 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e ULL) {..const un
e5b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 signed char *tic
e5c0: 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e ket;..size_t len
e5d0: 32 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 2;..const unsign
e5e0: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
e5f0: 5f 69 64 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f _id;.../* Sessio
e600: 6e 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c n info */..Tcl_L
e610: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
e620: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
e630: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
e640: 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 72 65 gObj("session_re
e650: 75 73 65 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 used", -1));..Tc
e660: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
e670: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
e680: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e bjPtr, Tcl_NewIn
e690: 74 4f 62 6a 28 53 53 4c 5f 73 65 73 73 69 6f 6e tObj(SSL_session
e6a0: 5f 72 65 75 73 65 64 28 73 73 6c 29 29 29 3b 0a _reused(ssl)));.
e6b0: 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 ../* Session id
e6c0: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
e6d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
e6e0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
e6f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
e700: 65 73 73 69 6f 6e 5f 69 64 22 2c 20 2d 31 29 29 ession_id", -1))
e710: 3b 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 ;..session_id =
e720: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
e730: 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 _id_context(sess
e740: 69 6f 6e 2c 20 26 6c 65 6e 29 3b 0a 09 54 63 6c ion, &len);..Tcl
e750: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
e760: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
e770: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
e780: 69 6e 67 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 ingObj(session_i
e790: 64 2c 20 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 0a d, (int)len));..
e7a0: 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b ./* Session tick
e7b0: 65 74 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 et */..SSL_SESSI
e7c0: 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 ON_get0_ticket(s
e7d0: 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c ession, &ticket,
e7e0: 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 &len2);..Tcl_Li
e7f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
e800: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
e810: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
e820: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 74 69 63 Obj("session_tic
e830: 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ket", -1));..Tcl
e840: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
e850: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
e860: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
e870: 69 6e 67 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 ingObj(ticket, (
e880: 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f int) len2));.../
e890: 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 * Resumable sess
e8a0: 69 6f 6e 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 ion */..Tcl_List
e8b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
e8c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
e8d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
e8e0: 6a 28 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 2d j("resumable", -
e8f0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
e900: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
e910: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
e920: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c cl_NewIntObj(SSL
e930: 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 _SESSION_is_resu
e940: 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 29 mable(session)))
e950: 3b 0a 0a 09 2f 2a 20 53 74 61 72 74 20 74 69 6d ;.../* Start tim
e960: 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 e */..Tcl_ListOb
e970: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
e980: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
e990: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
e9a0: 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 2d 31 "start_time", -1
e9b0: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
e9c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
e9d0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
e9e0: 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c l_NewLongObj(SSL
e9f0: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d _SESSION_get_tim
ea00: 65 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 e(session)));...
ea10: 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 /* Timeout value
ea20: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
ea30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
ea40: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
ea50: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
ea60: 74 69 6d 65 6f 75 74 22 2c 20 2d 31 29 29 3b 0a timeout", -1));.
ea70: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
ea80: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
ea90: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
eaa0: 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 wLongObj(SSL_SES
eab0: 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 SION_get_timeout
eac0: 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 20 20 20 (session)));.
ead0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 }.. /* Compr
eae0: 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 ession info */.
eaf0: 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 if (ssl != NU
eb00: 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 LL) {.#ifdef HAV
eb10: 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f E_SSL_COMPRESSIO
eb20: 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 N..const COMP_ME
eb30: 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 THOD *comp, *exp
eb40: 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 n;..comp = SSL_g
eb50: 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 et_current_compr
eb60: 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 ession(ssl);..ex
eb70: 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 pn = SSL_get_cur
eb80: 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 rent_expansion(s
eb90: 73 6c 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f sl);...Tcl_ListO
eba0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
ebb0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ebc0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
ebd0: 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 ("compression",
ebe0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
ebf0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
ec00: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ec10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
ec20: 28 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 (comp ? SSL_COMP
ec30: 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 _get_name(comp)
ec40: 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a : "NONE", -1));.
ec50: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
ec60: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
ec70: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
ec80: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 61 wStringObj("expa
ec90: 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 nsion", -1));..T
eca0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
ecb0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
ecc0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
ecd0: 74 72 69 6e 67 4f 62 6a 28 65 78 70 6e 20 3f 20 tringObj(expn ?
ece0: 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d SSL_COMP_get_nam
ecf0: 65 28 65 78 70 6e 29 20 3a 20 22 4e 4f 4e 45 22 e(expn) : "NONE"
ed00: 2c 20 2d 31 29 29 3b 0a 23 65 6c 73 65 0a 09 54 , -1));.#else..T
ed10: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
ed20: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
ed30: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
ed40: 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 tringObj("compre
ed50: 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 ssion", -1));..T
ed60: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
ed70: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
ed80: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
ed90: 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c tringObj("NONE",
eda0: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
edb0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
edc0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
edd0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
ede0: 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d j("expansion", -
edf0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
ee00: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
ee10: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
ee20: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
ee30: 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65 "NONE", -1));.#e
ee40: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ndif. }..
ee50: 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a /* Server info *
ee60: 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c /. mode = SSL
ee70: 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e _CTX_get_session
ee80: 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 _cache_mode(stat
ee90: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 ePtr->ctx);.
eea0: 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
eeb0: 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b ESS_CACHE_OFF) {
eec0: 0a 09 70 72 6f 74 6f 20 3d 20 22 6f 66 66 22 3b ..proto = "off";
eed0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
eee0: 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
eef0: 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a CACHE_CLIENT) {.
ef00: 09 70 72 6f 74 6f 20 3d 20 22 63 6c 69 65 6e 74 .proto = "client
ef10: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ";. } else if
ef20: 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
ef30: 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 S_CACHE_SERVER)
ef40: 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 73 65 72 76 {..proto = "serv
ef50: 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 er";. } else
ef60: 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
ef70: 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 ESS_CACHE_BOTH)
ef80: 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 62 6f 74 68 {..proto = "both
ef90: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ";. } else {.
efa0: 09 70 72 6f 74 6f 20 3d 20 22 75 6e 6b 6e 6f 77 .proto = "unknow
efb0: 6e 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 n";. }. Tc
efc0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
efd0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
efe0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
eff0: 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e ringObj("session
f000: 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 2d 31 _cache_mode", -1
f010: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
f020: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f030: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f040: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
f050: 6a 28 70 72 6f 74 6f 2c 20 2d 31 29 29 3b 0a 0a j(proto, -1));..
f060: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
f070: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
f080: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
f090: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
f0a0: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
f0b0: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
f0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
f100: 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a *. * VersionObj
f110: 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 Cmd -- return ve
f120: 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f rsion string fro
f130: 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a m OpenSSL.. *. *
f140: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
f150: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
f160: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
f170: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
f180: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
f190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
f1d0: 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e atic int.Version
f1e0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
f1f0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
f200: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
f210: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
f220: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
f230: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ]) {. Tcl_Obj
f240: 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 *objPtr;.. d
f250: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
f260: 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 ;.. objPtr =
f270: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
f280: 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e (OPENSSL_VERSION
f290: 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 _TEXT, -1);.
f2a0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
f2b0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
f2c0: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
f2d0: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 L_OK;..clientDat
f2e0: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a a = clientData;.
f2f0: 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f .objc = objc;..o
f300: 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a bjv = objv;.}...
f310: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
f320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f350: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d --------. *. * M
f360: 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 iscObjCmd -- mis
f370: 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a c commands. *. *
f380: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
f390: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
f3a0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
f3b0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
f3c0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
f3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
f410: 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a atic int.MiscObj
f420: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
f430: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
f440: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
f450: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
f460: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
f470: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e {. static con
f480: 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 st char *command
f490: 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 s [] = { "req",
f4a0: 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d "strreq", NULL }
f4b0: 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 ;. enum comma
f4c0: 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 nd { C_REQ, C_ST
f4d0: 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b RREQ, C_DUMMY };
f4e0: 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 73 . int cmd, is
f4f0: 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 Str;. char bu
f500: 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 ffer[16384];..
f510: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
f520: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
f530: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 jc < 2) {..Tcl_W
f540: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
f550: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 rp, 1, objv, "su
f560: 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 bcommand ?args?"
f570: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
f580: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
f590: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
f5a0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
f5b0: 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 objv[1], command
f5c0: 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c s, "command", 0,
f5d0: 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 &cmd) != TCL_OK)
f5e0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
f5f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
f600: 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d isStr = (cmd ==
f610: 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 C_STRREQ);.
f620: 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f switch ((enum co
f630: 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 mmand) cmd) {..c
f640: 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 ase C_REQ:..case
f650: 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 C_STRREQ: {..
f660: 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 EVP_PKEY *pkey
f670: 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 =NULL;.. X509
f680: 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 *cert=NULL;..
f690: 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d X509_NAME *nam
f6a0: 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c e=NULL;.. Tcl
f6b0: 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 _Obj **listv;..
f6c0: 20 20 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a int listc,i;.
f6d0: 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e .. BIO *out=N
f6e0: 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 ULL;... char
f6f0: 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 *k_C="",*k_ST=""
f700: 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 ,*k_L="",*k_O=""
f710: 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d ,*k_OU="",*k_CN=
f720: 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a "",*k_Email="";.
f730: 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 . char *keyou
f740: 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a t,*pemout,*str;.
f750: 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 . int keysize
f760: 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 ,serial=0,days=3
f770: 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 65;..#if OPENSSL
f780: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
f790: 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 < 0x30000000L..
f7a0: 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d BIGNUM *bne =
f7b0: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 NULL;.. RSA
f7c0: 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c *rsa = NULL;.#el
f7d0: 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 se.. EVP_PKEY
f7e0: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
f7f0: 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 ;.#endif... i
f800: 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 f ((objc<5) || (
f810: 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c objc>6)) {...Tcl
f820: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
f830: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 terp, 2, objv, "
f840: 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 keysize keyfile
f850: 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 certfile ?info?"
f860: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
f870: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 ERROR;.. }...
f880: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 if (Tcl_GetI
f890: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
f8a0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 , objv[2], &keys
f8b0: 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ize) != TCL_OK)
f8c0: 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {...return TCL_E
f8d0: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 RROR;.. }..
f8e0: 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 keyout=Tcl_Get
f8f0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b String(objv[3]);
f900: 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c .. pemout=Tcl
f910: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
f920: 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 4]);.. if (is
f930: 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 Str) {...Tcl_Set
f940: 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
f950: 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 t,"",0);...Tcl_S
f960: 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d etVar(interp,pem
f970: 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 out,"",0);..
f980: 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 }... if (objc
f990: 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c >=6) {...if (Tcl
f9a0: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 _ListObjGetEleme
f9b0: 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 nts(interp, objv
f9c0: 5b 35 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 [5],....&listc,
f9d0: 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f &listv) != TCL_O
f9e0: 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 K) {... retur
f9f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
fa00: 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 ....if ((listc%2
fa10: 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 ) != 0) {...
fa20: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
fa30: 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f terp,"Informatio
fa40: 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 n list must have
fa50: 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 even number of
fa60: 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 arguments",NULL)
fa70: 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
fa80: 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 CL_ERROR;...}...
fa90: 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 for (i=0; i<list
faa0: 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 c; i+=2) {...
fab0: 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 str=Tcl_GetStri
fac0: 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 ng(listv[i]);...
fad0: 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 if (strcmp(s
fae0: 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b tr,"days")==0) {
faf0: 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
fb00: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
fb10: 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 ,listv[i+1],&day
fb20: 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 s)!=TCL_OK)....
fb30: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
fb40: 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 ROR;... } els
fb50: 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
fb60: 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b ,"serial")==0) {
fb70: 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
fb80: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
fb90: 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 ,listv[i+1],&ser
fba0: 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 ial)!=TCL_OK)...
fbb0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
fbc0: 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 ERROR;... } e
fbd0: 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
fbe0: 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 tr,"C")==0) {...
fbf0: 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 .k_C=Tcl_GetStri
fc00: 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
fc10: 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
fc20: 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 (strcmp(str,"ST"
fc30: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d )==0) {....k_ST=
fc40: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
fc50: 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
fc60: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
fc70: 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 mp(str,"L")==0)
fc80: 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 {....k_L=Tcl_Get
fc90: 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
fca0: 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
fcb0: 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
fcc0: 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "O")==0) {....k_
fcd0: 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 O=Tcl_GetString(
fce0: 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
fcf0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
fd00: 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d rcmp(str,"OU")==
fd10: 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 0) {....k_OU=Tcl
fd20: 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
fd30: 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
fd40: 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
fd50: 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a str,"CN")==0) {.
fd60: 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 ...k_CN=Tcl_GetS
fd70: 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
fd80: 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
fd90: 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
fda0: 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 Email")==0) {...
fdb0: 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 .k_Email=Tcl_Get
fdc0: 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
fdd0: 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
fde0: 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 {....Tcl_SetRes
fdf0: 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e ult(interp,"Unkn
fe00: 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e own parameter",N
fe10: 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 ULL);....return
fe20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
fe30: 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 }...}.. }..#
fe40: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
fe50: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
fe60: 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 000000L.. bne
fe70: 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 = BN_new();..
fe80: 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 rsa = RSA_new(
fe90: 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 );.. pkey = E
fea0: 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 VP_PKEY_new();..
feb0: 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e if (bne == N
fec0: 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 ULL || rsa == NU
fed0: 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 LL || pkey == NU
fee0: 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f LL || !BN_set_wo
fef0: 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c rd(bne,RSA_F4) |
ff00: 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 |...!RSA_generat
ff10: 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 e_key_ex(rsa, ke
ff20: 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c ysize, bne, NULL
ff30: 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 ) || !EVP_PKEY_a
ff40: 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 ssign_RSA(pkey,
ff50: 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b rsa)) {...EVP_PK
ff60: 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 EY_free(pkey);..
ff70: 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 ./* RSA_free(rsa
ff80: 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f ); freed by EVP_
ff90: 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 PKEY_free */...B
ffa0: 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c N_free(bne);.#el
ffb0: 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 se.. pkey = E
ffc0: 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 VP_RSA_gen((unsi
ffd0: 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a gned int) keysiz
ffe0: 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 e);.. ctx = E
fff0: 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 VP_PKEY_CTX_new(
10000 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 pkey,NULL);..
10010 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c if (pkey == NUL
10020 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c L || ctx == NULL
10030 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 || !EVP_PKEY_ke
10040 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c ygen_init(ctx) |
10050 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 |...!EVP_PKEY_CT
10060 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e X_set_rsa_keygen
10070 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 _bits(ctx, keysi
10080 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 ze) || !EVP_PKEY
10090 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b _keygen(ctx, &pk
100a0 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 ey)) {...EVP_PKE
100b0 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 Y_free(pkey);...
100c0 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 EVP_PKEY_CTX_fre
100d0 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 e(ctx);.#endif..
100e0 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
100f0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e nterp,"Error gen
10100 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 erating private
10110 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 key",NULL);...re
10120 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
10130 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
10140 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
10150 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
10160 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
10170 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
10180 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c _PrivateKey(out,
10190 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 pkey,NULL,NULL,0
101a0 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ,NULL,NULL);...
101b0 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 i=BIO_read(ou
101c0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 t,buffer,sizeof(
101d0 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 buffer)-1);...
101e0 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 i=(i<0) ? 0 :
101f0 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b i;... buffer[
10200 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 i]='\0';... T
10210 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
10220 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 ,keyout,buffer,0
10230 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 );... BIO_flu
10240 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 sh(out);... B
10250 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 IO_free(out);...
10260 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f } else {... o
10270 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
10280 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 _file());...
10290 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
102a0 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a me(out,keyout);.
102b0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
102c0 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f bio_PrivateKey(o
102d0 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c ut,pkey,NULL,NUL
102e0 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a L,0,NULL,NULL);.
102f0 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 .. /* PEM_wri
10300 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 te_bio_RSAPrivat
10310 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e eKey(out, rsa, N
10320 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 ULL, NULL, 0, NU
10330 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 LL, NULL); */...
10340 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c BIO_free_all
10350 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 (out);.. .}....i
10360 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 f ((cert=X509_ne
10370 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 w())==NULL) {...
10380 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
10390 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
103a0 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 generating certi
103b0 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c ficate request",
103c0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 NULL);... EVP
103d0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
103e0 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
103f0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
10400 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 x30000000L...
10410 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 BN_free(bne);.#
10420 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 endif... retu
10430 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 rn(TCL_ERROR);..
10440 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 .}....X509_set_v
10450 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a ersion(cert,2);.
10460 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 ..ASN1_INTEGER_s
10470 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 et(X509_get_seri
10480 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 alNumber(cert),s
10490 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 erial);...X509_g
104a0 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
104b0 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 etm_notBefore(ce
104c0 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 rt),0);...X509_g
104d0 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
104e0 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 etm_notAfter(cer
104f0 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 t),(long)60*60*2
10500 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 4*days);...X509_
10510 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c set_pubkey(cert,
10520 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 pkey);....name=X
10530 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 509_get_subject_
10540 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 name(cert);....X
10550 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
10560 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
10570 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 C", MBSTRING_ASC
10580 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
10590 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d d char *) k_C, -
105a0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
105b0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
105c0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 _by_txt(name,"ST
105d0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
105e0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
105f0 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d char *) k_ST, -
10600 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
10610 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
10620 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 _by_txt(name,"L"
10630 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
10640 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
10650 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c char *) k_L, -1,
10660 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
10670 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
10680 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 y_txt(name,"O",
10690 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
106a0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
106b0 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d ar *) k_O, -1, -
106c0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
106d0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
106e0 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d txt(name,"OU", M
106f0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
10700 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
10710 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d r *) k_OU, -1, -
10720 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
10730 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
10740 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d txt(name,"CN", M
10750 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
10760 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
10770 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d r *) k_CN, -1, -
10780 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
10790 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
107a0 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 txt(name,"Email"
107b0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
107c0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
107d0 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c char *) k_Email,
107e0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 -1, -1, 0);....
107f0 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 X509_set_subject
10800 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 _name(cert,name)
10810 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 ;....if (!X509_s
10820 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 ign(cert,pkey,EV
10830 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 P_sha256())) {..
10840 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 . X509_free(c
10850 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f ert);... EVP_
10860 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
10870 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
10880 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
10890 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 30000000L...
108a0 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
108b0 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 ndif... Tcl_S
108c0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
108d0 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 "Error signing c
108e0 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c ertificate",NULL
108f0 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 );... return
10900 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a TCL_ERROR;...}..
10910 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 ..if (isStr) {..
10920 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
10930 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 (BIO_s_mem());..
10940 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
10950 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
10960 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 );... i=BIO_r
10970 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 ead(out,buffer,s
10980 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 izeof(buffer)-1)
10990 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 ;... i=(i<0)
109a0 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 ? 0 : i;... b
109b0 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 uffer[i]='\0';..
109c0 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 . Tcl_SetVar(
109d0 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 interp,pemout,bu
109e0 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 ffer,0);... B
109f0 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 IO_flush(out);..
10a00 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 . BIO_free(ou
10a10 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 t);...} else {..
10a20 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
10a30 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a (BIO_s_file());.
10a40 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f .. BIO_write_
10a50 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d filename(out,pem
10a60 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f out);... PEM_
10a70 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f write_bio_X509(o
10a80 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ut,cert);...
10a90 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 BIO_free_all(out
10aa0 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 );...}....X509_f
10ab0 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 ree(cert);...EVP
10ac0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
10ad0 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
10ae0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
10af0 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f x30000000L...BN_
10b00 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 free(bne);.#endi
10b10 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 f.. }..}..bre
10b20 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a ak;. default:
10b30 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 ..break;. }.
10b40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
10b50 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
10b60 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
10b70 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
10b80 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 *****/./* Init
10b90 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a */./*
10ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10bb0 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ***/../*. *-----
10bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
10c00 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d *. * Tls_Free --
10c10 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
10c20 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 edure cleans up
10c30 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
10c40 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
10c50 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 *.is closed and
10c60 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 its reference c
10c70 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 ount falls below
10c80 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 1. *. * Results
10c90 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.none. *. *
10ca0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
10cb0 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 .Frees all the s
10cc0 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d tate. *. *------
10cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
10d10 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 /.void.Tls_Free(
10d20 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 char *blockPtr)
10d30 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
10d40 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
10d50 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 )blockPtr;..
10d60 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
10d70 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 );.. Tls_Clea
10d80 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 n(statePtr);.
10d90 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 ckfree(blockPtr
10da0 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
10db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
10df0 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 *. * Tls_Clean
10e00 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
10e10 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 ocedure cleans u
10e20 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 p when a SSL soc
10e30 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
10e40 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 l. *.is closed a
10e50 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 nd its reference
10e60 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c count falls bel
10e70 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 ow 1. This shou
10e80 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 ld. *.be called
10e90 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 synchronously by
10ea0 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 the CloseProc,
10eb0 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 not in the. *.Ev
10ec0 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c entuallyFree cal
10ed0 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
10ee0 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ults:. *.none. *
10ef0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
10f00 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 :. *.Frees all t
10f10 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d he state. *. *--
10f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f60 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 -. */.void Tls_C
10f70 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 lean(State *stat
10f80 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 ePtr) {. dpri
10f90 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
10fa0 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 /*. * we
10fb0 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 're assuming her
10fc0 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e e that we're sin
10fd0 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 gle-threaded.
10fe0 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 */. if (sta
10ff0 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 tePtr->timer !=
11000 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
11010 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 NULL) {..Tcl_De
11020 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 leteTimerHandler
11030 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
11040 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 );..statePtr->ti
11050 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 mer = NULL;.
11060 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
11070 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 Ptr->bio) {../*
11080 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 This will call S
11090 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 SL_shutdown. Bug
110a0 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 1414045 */..dpr
110b0 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 intf("BIO_free_a
110c0 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 ll(%p)", statePt
110d0 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 r->bio);..BIO_fr
110e0 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d ee_all(statePtr-
110f0 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 >bio);..statePtr
11100 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->bio = NULL;.
11110 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
11120 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 ePtr->ssl) {..dp
11130 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 rintf("SSL_free(
11140 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e %p)", statePtr->
11150 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 ssl);..SSL_free(
11160 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
11170 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d .statePtr->ssl =
11180 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
11190 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
111a0 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 tx) {..SSL_CTX_f
111b0 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ree(statePtr->ct
111c0 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 x);..statePtr->c
111d0 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d tx = NULL;. }
111e0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
111f0 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 r->callback) {..
11200 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
11210 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
11220 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ack);..statePtr-
11230 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c >callback = NULL
11240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
11250 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
11260 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 rd) {..Tcl_DecrR
11270 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
11280 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 ->password);..st
11290 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
112a0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a = NULL;. }..
112b0 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
112c0 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a urning");.}.../*
112d0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
112e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
112f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11310 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
11320 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 _Init --. *. *.T
11330 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 his is a package
11340 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 initialization
11350 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 procedure, which
11360 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 is called. *.by
11370 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 Tcl when this p
11380 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 ackage is to be
11390 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 added to an inte
113a0 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 rpreter.. *. * R
113b0 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e esults: Ssl con
113c0 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 figured and load
113d0 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ed. *. * Side ef
113e0 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 fects:. *. creat
113f0 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e e the ssl comman
11400 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 d, initialize ss
11410 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d l context. *. *-
11420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11460 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 --. */.DLLEXPORT
11470 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 int Tls_Init(Tc
11480 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
11490 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 ) {. const ch
114a0 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 ar tlsTclInitScr
114b0 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 ipt[] = {.#inclu
114c0 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 de "tls.tcl.h"..
114d0 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 0x00. };..
114e0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
114f0 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 ");.. /*.
11500 20 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f * We only suppo
11510 72 74 20 54 63 6c 20 38 2e 34 20 6f 72 20 6e 65 rt Tcl 8.4 or ne
11520 77 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 wer. */.
11530 69 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 5f if (.#ifdef USE_
11540 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c 5f 49 TCL_STUBS..Tcl_I
11550 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c nitStubs(interp,
11560 20 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c 73 65 "8.4", 0).#else
11570 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 ..Tcl_PkgRequire
11580 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 (interp, "Tcl",
11590 22 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e 64 69 "8.4-", 0).#endi
115a0 66 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 f.. == NULL) {..
115b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
115c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
115d0 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 (TlsLibInit(0) !
115e0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c = TCL_OK) {..Tcl
115f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
11600 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 terp, "could not
11610 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 initialize SSL
11620 6c 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 3b library", NULL);
11630 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
11640 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
11650 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
11660 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
11670 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 ::ciphers", Ciph
11680 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 ersObjCmd, (Clie
11690 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
116a0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
116b0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
116c0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
116d0 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 (interp, "tls::c
116e0 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e onnection", Conn
116f0 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 ectionInfoObjCmd
11700 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
11710 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
11720 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
11730 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
11740 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
11750 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 "tls::handshake"
11760 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d , HandshakeObjCm
11770 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
11780 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
11790 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
117a0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
117b0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
117c0 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 "tls::import",
117d0 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 ImportObjCmd, (C
117e0 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
117f0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
11800 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
11810 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
11820 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
11830 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 ::unimport", Uni
11840 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c mportObjCmd, (Cl
11850 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
11860 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
11870 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
11880 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
11890 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
118a0 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 :status", Status
118b0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
118c0 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
118d0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
118e0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
118f0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
11900 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 terp, "tls::vers
11910 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a ion", VersionObj
11920 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
11930 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
11940 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
11950 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
11960 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
11970 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 p, "tls::misc",
11980 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 MiscObjCmd, (Cli
11990 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
119a0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
119b0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
119c0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
119d0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
119e0 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 protocols", Prot
119f0 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c ocolsObjCmd, (Cl
11a00 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
11a10 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
11a20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 *) NULL);.. i
11a30 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 63 f (interp) {..Tc
11a40 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 l_Eval(interp, t
11a50 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 lsTclInitScript)
11a60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 ;. }.. ret
11a70 75 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f 76 69 urn(Tcl_PkgProvi
11a80 64 65 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 22 de(interp, "tls"
11a90 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f , PACKAGE_VERSIO
11aa0 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d N));.}../*. *---
11ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ae0 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 ---*. *. *.Tls_S
11af0 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a afeInit --. *. *
11b00 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
11b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b30 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 -*. *.Standard p
11b40 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65 rocedure require
11b50 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 d by 'load'.. *.
11b60 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 Initializes this
11b70 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 extension for a
11b80 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 safe interprete
11b90 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d r.. *.----------
11ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11bc0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 ------*. *. *.Si
11bd0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 de effects:. *..
11be0 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 As of 'Tls_Init'
11bf0 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 . *. *.Result:.
11c00 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *..A standard Tc
11c10 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a l error code.. *
11c20 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
11c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 ---------*. */.D
11c60 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 LLEXPORT int Tls
11c70 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e _SafeInit(Tcl_In
11c80 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a terp *interp) {.
11c90 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
11ca0 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 led");. retur
11cb0 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 n(Tls_Init(inter
11cc0 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d p));.}../*. *---
11cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d00 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 ---*. *. *.TlsLi
11d10 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d bInit --. *. *.-
11d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
11d50 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 . *.Initializes
11d60 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 SSL library once
11d70 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e per application
11d80 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
11d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11db0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 ----*. *. *.Side
11dc0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e effects:. *..in
11dd0 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 itializes SSL li
11de0 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 brary. *. *.Resu
11df0 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a lt:. *..none. *.
11e00 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
11e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e30 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 --------*. */.st
11e40 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 atic int TlsLibI
11e50 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 nit(int uninitia
11e60 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 lize) {. stat
11e70 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a ic int initializ
11e80 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 ed = 0;. int
11e90 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b status = TCL_OK;
11ea0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
11eb0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
11ec0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
11ed0 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 EADS). size_t
11ee0 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 num_locks;.#end
11ef0 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e if.. if (unin
11f00 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 itialize) {.
11f10 20 20 20 20 69 66 20 28 21 69 6e 69 74 69 61 6c if (!initial
11f20 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 ized) {.
11f30 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b dprintf("Ask
11f40 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 ed to uninitiali
11f50 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e ze, but we are n
11f60 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 ot initialized")
11f70 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 ;.. r
11f80 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 eturn(TCL_OK);.
11f90 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 }..
11fa0 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 dprintf("Asked
11fb0 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 to uninitialize
11fc0 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 ");..#if defined
11fd0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
11fe0 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
11ff0 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 20 20 _THREADS).
12000 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 Tcl_MutexLock(
12010 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 20 20 20 20 &init_mx);..
12020 20 20 20 20 69 66 20 28 6c 6f 63 6b 73 29 20 7b if (locks) {
12030 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 72 65 . fre
12040 65 28 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 20 20 e(locks);.
12050 20 20 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 locks = NU
12060 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 LL;.
12070 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a locksCount = 0;.
12080 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 }.#endif
12090 0a 20 20 20 20 20 20 20 20 69 6e 69 74 69 61 6c . initial
120a0 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 ized = 0;..#if d
120b0 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
120c0 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
120d0 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
120e0 20 20 20 20 20 20 20 20 54 63 6c 5f 4d 75 74 65 Tcl_Mute
120f0 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 xUnlock(&init_mx
12100 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 );.#endif..
12110 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b return(TCL_OK
12120 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
12130 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b (initialized) {
12140 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e 74 66 . dprintf
12150 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 ("Called, but us
12160 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 ing cached value
12170 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 ");. retu
12180 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 20 rn(status);.
12190 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 }.. dprintf("
121a0 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 Called");..#if d
121b0 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
121c0 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
121d0 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
121e0 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 Tcl_MutexLoc
121f0 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e k(&init_mx);.#en
12200 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 dif. initiali
12210 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 zed = 1;..#if de
12220 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
12230 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
12240 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 d(TCL_THREADS).
12250 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 num_locks = 1
12260 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 ;. locksCount
12270 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 = (int) num_loc
12280 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 ks;. locks =
12290 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c malloc(sizeof(*l
122a0 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b ocks) * num_lock
122b0 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c s);. memset(l
122c0 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 ocks, 0, sizeof(
122d0 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f *locks) * num_lo
122e0 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 cks);.#endif..
122f0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 /* Initialize
12300 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 BOTH libcrypto a
12310 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 nd libssl. */.
12320 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 OPENSSL_init_s
12330 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f sl(OPENSSL_INIT_
12340 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 LOAD_SSL_STRINGS
12350 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f | OPENSSL_INIT_
12360 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 LOAD_CRYPTO_STRI
12370 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 NGS..| OPENSSL_I
12380 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 NIT_ADD_ALL_CIPH
12390 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e ERS | OPENSSL_IN
123a0 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 IT_ADD_ALL_DIGES
123b0 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 TS, NULL);..
123c0 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c BIO_new_tcl(NULL
123d0 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 , 0);..#if 0.
123e0 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 /*. * XXX:T
123f0 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 ODO: Remove this
12400 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 code and replac
12410 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63 e it with a chec
12420 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f k. * for eno
12430 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 ugh entropy and
12440 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 do not try to cr
12450 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 eate our own.
12460 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 * terrible ent
12470 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ropy. */.
12480 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 /*. * Seed
12490 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 the random numbe
124a0 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 r generator in t
124b0 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a he SSL library,.
124c0 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 * using the
124d0 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 do/while constr
124e0 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 uct because of t
124f0 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 he bug note in t
12500 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 he. * OpenSS
12510 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f L FAQ at http://
12520 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f www.openssl.org/
12530 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c support/faq.html
12540 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 #USER1. *.
12550 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 * The crux of
12560 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 the problem is
12570 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 that Solaris 7 d
12580 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 oes not have a.
12590 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f * /dev/rando
125a0 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f m or /dev/urando
125b0 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 m device so it c
125c0 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f annot gather eno
125d0 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f ugh. * entro
125e0 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 py from the RAND
125f0 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 _seed() when TLS
12600 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 initializes and
12610 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 refuses. *
12620 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 to go further. E
12630 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 arlier versions
12640 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 of OpenSSL carri
12650 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 ed on regardless
12660 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 .. */. sr
12670 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e and((unsigned in
12680 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 t) time((time_t
12690 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 *) NULL));. d
126a0 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b o {..for (i = 0;
126b0 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a i < 16; i++) {.
126c0 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d . rnd_seed[i]
126d0 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 = 1 + (char) (2
126e0 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 55.0 * rand()/(R
126f0 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 AND_MAX+1.0));..
12700 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 }..RAND_seed(rnd
12710 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e _seed, sizeof(rn
12720 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 d_seed));. }
12730 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 while (RAND_stat
12740 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 us() != 1);.#end
12750 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 if..#if defined(
12760 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
12770 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
12780 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 THREADS)..Tcl_Mu
12790 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f texUnlock(&init_
127a0 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 mx);.#endif...re
127b0 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a turn(status);.}.