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: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63 "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e include <stdlib.
0390: 68 3e 0a 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e h>.../* Min Open
03a0: 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 SSL version */.#
03b0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
03c0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
03d0: 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72 20 22 101000L.#error "
03e0: 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e Only OpenSSL v1.
03f0: 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69 73 20 1.1 or later is
0400: 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e 64 69 supported".#endi
0410: 66 0a 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 f.../*. * Forwar
0420: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 d declarations.
0430: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 */..#define F2N(
0440: 6b 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 key, dsp) \..(((
0450: 6b 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 key) == NULL) ?
0460: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 (char *) NULL :
0470: 5c 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 \...Tcl_Translat
0480: 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 eFileName(interp
0490: 2c 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 , (key), (dsp)))
04a0: 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 ..static SSL_CTX
04b0: 20 2a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 *CTX_Init(State
04c0: 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 *statePtr, int
04d0: 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 isServer, int pr
04e0: 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a oto, char *key,.
04f0: 09 09 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 ..char *certfile
0500: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
0510: 2a 6b 65 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 *key_asn1, unsig
0520: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 5f 61 ned char *cert_a
0530: 73 6e 31 2c 0a 09 09 69 6e 74 20 6b 65 79 5f 61 sn1,...int key_a
0540: 73 6e 31 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 sn1_len, int cer
0550: 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68 61 72 t_asn1_len, char
0560: 20 2a 43 41 70 61 74 68 2c 20 63 68 61 72 20 2a *CApath, char *
0570: 43 41 66 69 6c 65 2c 0a 09 09 63 68 61 72 20 2a CAfile,...char *
0580: 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 ciphers, char *c
0590: 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 iphersuites, int
05a0: 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 level, char *DH
05b0: 70 61 72 61 6d 73 29 3b 0a 0a 73 74 61 74 69 63 params);..static
05c0: 20 69 6e 74 09 54 6c 73 4c 69 62 49 6e 69 74 28 int.TlsLibInit(
05d0: 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 int uninitialize
05e0: 29 3b 0a 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f );..#define TLS_
05f0: 50 52 4f 54 4f 5f 53 53 4c 32 09 09 30 78 30 31 PROTO_SSL2..0x01
0600: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
0610: 54 4f 5f 53 53 4c 33 09 09 30 78 30 32 0a 23 64 TO_SSL3..0x02.#d
0620: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f efine TLS_PROTO_
0630: 54 4c 53 31 09 09 30 78 30 34 0a 23 64 65 66 69 TLS1..0x04.#defi
0640: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ne TLS_PROTO_TLS
0650: 31 5f 31 09 30 78 30 38 0a 23 64 65 66 69 6e 65 1_1.0x08.#define
0660: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
0670: 32 09 30 78 31 30 0a 23 64 65 66 69 6e 65 20 54 2.0x10.#define T
0680: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 LS_PROTO_TLS1_3.
0690: 30 78 32 30 0a 23 64 65 66 69 6e 65 20 45 4e 41 0x20.#define ENA
06a0: 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61 73 6b 29 BLED(flag, mask)
06b0: 09 28 28 28 66 6c 61 67 29 20 26 20 28 6d 61 73 .(((flag) & (mas
06c0: 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a k)) == (mask))..
06d0: 23 64 65 66 69 6e 65 20 53 53 4c 4b 45 59 4c 4f #define SSLKEYLO
06e0: 47 46 49 4c 45 09 09 22 53 53 4c 4b 45 59 4c 4f GFILE.."SSLKEYLO
06f0: 47 46 49 4c 45 22 0a 0a 2f 2a 0a 20 2a 20 54 68 GFILE"../*. * Th
0700: 72 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f read-Safe TLS Co
0710: 64 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 de. */..#ifdef T
0720: 43 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 CL_THREADS.#defi
0730: 6e 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ne OPENSSL_THREA
0740: 44 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 D_DEFINES.#inclu
0750: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e de <openssl/open
0760: 73 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 sslconf.h>..#ifd
0770: 65 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ef OPENSSL_THREA
0780: 44 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 DS.#include <ope
0790: 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 nssl/crypto.h>.#
07a0: 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c include <openssl
07b0: 2f 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 /ssl.h>../*. * T
07c0: 68 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f hreaded operatio
07d0: 6e 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 n requires locki
07e0: 6e 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 ng callbacks. *
07f0: 42 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 Based from /cryp
0800: 74 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 to/cryptlib.c of
0810: 20 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f OpenSSL and NSO
0820: 70 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 penSSL.. */..sta
0830: 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c tic Tcl_Mutex *l
0840: 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 ocks = NULL;.sta
0850: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 tic int locksCou
0860: 6e 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 nt = 0;.static T
0870: 63 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 cl_Mutex init_mx
0880: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e ;.#endif /* OPEN
0890: 53 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 SSL_THREADS */.#
08a0: 65 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 endif /* TCL_THR
08b0: 45 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a EADS */..../****
08c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
08d0: 2f 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 /./* Callbacks
08e0: 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a */./******
08f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
0900: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
0950: 45 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f Eval Callback Co
0960: 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 mmand --. *. *.E
0970: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d val callback com
0980: 6d 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 mand and catch a
0990: 6e 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 ny errors. *. *
09a0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 Results:. *.0 =
09b0: 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 Command returned
09c0: 20 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 fail or eval re
09d0: 74 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 turned TCL_ERROR
09e0: 0a 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 . *.1 = Command
09f0: 72 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 returned success
0a00: 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 or eval returne
0a10: 64 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 d TCL_OK. *. * S
0a20: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
0a30: 45 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 Evaluates callba
0a40: 63 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a ck command. *. *
0a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a90: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
0aa0: 6e 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 nt.EvalCallback(
0ab0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
0ac0: 72 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 rp, State *state
0ad0: 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d Ptr, Tcl_Obj *cm
0ae0: 64 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 dPtr) {. int
0af0: 63 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20 code, ok = 0;..
0b00: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
0b10: 65 64 22 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 ed");.. Tcl_P
0b20: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
0b30: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
0b40: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
0b50: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
0b60: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 ePtr);.. /* E
0b70: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 val callback wit
0b80: 68 20 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b h success for ok
0b90: 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 or return value
0ba0: 20 31 2c 20 66 61 69 6c 20 66 6f 72 20 65 72 72 1, fail for err
0bb0: 6f 72 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c or or return val
0bc0: 75 65 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c 5f ue 0 */. Tcl_
0bd0: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 ResetResult(inte
0be0: 72 70 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 rp);. code =
0bf0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e Tcl_EvalObjEx(in
0c00: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 terp, cmdPtr, TC
0c10: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a L_EVAL_GLOBAL);.
0c20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 45 76 61 dprintf("Eva
0c30: 6c 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 lCallback: %d",
0c40: 63 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 code);. if (c
0c50: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b ode == TCL_OK) {
0c60: 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c ../* Check resul
0c70: 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c t for return val
0c80: 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a ue */..Tcl_Obj *
0c90: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 result = Tcl_Get
0ca0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
0cb0: 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d );..if (result =
0cc0: 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 = NULL || Tcl_Ge
0cd0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 tIntFromObj(inte
0ce0: 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 rp, result, &ok)
0cf0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 != TCL_OK) {..
0d00: 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 09 64 ok = 1;..}..d
0d10: 70 72 69 6e 74 66 28 22 52 65 73 75 6c 74 3a 20 printf("Result:
0d20: 25 64 22 2c 20 6f 6b 29 3b 0a 20 20 20 20 7d 20 %d", ok);. }
0d30: 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 else {../* Error
0d40: 20 2d 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 - reject the ce
0d50: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 64 70 rtificate */..dp
0d60: 72 69 6e 74 66 28 22 54 63 6c 5f 42 61 63 6b 67 rintf("Tcl_Backg
0d70: 72 6f 75 6e 64 45 72 72 6f 72 22 29 3b 0a 23 69 roundError");.#i
0d80: 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 f (TCL_MAJOR_VER
0d90: 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 SION == 8) && (T
0da0: 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e CL_MINOR_VERSION
0db0: 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 < 6)..Tcl_Backg
0dc0: 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 roundError(inter
0dd0: 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 p);.#else..Tcl_B
0de0: 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 ackgroundExcepti
0df0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 on(interp, code)
0e00: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a ;.#endif. }..
0e10: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
0e20: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
0e30: 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f tePtr);. Tcl_
0e40: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
0e50: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
0e60: 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c return ok;.}..
0e70: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
0ec0: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a InfoCallback --.
0ed0: 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 *. *.Monitors S
0ee0: 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 SL connection pr
0ef0: 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 ocess. *. * Resu
0f00: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
0f10: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
0f20: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
0f30: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
0f40: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
0f90: 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f 43 61 6c tic void.InfoCal
0fa0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
0fb0: 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 72 65 2c *ssl, int where,
0fc0: 20 69 6e 74 20 72 65 74 29 20 7b 0a 20 20 20 20 int ret) {.
0fd0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
0fe0: 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 = (State*)SSL_ge
0ff0: 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20 t_app_data((SSL
1000: 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f *)ssl);. Tcl_
1010: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d Interp *interp.=
1020: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
1030: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
1040: 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 cmdPtr;. char
1050: 20 2a 6d 61 6a 6f 72 2c 20 2a 6d 69 6e 6f 72 3b *major, *minor;
1060: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
1070: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
1080: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
1090: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
10a0: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b *)NULL)..return;
10b0: 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 .. if (where
10c0: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 & SSL_CB_HANDSHA
10d0: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a KE_START) {..maj
10e0: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 or = "handshake"
10f0: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 ;..minor = "star
1100: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 t";. } else i
1110: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
1120: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 B_HANDSHAKE_DONE
1130: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 ) {..major = "ha
1140: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 ndshake";..minor
1150: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d = "done";. }
1160: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 else {..if (whe
1170: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 re & SSL_CB_ALER
1180: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 T)..major = "ale
1190: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 rt";..else if (w
11a0: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f here & SSL_ST_CO
11b0: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 NNECT).major = "
11c0: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 connect";..else
11d0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
11e0: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f ST_ACCEPT)..majo
11f0: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 r = "accept";..e
1200: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 lse.....major =
1210: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 "unknown";...if
1220: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1230: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 READ)..minor = "
1240: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 read";..else if
1250: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1260: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 WRITE)..minor =
1270: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 "write";..else i
1280: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
1290: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d B_LOOP)..minor =
12a0: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 "loop";..else i
12b0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
12c0: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d B_EXIT)..minor =
12d0: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 "exit";..else..
12e0: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e ...minor = "unkn
12f0: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 own";. }..
1300: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
1310: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 nd to eval with
1320: 66 6e 2c 20 63 68 61 6e 2c 20 6d 61 6a 6f 72 2c fn, chan, major,
1330: 20 6d 69 6e 6f 72 2c 20 6d 65 73 73 61 67 65 2c minor, message,
1340: 20 61 6e 64 20 74 79 70 65 20 61 72 67 73 20 2a and type args *
1350: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
1360: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
1370: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
1380: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 ck);. Tcl_Lis
1390: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
13a0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
13b0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
13c0: 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b bj("info", -1));
13d0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
13e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
13f0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
1400: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
1410: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
1420: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
1430: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 >self), -1));.
1440: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1450: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1460: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
1470: 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f ewStringObj(majo
1480: 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c r, -1));. Tcl
1490: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
14a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
14b0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
14c0: 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 ingObj(minor, -1
14d0: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 ));.. if (whe
14e0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 re & SSL_CB_ALER
14f0: 54 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 T) {..Tcl_ListOb
1500: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1510: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
1520: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
1530: 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 64 gObj(SSL_alert_d
1540: 65 73 63 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 esc_string_long(
1550: 72 65 74 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ret), -1));..Tcl
1560: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1570: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
1580: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
1590: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
15a0: 61 6c 65 72 74 5f 74 79 70 65 5f 73 74 72 69 6e alert_type_strin
15b0: 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 g_long(ret), -1)
15c0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
15d0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
15e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
15f0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
1600: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1610: 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 SSL_state_string
1620: 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 _long(ssl), -1))
1630: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
1640: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
1650: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
1660: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e NewStringObj("in
1670: 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d fo", -1));. }
1680: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
1690: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
16a0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
16b0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
16c0: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b EvalCallback
16d0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
16e0: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 r, cmdPtr);.
16f0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
1700: 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a (cmdPtr);.}.../*
1710: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1750: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 ------. *. * Mes
1760: 73 61 67 65 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a sageCallback --.
1770: 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 *. *.Monitors S
1780: 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 SL protocol mess
1790: 61 67 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ages. *. * Resul
17a0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
17b0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
17c0: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
17d0: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
17e0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e -------. */.#ifn
1830: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 def OPENSSL_NO_S
1840: 53 4c 5f 54 52 41 43 45 0a 73 74 61 74 69 63 20 SL_TRACE.static
1850: 76 6f 69 64 0a 4d 65 73 73 61 67 65 43 61 6c 6c void.MessageCall
1860: 62 61 63 6b 28 69 6e 74 20 77 72 69 74 65 5f 70 back(int write_p
1870: 2c 20 69 6e 74 20 76 65 72 73 69 6f 6e 2c 20 69 , int version, i
1880: 6e 74 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c nt content_type,
1890: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 75 66 const void *buf
18a0: 2c 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 , size_t len, SS
18b0: 4c 20 2a 73 73 6c 2c 20 76 6f 69 64 20 2a 61 72 L *ssl, void *ar
18c0: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a g) {. State *
18d0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
18e0: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f e*)arg;. Tcl_
18f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d Interp *interp.=
1900: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
1910: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
1920: 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 cmdPtr;. char
1930: 20 2a 76 65 72 2c 20 2a 74 79 70 65 3b 0a 20 20 *ver, *type;.
1940: 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 BIO *bio;.
1950: 63 68 61 72 20 62 75 66 66 65 72 5b 33 30 30 30 char buffer[3000
1960: 30 5d 3b 0a 20 20 20 20 62 75 66 66 65 72 5b 30 0];. buffer[0
1970: 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 ] = 0;.. dpri
1980: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
1990: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
19a0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
19b0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 cl_Obj*)NULL)..r
19c0: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 77 69 74 eturn;.. swit
19d0: 63 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23 69 ch(version) {.#i
19e0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
19f0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
1a00: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 00000L && !defin
1a10: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 ed(NO_SSL2) && !
1a20: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
1a30: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 NO_SSL2). cas
1a40: 65 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a e SSL2_VERSION:.
1a50: 09 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b 0a .ver = "SSLv2";.
1a60: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
1a70: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 if !defined(NO_S
1a80: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
1a90: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
1aa0: 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ). case SSL3_
1ab0: 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 VERSION:..ver =
1ac0: 22 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b 3b "SSLv3";..break;
1ad0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 .#endif. case
1ae0: 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 TLS1_VERSION:..
1af0: 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a 09 ver = "TLSv1";..
1b00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1b10: 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a TLS1_1_VERSION:.
1b20: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31 22 .ver = "TLSv1.1"
1b30: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1b40: 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 4f se TLS1_2_VERSIO
1b50: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 N:..ver = "TLSv1
1b60: 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 .2";..break;.
1b70: 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45 52 case TLS1_3_VER
1b80: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c SION:..ver = "TL
1b90: 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b 0a Sv1.3";..break;.
1ba0: 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65 72 case 0:..ver
1bb0: 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 = "none";..brea
1bc0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a k;. default:.
1bd0: 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 .ver = "unknown"
1be0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a ;..break;. }.
1bf0: 0a 20 20 20 20 73 77 69 74 63 68 20 28 63 6f 6e . switch (con
1c00: 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20 20 tent_type) {.
1c10: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 45 case SSL3_RT_HE
1c20: 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22 48 ADER:..type = "H
1c30: 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a eader";..break;.
1c40: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 case SSL3_RT
1c50: 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 _INNER_CONTENT_T
1c60: 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49 6e YPE:..type = "In
1c70: 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70 65 ner Content Type
1c80: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 ";..break;. c
1c90: 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 4e ase SSL3_RT_CHAN
1ca0: 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a 0a GE_CIPHER_SPEC:.
1cb0: 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65 20 .type = "Change
1cc0: 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b 3b Cipher";..break;
1cd0: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1ce0: 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d T_ALERT:..type =
1cf0: 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61 6b "Alert";..break
1d00: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ;. case SSL3_
1d10: 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 RT_HANDSHAKE:..t
1d20: 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 ype = "Handshake
1d30: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 ";..break;. c
1d40: 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c ase SSL3_RT_APPL
1d50: 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 ICATION_DATA:..t
1d60: 79 70 65 20 3d 20 22 41 70 70 20 44 61 74 61 22 ype = "App Data"
1d70: 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20 4f 50 ;..break;.#if OP
1d80: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
1d90: 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
1da0: 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54 4c 53 0L. case DTLS
1db0: 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54 3a 0a 1_RT_HEARTBEAT:.
1dc0: 09 74 79 70 65 20 3d 20 22 48 65 61 72 74 62 65 .type = "Heartbe
1dd0: 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e at";..break;.#en
1de0: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a dif. default:
1df0: 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 ..type = "unknow
1e00: 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f n";. }.. /
1e10: 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 20 * Needs compile
1e20: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e 61 time option "ena
1e30: 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e 20 ble-ssl-trace".
1e40: 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f 20 */. if ((bio
1e50: 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f = BIO_new(BIO_s_
1e60: 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c 29 mem())) != NULL)
1e70: 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f {..int n;..SSL_
1e80: 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20 76 trace(write_p, v
1e90: 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f ersion, content_
1ea0: 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 type, buf, len,
1eb0: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 6f ssl, (void *)bio
1ec0: 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 64 );..n = BIO_read
1ed0: 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 49 (bio, buffer, BI
1ee0: 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20 3c O_pending(bio) <
1ef0: 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 65 6e 15000 ? BIO_pen
1f00: 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 39 39 ding(bio) : 1499
1f10: 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 9);..n = (n<0) ?
1f20: 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 0 : n;..buffer[
1f30: 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 n] = 0;..(void)B
1f40: 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 IO_flush(bio);..
1f50: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 BIO_free(bio);.
1f60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
1f70: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
1f80: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e al with fn, chan
1f90: 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 76 65 72 , direction, ver
1fa0: 73 69 6f 6e 2c 20 74 79 70 65 2c 20 61 6e 64 20 sion, type, and
1fb0: 6d 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a message args */.
1fc0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
1fd0: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
1fe0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
1ff0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2000: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2010: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2020: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2030: 28 22 6d 65 73 73 61 67 65 22 2c 20 2d 31 29 29 ("message", -1))
2040: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
2050: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2060: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
2070: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
2080: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
2090: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
20a0: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
20b0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
20c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
20d0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
20e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 77 72 69 NewStringObj(wri
20f0: 74 65 5f 70 20 3f 20 22 53 65 6e 74 22 20 3a 20 te_p ? "Sent" :
2100: 22 52 65 63 65 69 76 65 64 22 2c 20 2d 31 29 29 "Received", -1))
2110: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
2120: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2130: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2140: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2150: 76 65 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 ver, -1));. T
2160: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2170: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2180: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
2190: 74 72 69 6e 67 4f 62 6a 28 74 79 70 65 2c 20 2d tringObj(type, -
21a0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
21b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
21c0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
21d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
21e0: 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b bj(buffer, -1));
21f0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
2200: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
2210: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
2220: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
2230: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b EvalCallback
2240: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
2250: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 r, cmdPtr);.
2260: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
2270: 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 (cmdPtr);.}.#end
2280: 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d if.../*. *------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
22d0: 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 . * VerifyCallba
22e0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 ck --. *. *.Moni
22f0: 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 tors SSL certifi
2300: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 cate validation
2310: 70 72 6f 63 65 73 73 2e 20 55 73 65 64 20 74 6f process. Used to
2320: 20 63 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 2a 09 control the. *.
2330: 62 65 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 behavior when th
2340: 65 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 e SSL_VERIFY_PEE
2350: 52 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 R flag is set. T
2360: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a his is called. *
2370: 09 77 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 .whenever a cert
2380: 69 66 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 ificate is inspe
2390: 63 74 65 64 20 6f 72 20 64 65 63 69 64 65 64 20 cted or decided
23a0: 69 6e 76 61 6c 69 64 2e 20 43 61 6c 6c 65 64 20 invalid. Called
23b0: 66 6f 72 0a 20 2a 09 65 61 63 68 20 63 65 72 74 for. *.each cert
23c0: 69 66 69 63 61 74 65 20 69 6e 20 74 68 65 20 63 ificate in the c
23d0: 65 72 74 20 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a ert chain.. *. *
23e0: 20 43 68 65 63 6b 73 3a 0a 20 2a 09 54 68 65 20 Checks:. *.The
23f0: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69 certificate chai
2400: 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61 n is checked sta
2410: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64 rting with the d
2420: 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c eepest nesting l
2430: 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72 evel. *. (the r
2440: 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61 oot CA certifica
2450: 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75 te) and worked u
2460: 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65 pward to the pee
2470: 72 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e r's certificate.
2480: 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72 . *.All signatur
2490: 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75 es are valid, cu
24a0: 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69 rrent time is wi
24b0: 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c thin first and l
24c0: 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d ast validity tim
24d0: 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74 e.. *.Check that
24e0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
24f0: 20 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68 is issued by th
2500: 65 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69 e issuer certifi
2510: 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09 cate issuer.. *.
2520: 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61 Check the revoca
2530: 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20 tion status for
2540: 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65 each certificate
2550: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76 .. *.Check the v
2560: 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67 alidity of the g
2570: 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65 iven CRL and the
2580: 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e cert revocation
2590: 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63 status.. *.Chec
25a0: 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f k the policies o
25b0: 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66 f all the certif
25c0: 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67 icates. *. * Arg
25d0: 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f s. *.preverify_o
25e0: 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 k indicates whet
25f0: 68 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63 her the certific
2600: 61 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e ate verification
2610: 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e passed (1) or n
2620: 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73 ot (0). *. * Res
2630: 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 ults:. *.A callb
2640: 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 ack bound to the
2650: 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 socket may retu
2660: 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 rn one of:. *.
2670: 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 0...- the cert
2680: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 ificate is deeme
2690: 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20 d invalid, send
26a0: 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09 verification. *.
26b0: 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65 ... failure ale
26c0: 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20 rt to peer, and
26d0: 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68 terminate handsh
26e0: 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09 ake.. *. 1...
26f0: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 - the certificat
2700: 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69 e is deemed vali
2710: 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 d, continue with
2720: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 handshake.. *.
2730: 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09 empty string.
2740: 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 - no change to c
2750: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 ertificate valid
2760: 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 ation. *. * Side
2770: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 effects:. *.The
2780: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 err field of th
2790: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 e currently oper
27a0: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 ative State is s
27b0: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 et. *. to a str
27c0: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 ing describing t
27d0: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 he SSL negotiati
27e0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f on failure reaso
27f0: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d n. *. *---------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
2840: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79 tatic int.Verify
2850: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c Callback(int ok,
2860: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20 X509_STORE_CTX
2870: 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f *ctx) {. Tcl_
2880: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
2890: 20 53 53 4c 20 20 20 2a 73 73 6c 20 3d 20 28 53 SSL *ssl = (S
28a0: 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43 SL*)X509_STORE_C
28b0: 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63 TX_get_ex_data(c
28c0: 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64 tx, SSL_get_ex_d
28d0: 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43 ata_X509_STORE_C
28e0: 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58 TX_idx());. X
28f0: 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35 509 *cert..= X5
2900: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
2910: 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74 _current_cert(ct
2920: 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 x);. State *s
2930: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 tatePtr.= (State
2940: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
2950: 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c ta(ssl);. Tcl
2960: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
2970: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
2980: 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70 74 rp;. int dept
2990: 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f h..= X509_STORE_
29a0: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65 CTX_get_error_de
29b0: 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69 6e pth(ctx);. in
29c0: 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53 54 t err..= X509_ST
29d0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f ORE_CTX_get_erro
29e0: 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70 72 r(ctx);.. dpr
29f0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
2a00: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 dprintf("Ver
2a10: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22 ifyCallback: %d"
2a20: 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28 , ok);.. if (
2a30: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
2a40: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
2a50: 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f 6b 20 76 ) {../* Use ok v
2a60: 61 6c 75 65 20 69 66 20 76 65 72 69 66 69 63 61 alue if verifica
2a70: 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 tion is required
2a80: 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74 */..if (statePt
2a90: 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c 5f r->vflags & SSL_
2aa0: 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e VERIFY_FAIL_IF_N
2ab0: 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 O_PEER_CERT) {..
2ac0: 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 return ok;..
2ad0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 } else {.. re
2ae0: 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d turn 1;..}. }
2af0: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 3d else if (cert =
2b00: 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d = NULL || ssl ==
2b10: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
2b20: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 0;. }.. d
2b30: 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61 printf("VerifyCa
2b40: 6c 6c 62 61 63 6b 3a 20 65 76 61 6c 20 63 61 6c llback: eval cal
2b50: 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20 20 2f 2a lback");.. /*
2b60: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 Create command
2b70: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c to eval with fn,
2b80: 20 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 chan, depth, ce
2b90: 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 rt info list, st
2ba0: 61 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 atus, and error
2bb0: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 args */. cmdP
2bc0: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
2bd0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
2be0: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
2bf0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2c00: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2c10: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
2c20: 67 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d gObj("verify", -
2c30: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
2c40: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2c50: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2c60: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 ,..Tcl_NewString
2c70: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
2c80: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
2c90: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 >self), -1));.
2ca0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2cb0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2cc0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2cd0: 65 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 ewIntObj(depth))
2ce0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
2cf0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2d00: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2d10: 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e ls_NewX509Obj(in
2d20: 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 terp, cert));.
2d30: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2d40: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2d50: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2d60: 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 ewIntObj(ok));.
2d70: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2d80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2d90: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c rp, cmdPtr,..Tcl
2da0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 _NewStringObj((c
2db0: 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 har*)X509_verify
2dc0: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 _cert_error_stri
2dd0: 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a ng(err), -1));..
2de0: 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 /* Prevent I
2df0: 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 /O while callbac
2e00: 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 k is in progress
2e10: 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 */. /* state
2e20: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c Ptr->flags |= TL
2e30: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 S_TCL_CALLBACK;
2e40: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 */.. /* Eval
2e50: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
2e60: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
2e70: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
2e80: 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 ;. ok = EvalC
2e90: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
2ea0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
2eb0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
2ec0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
2ed0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 .. dprintf("V
2ee0: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 63 erifyCallback: c
2ef0: 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20 3d 20 ommand result =
2f00: 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 2f %d", ok);.. /
2f10: 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 * statePtr->flag
2f20: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 s &= ~(TLS_TCL_C
2f30: 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 ALLBACK); */.
2f40: 20 72 65 74 75 72 6e 20 6f 6b 3b 09 2f 2a 20 42 return ok;./* B
2f50: 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 y default, leave
2f60: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75 6e verification un
2f70: 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a changed. */.}...
2f80: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
2fd0: 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 ls_Error --. *.
2fe0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
2ff0: 20 77 69 74 68 20 65 72 72 6f 72 20 6d 65 73 73 with error mess
3000: 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 age.. *. * Side
3010: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 effects:. *.The
3020: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 err field of the
3030: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 currently opera
3040: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 tive State is se
3050: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 t. *. to a stri
3060: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 ng describing th
3070: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f e SSL negotiatio
3080: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e n failure reason
3090: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
30e0: 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 id.Tls_Error(Sta
30f0: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 te *statePtr, ch
3100: 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 ar *msg) {. T
3110: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
3120: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
3130: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
3140: 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 j *cmdPtr, *list
3150: 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 Ptr;. unsigne
3160: 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 d long err;.
3170: 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 statePtr->err =
3180: 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 msg;.. dprint
3190: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
31a0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
31b0: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c callback == (Tcl
31c0: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 _Obj*)NULL)..ret
31d0: 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 urn;.. /* Cre
31e0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
31f0: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 val with fn, cha
3200: 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61 n, and message a
3210: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 rgs */. cmdPt
3220: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
3230: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 eObj(statePtr->c
3240: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 allback);. Tc
3250: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3260: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3270: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
3280: 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c ringObj("error",
3290: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
32a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
32b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
32c0: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
32d0: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 StringObj(Tcl_Ge
32e0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
32f0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
3300: 29 29 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 ));. if (msg
3310: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f != NULL) {..Tcl_
3320: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3330: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3340: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
3350: 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b ngObj(msg, -1));
3360: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
3370: 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 ((msg = Tcl_GetS
3380: 74 72 69 6e 67 28 54 63 6c 5f 47 65 74 4f 62 6a tring(Tcl_GetObj
3390: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 29 29 Result(interp)))
33a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c != NULL) {..Tcl
33b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
33c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
33d0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
33e0: 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 ingObj(msg, -1))
33f0: 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ;.. } else {.
3400: 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e .listPtr = Tcl_N
3410: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
3420: 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65 72 72 L);..while ((err
3430: 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 = ERR_get_error
3440: 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 ()) != 0) {..
3450: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3460: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3470: 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e , listPtr, Tcl_N
3480: 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f ewStringObj(ERR_
3490: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 reason_error_str
34a0: 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a ing(err), -1));.
34b0: 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 .}..Tcl_ListObjA
34c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
34d0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73 erp, cmdPtr, lis
34e0: 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 tPtr);. }..
34f0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
3500: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
3510: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
3520: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
3530: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
3540: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
3550: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
3560: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
3570: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Ptr);.}.../*. *-
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35c0: 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 --. *. * KeyLogC
35d0: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a allback --. *. *
35e0: 09 57 72 69 74 65 20 72 65 63 65 69 76 65 64 20 .Write received
35f0: 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 key data to log
3600: 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 file.. *. * Side
3610: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e effects:. *.non
3620: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
3630: 2d 2d 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 0a 20 2a 2f 0a 76 ----------. */.v
3670: 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 oid KeyLogCallba
3680: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 ck(const SSL *ss
3690: 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c l, const char *l
36a0: 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 ine) {. char
36b0: 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 *str = getenv(SS
36c0: 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 LKEYLOGFILE);.
36d0: 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 FILE *fd;..
36e0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
36f0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 72 ");.. if (str
3700: 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28 ) {..fd = fopen(
3710: 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 72 69 str, "a");..fpri
3720: 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c ntf(fd, "%s\n",l
3730: 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64 ine);..fclose(fd
3740: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a );. }.}.../*.
3750: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3790: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 -----. *. * Pass
37a0: 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d word Callback --
37b0: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 . *. *.Called wh
37c0: 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 69 73 en a password is
37d0: 20 6e 65 65 64 65 64 20 66 6f 72 20 61 20 70 72 needed for a pr
37e0: 69 76 61 74 65 20 6b 65 79 20 77 68 65 6e 20 6c ivate key when l
37f0: 6f 61 64 69 6e 67 0a 20 2a 09 6f 72 20 73 74 6f oading. *.or sto
3800: 72 69 6e 67 20 61 20 50 45 4d 20 63 65 72 74 69 ring a PEM certi
3810: 66 69 63 61 74 65 20 77 69 74 68 20 65 6e 63 72 ficate with encr
3820: 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 yption. Evals ca
3830: 6c 6c 62 61 63 6b 0a 20 2a 09 73 63 72 69 70 74 llback. *.script
3840: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 and returns the
3850: 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 70 result as the p
3860: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69 assword string i
3870: 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 n buf.. *. * Res
3880: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
3890: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
38a0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
38b0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
38c0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
38d0: 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65 *.Password size
38e0: 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20 in bytes or -1
38f0: 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a for an error.. *
3900: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3940: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
3950: 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 c int.PasswordCa
3960: 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 llback(char *buf
3970: 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 , int size, int
3980: 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 rwflag, void *ud
3990: 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 ata) {. State
39a0: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 *statePtr.= (St
39b0: 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 ate *) udata;.
39c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
39d0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
39e0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
39f0: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
3a00: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 int code;.
3a10: 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 0a 20 Tcl_Size len;..
3a20: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
3a30: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 ed");.. /* If
3a40: 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 no callback, us
3a50: 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 e default callba
3a60: 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 ck */. if (st
3a70: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
3a80: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 == NULL) {..if
3a90: 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 (Tcl_EvalEx(inte
3aa0: 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f rp, "tls::passwo
3ab0: 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 rd", -1, TCL_EVA
3ac0: 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c L_GLOBAL) == TCL
3ad0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 _OK) {.. char
3ae0: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 *ret = (char *)
3af0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
3b00: 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a omObj(Tcl_GetObj
3b10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 Result(interp),
3b20: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 &len);.. if (
3b30: 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 len > (Tcl_Size)
3b40: 20 73 69 7a 65 2d 31 29 20 7b 0a 09 09 6c 65 6e size-1) {...len
3b50: 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 = (Tcl_Size) si
3b60: 7a 65 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 ze-1;.. }..
3b70: 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 strncpy(buf, r
3b80: 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e et, (size_t) len
3b90: 29 3b 0a 09 20 20 20 20 62 75 66 5b 6c 65 6e 5d );.. buf[len]
3ba0: 20 3d 20 27 5c 30 27 3b 0a 09 20 20 20 20 72 65 = '\0';.. re
3bb0: 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a turn (int) len;.
3bc0: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 .} else {.. r
3bd0: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 eturn -1;..}.
3be0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
3bf0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
3c00: 6c 20 77 69 74 68 20 66 6e 2c 20 72 77 66 6c 61 l with fn, rwfla
3c10: 67 2c 20 61 6e 64 20 73 69 7a 65 20 61 72 67 73 g, and size args
3c20: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
3c30: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
3c40: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 j(statePtr->pass
3c50: 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c word);. Tcl_L
3c60: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3c70: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3c80: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
3c90: 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64 22 2c gObj("password",
3ca0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
3cb0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3cc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3cd0: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
3ce0: 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 j(rwflag));.
3cf0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
3d00: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
3d10: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
3d20: 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a IntObj(size));..
3d30: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
3d40: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
3d50: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 terp);. Tcl_P
3d60: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
3d70: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
3d80: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
3d90: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
3da0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
3db0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
3dc0: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 code = Tcl_Ev
3dd0: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 alObjEx(interp,
3de0: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c cmdPtr, TCL_EVAL
3df0: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 _GLOBAL);. if
3e00: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b (code != TCL_OK
3e10: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ) {.#if (TCL_MAJ
3e20: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
3e30: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
3e40: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
3e50: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
3e60: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
3e70: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
3e80: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
3e90: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 code);.#endif.
3ea0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
3eb0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
3ec0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 );.. Tcl_Rele
3ed0: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
3ee0: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 statePtr);..
3ef0: 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 /* If successfu
3f00: 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70 61 73 l, pass back pas
3f10: 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61 6e 64 sword string and
3f20: 20 74 72 75 6e 63 61 74 65 20 69 66 20 74 6f 6f truncate if too
3f30: 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 long */. if
3f40: 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 (code == TCL_OK)
3f50: 20 7b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 {..char *ret =
3f60: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
3f70: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
3f80: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
3f90: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 nterp), &len);..
3fa0: 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 if (len > (Tcl_S
3fb0: 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 ize) size-1) {..
3fc0: 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 len = (Tcl_S
3fd0: 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a ize) size-1;..}.
3fe0: 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 .strncpy(buf, re
3ff0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 t, (size_t) len)
4000: 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c ;..buf[len] = '\
4010: 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 0';..Tcl_Release
4020: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
4030: 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 20 28 terp);..return (
4040: 69 6e 74 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a int) len;. }.
4050: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
4060: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
4070: 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e erp);. return
4080: 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d -1;.}.../*. *--
4090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40d0: 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 -. *. * Session
40e0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 Callback for Cli
40f0: 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 ents --. *. *.Ca
4100: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 lled when a new
4110: 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 session is added
4120: 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 to the cache. I
4130: 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 n TLS 1.3. *.thi
4140: 73 20 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 s may be receive
4150: 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 d multiple times
4160: 20 61 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 after the hands
4170: 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 hake. For. *.ear
4180: 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 lier versions, t
4190: 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 his will be rece
41a0: 69 76 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 ived during the
41b0: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 handshake.. *.Th
41c0: 69 73 20 69 73 20 74 68 65 20 70 72 65 66 65 72 is is the prefer
41d0: 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 red way to obtai
41e0: 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 n a resumable se
41f0: 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 ssion.. *. * Res
4200: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
4210: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
4220: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
4230: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
4240: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
4250: 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f des:. *.0 = erro
4260: 72 20 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 r where session
4270: 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 will be immediat
4280: 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d ely removed from
4290: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 the internal ca
42a0: 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 che.. *.1 = succ
42b0: 65 73 73 20 77 68 65 72 65 20 61 70 70 20 72 65 ess where app re
42c0: 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e tains session in
42d0: 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 session cache,
42e0: 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 and must call SS
42f0: 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 L_SESSION_free()
4300: 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 when done.. *.
4310: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
4320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4350: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
4360: 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 int.SessionCallb
4370: 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 ack(SSL *ssl, SS
4380: 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 L_SESSION *sessi
4390: 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 on) {. State
43a0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
43b0: 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f te*)SSL_get_app_
43c0: 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 data((SSL *)ssl)
43d0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
43e0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
43f0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
4400: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
4410: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 ;. const unsi
4420: 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 gned char *ticke
4430: 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 t;. const uns
4440: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 igned char *sess
4450: 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 ion_id;. size
4460: 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 _t len2;. uns
4470: 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a igned int ulen;.
4480: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
4490: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
44a0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
44b0: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a ack == (Tcl_Obj*
44c0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
44d0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
44e0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 OK;. } else i
44f0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 f (ssl == NULL)
4500: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
4510: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4520: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
4530: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
4540: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 eval with fn, ch
4550: 61 6e 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 an, session id,
4560: 73 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 session ticket,
4570: 61 6e 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 and lifetime arg
4580: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 s */. cmdPtr
4590: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
45a0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
45b0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f lback);. Tcl_
45c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
45d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
45e0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
45f0: 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c ngObj("session",
4600: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
4610: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4620: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4630: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
4640: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 StringObj(Tcl_Ge
4650: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
4660: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
4670: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 ));.. /* Sess
4680: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 ion id */. se
4690: 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 ssion_id = SSL_S
46a0: 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 ESSION_get_id(se
46b0: 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 ssion, &ulen);.
46c0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
46d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
46e0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
46f0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
4700: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c session_id, (Tcl
4710: 5f 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a _Size) ulen));..
4720: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 /* Session t
4730: 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c icket */. SSL
4740: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 _SESSION_get0_ti
4750: 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 cket(session, &t
4760: 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 icket, &len2);.
4770: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4780: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4790: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
47a0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
47b0: 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a ticket, (Tcl_Siz
47c0: 65 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 e) len2));..
47d0: 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 /* Lifetime - nu
47e0: 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 mber of seconds
47f0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f */. Tcl_ListO
4800: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
4810: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
4820: 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 .Tcl_NewLongObj(
4830: 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 (long) SSL_SESSI
4840: 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 ON_get_ticket_li
4850: 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 fetime_hint(sess
4860: 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 ion)));.. /*
4870: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
4880: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
4890: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
48a0: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 dPtr);. EvalC
48b0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
48c0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
48d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
48e0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
48f0: 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 .. /* Return
4900: 30 20 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 0 for now until
4910: 73 65 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 session handling
4920: 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a is complete */.
4930: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a return 0;.}.
4940: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
4990: 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 ALPN Callback f
49a0: 6f 72 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e or Servers and N
49b0: 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 PN Callback for
49c0: 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a Clients --. *. *
49d0: 09 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f .Perform protoco
49e0: 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c l (http/1.1, h2,
49f0: 20 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 h3, etc.) selec
4a00: 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 tion for the. *.
4a10: 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 incoming connect
4a20: 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 ion. Called afte
4a30: 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 r Hello and serv
4a40: 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a er callbacks.. *
4a50: 09 57 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 .Where 'out' is
4a60: 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f selected protoco
4a70: 6c 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 l and 'in' is th
4a80: 65 20 70 65 65 72 20 61 64 76 65 72 74 69 73 65 e peer advertise
4a90: 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 d list.. *. * Re
4aa0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
4ab0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
4ac0: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
4ad0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
4ae0: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 ). *. * Return c
4af0: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 odes:. *.SSL_TLS
4b00: 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e EXT_ERR_OK: ALPN
4b10: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 protocol select
4b20: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
4b30: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
4b40: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
4b50: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 ALERT_FATAL: The
4b60: 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 re was no overla
4b70: 70 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c p between the cl
4b80: 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 ient's. *. su
4b90: 70 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 pplied list and
4ba0: 74 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 the server confi
4bb0: 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f guration. The co
4bc0: 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 nnection will be
4bd0: 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c aborted.. *.SSL
4be0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
4bf0: 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c K: ALPN protocol
4c00: 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 not selected, e
4c10: 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 .g., because no
4c20: 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 ALPN. *. prot
4c30: 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 ocols are config
4c40: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f ured for this co
4c50: 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f nnection. The co
4c60: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
4c70: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d es.. *. *-------
4c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
4cc0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e .static int.ALPN
4cd0: 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 Callback(SSL *ss
4ce0: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 l, const unsigne
4cf0: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e d char **out, un
4d00: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 signed char *out
4d10: 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 len,..const unsi
4d20: 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 gned char *in, u
4d30: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 nsigned int inle
4d40: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a n, void *arg) {.
4d50: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
4d60: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
4d70: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 g;. Tcl_Inter
4d80: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
4d90: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
4da0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
4db0: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c r;. int code,
4dc0: 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e res;.. dprin
4dd0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
4de0: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 if (ssl == NU
4df0: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c LL || arg == NUL
4e00: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
4e10: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
4e20: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a K;. }.. /*
4e30: 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c Select protocol
4e40: 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f */. if (SSL_
4e50: 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 select_next_prot
4e60: 6f 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 o((unsigned char
4e70: 20 2a 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e **) out, outlen
4e80: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 , statePtr->prot
4e90: 6f 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 os, statePtr->pr
4ea0: 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 otos_len,..in, i
4eb0: 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c nlen) == OPENSSL
4ec0: 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 _NPN_NEGOTIATED)
4ed0: 20 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 {../* Match fou
4ee0: 6e 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c nd */..res = SSL
4ef0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
4f00: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a } else {../*
4f10: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f OPENSSL_NPN_NO_
4f20: 4f 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 OVERLAP = No ove
4f30: 72 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 rlap, so use fir
4f40: 73 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 st item from cli
4f50: 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 ent protocol lis
4f60: 74 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f t */..res = SSL_
4f70: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
4f80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
4f90: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 (statePtr->vcmd
4fa0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
4fb0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 L) {..return res
4fc0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
4fd0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
4fe0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
4ff0: 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 chan, depth, cer
5000: 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 t info list, sta
5010: 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 tus, and error a
5020: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 rgs */. cmdPt
5030: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
5040: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
5050: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
5060: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
5070: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
5080: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
5090: 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 Obj("alpn", -1))
50a0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
50b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
50c0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
50d0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
50e0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
50f0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
5100: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
5110: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5120: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5130: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
5140: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f NewStringObj((co
5150: 6e 73 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 nst char *) *out
5160: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
5170: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5180: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5190: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c Ptr, Tcl_NewBool
51a0: 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 eanObj(res == SS
51b0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 L_TLSEXT_ERR_OK)
51c0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 );.. /* Eval
51d0: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
51e0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
51f0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
5200: 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 ;. if ((code
5210: 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 = EvalCallback(i
5220: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
5230: 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b cmdPtr)) > 1) {
5240: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
5250: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
5260: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 } else if (cod
5270: 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d e == 1) {..res =
5280: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5290: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b OK;. } else {
52a0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
52b0: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 XT_ERR_ALERT_FAT
52c0: 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 AL;. }. Tc
52d0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
52e0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 mdPtr);. retu
52f0: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 rn res;.}.../*.
5300: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5340: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 ----. *. * Adver
5350: 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 tise Protocols C
5360: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 allback for Next
5370: 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 Protocol Negoti
5380: 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 ation (NPN) in S
5390: 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a erverHello --. *
53a0: 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 . *.called when
53b0: 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 a TLS server nee
53c0: 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 ds a list of sup
53d0: 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 ported protocols
53e0: 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f for Next. *.Pro
53f0: 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f tocol Negotiatio
5400: 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 n.. *. * Results
5410: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.None. *. *
5420: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
5430: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 . * Return codes
5440: 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f :. *.SSL_TLSEXT_
5450: 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 ERR_OK: NPN prot
5460: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 ocol selected. T
5470: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
5480: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f ntinues.. *.SSL_
5490: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
54a0: 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e : NPN protocol n
54b0: 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 ot selected. The
54c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
54d0: 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d inues.. *. *----
54e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
5520: 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e */.#ifdef USE_N
5530: 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 PN.static int.NP
5540: 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 NCallback(const
5550: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 SSL *ssl, const
5560: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a unsigned char **
5570: 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e out, unsigned in
5580: 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 t *outlen, void
5590: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 *arg) {. Stat
55a0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
55b0: 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 tate*)arg;..
55c0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
55d0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 );.. if (ssl
55e0: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d == NULL || arg =
55f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
5600: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
5610: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
5620: 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 /* Set protoc
5630: 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 ols list */.
5640: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 if (statePtr->pr
5650: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a otos != NULL) {.
5660: 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 .*out = statePtr
5670: 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c ->protos;..*outl
5680: 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 en = statePtr->p
5690: 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d rotos_len;. }
56a0: 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 else {..*out =
56b0: 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d NULL;..*outlen =
56c0: 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 0;..return SSL_
56d0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
56e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
56f0: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
5700: 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c R_OK;.}.#endif..
5710: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
5720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
5760: 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 SNI Callback for
5770: 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 Servers --. *.
5780: 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 *.Perform server
5790: 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 -side SNI hostna
57a0: 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 me selection aft
57b0: 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 er receiving SNI
57c0: 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e extension. *.in
57d0: 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 Client Hello. C
57e0: 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c alled after hell
57f0: 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 o callback but b
5800: 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 efore ALPN callb
5810: 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ack.. *. * Resul
5820: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
5830: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
5840: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
5850: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
5860: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
5870: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s:. *.SSL_TLSEXT
5880: 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 _ERR_OK: SNI hos
5890: 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 tname is accepte
58a0: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f d. The connectio
58b0: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 n continues.. *.
58c0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
58d0: 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 LERT_FATAL: SNI
58e0: 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 hostname is not
58f0: 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f accepted. The co
5900: 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 nnection. *.
5910: 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 is aborted. Defa
5920: 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 ult for alert is
5930: 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e SSL_AD_UNRECOGN
5940: 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 IZED_NAME.. *.SS
5950: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 L_TLSEXT_ERR_ALE
5960: 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 RT_WARNING: SNI
5970: 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 hostname is not
5980: 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e accepted, warnin
5990: 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 g alert. *. s
59a0: 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 ent (not support
59b0: 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 ed in TLSv1.3).
59c0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
59d0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c ontinues.. *.SSL
59e0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
59f0: 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 K: SNI hostname
5a00: 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 is not accepted
5a10: 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 and not acknowle
5a20: 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 dged,. *. e.g
5a30: 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 . if SNI has not
5a40: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 been configured
5a50: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
5a60: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 continues.. *.
5a70: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
5a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ab0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
5ac0: 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 int.SNICallback(
5ad0: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 const SSL *ssl,
5ae0: 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 int *alert, void
5af0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
5b00: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
5b10: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 State*)arg;.
5b20: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
5b30: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
5b40: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
5b50: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
5b60: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 int code, res;.
5b70: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 const char *s
5b80: 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c ervername = NULL
5b90: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
5ba0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
5bb0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c f (ssl == NULL |
5bc0: 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b | arg == NULL) {
5bd0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
5be0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
5bf0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c }.. /* Onl
5c00: 79 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 y works for TLS
5c10: 31 2e 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 1.2 and earlier
5c20: 2a 2f 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d */. servernam
5c30: 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 e = SSL_get_serv
5c40: 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 ername(ssl, TLSE
5c50: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 XT_NAMETYPE_host
5c60: 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 _name);. if (
5c70: 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 !servername || s
5c80: 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 ervername[0] ==
5c90: 27 5c 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 '\0') {..return
5ca0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
5cb0: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 OACK;. }..
5cc0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
5cd0: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a cmd == (Tcl_Obj*
5ce0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
5cf0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5d00: 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OK;. }.. /
5d10: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 * Create command
5d20: 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e to eval with fn
5d30: 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 , chan, and serv
5d40: 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a er name args */.
5d50: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
5d60: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
5d70: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 atePtr->vcmd);.
5d80: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5d90: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5da0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
5db0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e NewStringObj("sn
5dc0: 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 i", -1));. Tc
5dd0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
5de0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
5df0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
5e00: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
5e10: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
5e20: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
5e30: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
5e40: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5e50: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5e60: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
5e70: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 gObj(servername
5e80: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 , -1));.. /*
5e90: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
5ea0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
5eb0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
5ec0: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 dPtr);. if ((
5ed0: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 code = EvalCallb
5ee0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
5ef0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e ePtr, cmdPtr)) >
5f00: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 1) {..res = SSL
5f10: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 _TLSEXT_ERR_ALER
5f20: 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 T_WARNING;..*ale
5f30: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 rt = SSL_AD_UNRE
5f40: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f COGNIZED_NAME; /
5f50: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 * Not supported
5f60: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 by TLS 1.3 */.
5f70: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 } else if (cod
5f80: 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d e == 1) {..res =
5f90: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5fa0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b OK;. } else {
5fb0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
5fc0: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 XT_ERR_ALERT_FAT
5fd0: 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 AL;..*alert = SS
5fe0: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 L_AD_UNRECOGNIZE
5ff0: 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 D_NAME; /* Not s
6000: 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 upported by TLS
6010: 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 1.3 */. }.
6020: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
6030: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 t(cmdPtr);. r
6040: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f eturn res;.}.../
6050: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
6060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6090: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c -------. *. * Cl
60a0: 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 ientHello Handsh
60b0: 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 ake Callback for
60c0: 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 Servers --. *.
60d0: 2a 09 55 73 65 64 20 62 79 20 73 65 72 76 65 72 *.Used by server
60e0: 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 to examine the
60f0: 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 server name indi
6100: 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 cation (SNI) ext
6110: 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 ension. *.provid
6120: 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 ed by the client
6130: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c in order to sel
6140: 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 ect an appropria
6150: 74 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 te certificate t
6160: 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e o. *.present, an
6170: 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e d make other con
6180: 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 figuration adjus
6190: 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 tments relevant
61a0: 74 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 to that server.
61b0: 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 *.name and its c
61c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 onfiguration. Th
61d0: 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 is includes swap
61e0: 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 ping out the ass
61f0: 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 ociated. *.SSL_C
6200: 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 TX pointer, modi
6210: 66 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 fying the server
6220: 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 's list of permi
6230: 74 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e tted TLS version
6240: 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 s,. *.changing t
6250: 68 65 20 73 65 72 76 65 72 27 73 20 63 69 70 68 he server's ciph
6260: 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f er list in respo
6270: 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e nse to the clien
6280: 74 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c t's cipher list,
6290: 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 etc.. *.Called
62a0: 62 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 before SNI and A
62b0: 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 LPN callbacks..
62c0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
62d0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
62e0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
62f0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
6300: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
6310: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 eturn codes:. *.
6320: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
6330: 5f 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 _RETRY: suspend
6340: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 the handshake, a
6350: 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 nd the handshake
6360: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 function will r
6370: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c eturn immediatel
6380: 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f y. *.SSL_CLIENT_
6390: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 HELLO_ERROR: fai
63a0: 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 lure, terminate
63b0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 connection. Set
63c0: 61 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 alert to error c
63d0: 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 ode.. *.SSL_CLIE
63e0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 NT_HELLO_SUCCESS
63f0: 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d : success. *. *-
6400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6440: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
6450: 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 t.HelloCallback(
6460: 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 SSL *ssl, int *a
6470: 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 lert, void *arg)
6480: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
6490: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a atePtr = (State*
64a0: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e )arg;. Tcl_In
64b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
64c0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
64d0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
64e0: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f dPtr;. int co
64f0: 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e de, res;. con
6500: 73 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e st char *servern
6510: 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 ame;. const u
6520: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b nsigned char *p;
6530: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c . size_t len,
6540: 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 remaining;..
6550: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
6560: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
6570: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 tePtr->vcmd == (
6580: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b Tcl_Obj*)NULL) {
6590: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
65a0: 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 ENT_HELLO_SUCCES
65b0: 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 S;. } else if
65c0: 20 28 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 (ssl == (const
65d0: 53 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 SSL *)NULL || ar
65e0: 67 20 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c g == (void *)NUL
65f0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
6600: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6610: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
6620: 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a /* Get names */.
6630: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 if (!SSL_cli
6640: 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 ent_hello_get0_e
6650: 78 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 xt(ssl, TLSEXT_T
6660: 59 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c YPE_server_name,
6670: 20 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 &p, &remaining)
6680: 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d || remaining <=
6690: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 2) {..*alert =
66a0: 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 SSL_R_SSLV3_ALER
66b0: 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 T_ILLEGAL_PARAME
66c0: 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c TER;..return SSL
66d0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
66e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
66f0: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6c /* Extract the l
6700: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 ength of the sup
6710: 70 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 plied list of na
6720: 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 mes. */. len
6730: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b = (*(p++) << 8);
6740: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b . len += *(p+
6750: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 +);. if (len
6760: 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 + 2 != remaining
6770: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
6780: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f L_R_SSLV3_ALERT_
6790: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 ILLEGAL_PARAMETE
67a0: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 R;..return SSL_C
67b0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
67c0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d R;. }. rem
67d0: 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 aining = len;..
67e0: 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 /* The list i
67f0: 6e 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 n practice only
6800: 68 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 has a single ele
6810: 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 ment, so we only
6820: 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 consider the fi
6830: 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 rst one. */.
6840: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d if (remaining ==
6850: 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 0 || *p++ != TL
6860: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f SEXT_NAMETYPE_ho
6870: 73 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 st_name) {..*ale
6880: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 rt = SSL_R_TLSV1
6890: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f _ALERT_INTERNAL_
68a0: 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 ERROR;..return S
68b0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
68c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
68d0: 20 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 remaining--;..
68e0: 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e /* Now we can
68f0: 20 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 finally pull ou
6900: 74 20 74 68 65 20 62 79 74 65 20 61 72 72 61 79 t the byte array
6910: 20 77 69 74 68 20 74 68 65 20 61 63 74 75 61 6c with the actual
6920: 20 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 hostname. */.
6930: 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 if (remaining
6940: 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 <= 2) {..*alert
6950: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c = SSL_R_TLSV1_AL
6960: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 ERT_INTERNAL_ERR
6970: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f OR;..return SSL_
6980: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6990: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 OR;. }. le
69a0: 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 n = (*(p++) << 8
69b0: 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 );. len += *(
69c0: 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 p++);. if (le
69d0: 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e n + 2 > remainin
69e0: 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 g) {..*alert = S
69f0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 SL_R_TLSV1_ALERT
6a00: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b _INTERNAL_ERROR;
6a10: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
6a20: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
6a30: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 . }. remai
6a40: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 ning = len;.
6a50: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f servername = (co
6a60: 6e 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 nst char *)p;..
6a70: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
6a80: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 mand to eval wit
6a90: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 h fn, chan, and
6aa0: 73 65 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 server name args
6ab0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
6ac0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
6ad0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 j(statePtr->vcmd
6ae0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
6af0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
6b00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
6b10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
6b20: 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a ("hello", -1));.
6b30: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
6b40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
6b50: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
6b60: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
6b70: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
6b80: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
6b90: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
6ba0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
6bb0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
6bc0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
6bd0: 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 wStringObj(serve
6be0: 72 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 rname, (Tcl_Size
6bf0: 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a ) len));.. /*
6c00: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 Eval callback c
6c10: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 ommand */. Tc
6c20: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
6c30: 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 mdPtr);. if (
6c40: 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c (code = EvalCall
6c50: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
6c60: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 tePtr, cmdPtr))
6c70: 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 > 1) {..res = SS
6c80: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 L_CLIENT_HELLO_R
6c90: 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 ETRY;..*alert =
6ca0: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
6cb0: 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 T_USER_CANCELLED
6cc0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
6cd0: 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 (code == 1) {..r
6ce0: 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f es = SSL_CLIENT_
6cf0: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 HELLO_SUCCESS;.
6d00: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 } else {..res
6d10: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 = SSL_CLIENT_HE
6d20: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 LLO_ERROR;..*ale
6d30: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 rt = SSL_R_TLSV1
6d40: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f _ALERT_INTERNAL_
6d50: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
6d60: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
6d70: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 t(cmdPtr);. r
6d80: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f eturn res;.}.../
6d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6da0: 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 ****/./* Command
6db0: 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a s */./**
6dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6dd0: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d **/../*. *------
6de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
6e20: 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a . * HandshakeObj
6e30: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
6e40: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 s command is use
6e50: 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 d to verify whet
6e60: 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b her the handshak
6e70: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a e is complete. *
6e80: 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 .or not.. *. * R
6e90: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
6ea0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
6eb0: 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 . 1 means handsh
6ec0: 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 ake complete, 0
6ed0: 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 means pending..
6ee0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
6ef0: 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 s:. *.May force
6f00: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 SSL negotiation
6f10: 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 to take place..
6f20: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f60: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
6f70: 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 ic int Handshake
6f80: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
6f90: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
6fa0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
6fb0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
6fc0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
6fd0: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
6fe0: 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 nnel chan;
6ff0: 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c /* The channel
7000: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
7010: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 n. */. State
7020: 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20 *statePtr;
7030: 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 /* client stat
7040: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 e for ssl socket
7050: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 */. const ch
7060: 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c ar *errStr = NUL
7070: 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d L;. int ret =
7080: 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 1;. int err
7090: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 = 0;. (void)
70a0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
70b0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
70c0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
70d0: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
70e0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
70f0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
7100: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
7110: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
7120: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
7130: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 _error();.. c
7140: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
7150: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
7160: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
7170: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 1]), NULL);.
7180: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
7190: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
71a0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
71b0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
71c0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
71d0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
71e0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
71f0: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
7200: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
7210: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 han);. if (Tc
7220: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
7230: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
7240: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
7250: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7260: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
7270: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
7280: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
7290: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e an),.. "\": n
72a0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
72b0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
72c0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
72d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
72e0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c S", "HANDSHAKE",
72f0: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
7300: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
7310: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
7320: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
7330: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
7340: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
7350: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
7360: 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 ta(chan);.. d
7370: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 printf("Calling
7380: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
7390: 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 ct");. ret =
73a0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
73b0: 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 ct(statePtr, &er
73c0: 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e r, 1);. dprin
73d0: 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 tf("Tls_WaitForC
73e0: 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a onnect returned:
73f0: 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 %i", ret);..
7400: 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 if (ret < 0 &&
7410: 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ((statePtr->flag
7420: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e s & TLS_TCL_ASYN
7430: 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 C) && (err == EA
7440: 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e GAIN))) {..dprin
7450: 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e tf("Async set an
7460: 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 d err = EAGAIN")
7470: 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 ;..ret = 0;.
7480: 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c } else if (ret <
7490: 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 0) {..long resu
74a0: 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 74 lt;..errStr = st
74b0: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 atePtr->err;..Tc
74c0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e l_ResetResult(in
74d0: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 terp);..Tcl_SetE
74e0: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 rrno(err);...if
74f0: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 (!errStr || (*er
7500: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 rStr == 0)) {..
7510: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f errStr = Tcl_
7520: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 PosixError(inter
7530: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 p);..}...Tcl_App
7540: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
7550: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69 , "handshake fai
7560: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 led: ", errStr,
7570: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
7580: 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20 53 .if ((result = S
7590: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 SL_get_verify_re
75a0: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 sult(statePtr->s
75b0: 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f sl)) != X509_V_O
75c0: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 K) {.. Tcl_Ap
75d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
75e0: 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22 22 2c p, " due to \"",
75f0: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 X509_verify_cer
7600: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72 t_error_string(r
7610: 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28 63 esult), "\"", (c
7620: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d har *) NULL);..}
7630: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
7640: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
7650: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 , "HANDSHAKE", "
7660: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
7670: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 ) NULL);..dprint
7680: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c f("Returning TCL
7690: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 _ERROR with hand
76a0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 shake failed: %s
76b0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 ", errStr);..ret
76c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
76d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
76e0: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 (err != 0) {..
76f0: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 dprintf("Got a
7700: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 n error with a c
7710: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 ompleted handsha
7720: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 ke: err = %i", e
7730: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 rr);..}..ret = 1
7740: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
7750: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 intf("Returning
7760: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 TCL_OK with data
7770: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a \"%i\"", ret);.
7780: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
7790: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
77a0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 _NewIntObj(ret))
77b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
77c0: 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 _OK;.}..static c
77d0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 onst char *comma
77e0: 6e 64 5f 6f 70 74 73 20 5b 5d 20 3d 20 7b 0a 20 nd_opts [] = {.
77f0: 20 20 20 22 2d 61 6c 70 6e 22 2c 20 22 2d 63 61 "-alpn", "-ca
7800: 64 69 72 22 2c 20 22 2d 63 61 66 69 6c 65 22 2c dir", "-cafile",
7810: 20 22 2d 63 65 72 74 22 2c 20 22 2d 63 65 72 74 "-cert", "-cert
7820: 66 69 6c 65 22 2c 20 22 2d 63 69 70 68 65 72 22 file", "-cipher"
7830: 2c 20 22 2d 63 69 70 68 65 72 73 22 2c 20 22 2d , "-ciphers", "-
7840: 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 0a 20 ciphersuites",.
7850: 20 20 20 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 22 "-command", "
7860: 2d 64 68 70 61 72 61 6d 73 22 2c 20 22 2d 6b 65 -dhparams", "-ke
7870: 79 22 2c 20 22 2d 6b 65 79 66 69 6c 65 22 2c 20 y", "-keyfile",
7880: 22 2d 6d 6f 64 65 6c 22 2c 20 22 2d 70 61 73 73 "-model", "-pass
7890: 77 6f 72 64 22 2c 20 22 2d 70 6f 73 74 5f 68 61 word", "-post_ha
78a0: 6e 64 73 68 61 6b 65 22 2c 0a 20 20 20 20 22 2d ndshake",. "-
78b0: 72 65 71 75 65 73 74 22 2c 20 22 2d 72 65 71 75 request", "-requ
78c0: 69 72 65 22 2c 20 22 2d 73 65 63 75 72 69 74 79 ire", "-security
78d0: 5f 6c 65 76 65 6c 22 2c 20 22 2d 73 65 72 76 65 _level", "-serve
78e0: 72 22 2c 20 22 2d 73 65 72 76 65 72 6e 61 6d 65 r", "-servername
78f0: 22 2c 20 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 ", "-session_id"
7900: 2c 20 22 2d 73 73 6c 32 22 2c 0a 20 20 20 20 22 , "-ssl2",. "
7910: 2d 73 73 6c 33 22 2c 20 22 2d 74 6c 73 31 22 2c -ssl3", "-tls1",
7920: 20 22 2d 74 6c 73 31 2e 31 22 2c 20 22 2d 74 6c "-tls1.1", "-tl
7930: 73 31 2e 32 22 2c 20 22 2d 74 6c 73 31 2e 33 22 s1.2", "-tls1.3"
7940: 2c 20 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d , "-validatecomm
7950: 61 6e 64 22 2c 20 22 2d 76 63 6d 64 22 2c 20 4e and", "-vcmd", N
7960: 55 4c 4c 7d 3b 0a 0a 65 6e 75 6d 20 5f 63 6f 6d ULL};..enum _com
7970: 6d 61 6e 64 5f 6f 70 74 73 20 7b 0a 20 20 20 20 mand_opts {.
7980: 5f 6f 70 74 5f 61 6c 70 6e 2c 20 5f 6f 70 74 5f _opt_alpn, _opt_
7990: 63 61 64 69 72 2c 20 5f 6f 70 74 5f 63 61 66 69 cadir, _opt_cafi
79a0: 6c 65 2c 20 5f 6f 70 74 5f 63 65 72 74 2c 20 5f le, _opt_cert, _
79b0: 6f 70 74 5f 63 65 72 74 66 69 6c 65 2c 20 5f 6f opt_certfile, _o
79c0: 70 74 5f 63 69 70 68 65 72 2c 20 5f 6f 70 74 5f pt_cipher, _opt_
79d0: 63 69 70 68 65 72 73 2c 0a 20 20 20 20 5f 6f 70 ciphers,. _op
79e0: 74 5f 63 69 70 68 65 72 73 75 69 74 65 2c 20 5f t_ciphersuite, _
79f0: 6f 70 74 5f 63 6d 64 2c 20 5f 6f 70 74 5f 64 68 opt_cmd, _opt_dh
7a00: 70 61 72 61 6d 73 2c 20 5f 6f 70 74 5f 6b 65 79 params, _opt_key
7a10: 2c 20 5f 6f 70 74 5f 6b 65 79 66 69 6c 65 2c 20 , _opt_keyfile,
7a20: 5f 6f 70 74 5f 6d 6f 64 65 6c 2c 20 5f 6f 70 74 _opt_model, _opt
7a30: 5f 70 61 73 73 77 6f 72 64 2c 0a 20 20 20 20 5f _password,. _
7a40: 6f 70 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 5f opt_handshake, _
7a50: 6f 70 74 5f 72 65 71 75 65 73 74 2c 20 5f 6f 70 opt_request, _op
7a60: 74 5f 72 65 71 75 69 72 65 2c 20 5f 6f 70 74 5f t_require, _opt_
7a70: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 security_level,
7a80: 5f 6f 70 74 5f 73 65 72 76 65 72 2c 20 5f 6f 70 _opt_server, _op
7a90: 74 5f 73 65 72 76 65 72 6e 61 6d 65 2c 0a 20 20 t_servername,.
7aa0: 20 20 5f 6f 70 74 5f 73 65 73 73 69 6f 6e 5f 69 _opt_session_i
7ab0: 64 2c 20 5f 6f 70 74 5f 73 73 6c 32 2c 20 5f 6f d, _opt_ssl2, _o
7ac0: 70 74 5f 73 73 6c 33 2c 20 5f 6f 70 74 5f 74 6c pt_ssl3, _opt_tl
7ad0: 73 31 2c 20 5f 6f 70 74 5f 74 6c 73 31 31 2c 20 s1, _opt_tls11,
7ae0: 5f 6f 70 74 5f 74 6c 73 31 32 2c 20 5f 6f 70 74 _opt_tls12, _opt
7af0: 5f 74 6c 73 31 33 2c 0a 20 20 20 20 5f 6f 70 74 _tls13,. _opt
7b00: 5f 76 61 6c 69 64 61 74 65 2c 20 5f 6f 70 74 5f _validate, _opt_
7b10: 76 63 6d 64 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d vcmd.};../*. *--
7b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b60: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 -. *. * ImportOb
7b70: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
7b80: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
7b90: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
7ba0: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d ss the "ssl" com
7bb0: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 mand. *. *.The s
7bc0: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 sl command pushe
7bd0: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 s SSL over a (ne
7be0: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 wly connected) t
7bf0: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 cp socket. *. *
7c00: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
7c10: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
7c20: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
7c30: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f fects:. *.May mo
7c40: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f dify the behavio
7c50: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e r of an IO chann
7c60: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d el.. *. *-------
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
7cb0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f .static int.Impo
7cc0: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 rtObjCmd(ClientD
7cd0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
7ce0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
7cf0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
7d00: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
7d10: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
7d20: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
7d30: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
7d40: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
7d50: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
7d60: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e tePtr;../* clien
7d70: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
7d80: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 socket */. SS
7d90: 4c 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 L_CTX *ctx..= NU
7da0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 LL;. Tcl_Obj
7db0: 2a 63 6d 64 4f 62 6a 09 09 3d 20 4e 55 4c 4c 3b *cmdObj..= NULL;
7dc0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 . Tcl_Obj *pa
7dd0: 73 73 77 64 4f 62 6a 09 09 3d 20 4e 55 4c 4c 3b sswdObj..= NULL;
7de0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 . Tcl_Obj *vc
7df0: 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 md..= NULL;.
7e00: 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 Tcl_DString uppe
7e10: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
7e20: 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ion, upperChanne
7e30: 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 lBlocking, upper
7e40: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c ChannelEncoding,
7e50: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 upperChannelEOF
7e60: 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 Char;. int id
7e70: 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 x;. Tcl_Size
7e80: 66 6e 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 fn, len;. int
7e90: 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54 flags...= TLS_T
7ea0: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 CL_INIT;. int
7eb0: 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f server...= 0;./
7ec0: 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 * is connection
7ed0: 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 incoming or outg
7ee0: 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 oing? */. cha
7ef0: 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55 r *keyfile..= NU
7f00: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 LL;. char *ce
7f10: 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a rtfile..= NULL;.
7f20: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
7f30: 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a r *key..= NULL;.
7f40: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79 Tcl_Size key
7f50: 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75 _len..= 0;. u
7f60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 nsigned char *ce
7f70: 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 rt..= NULL;.
7f80: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 Tcl_Size cert_le
7f90: 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 n..= 0;. char
7fa0: 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c *ciphers..= NUL
7fb0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 L;. char *cip
7fc0: 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55 4c hersuites..= NUL
7fd0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 L;. char *CAf
7fe0: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ile..= NULL;.
7ff0: 20 63 68 61 72 20 2a 43 41 70 61 74 68 09 09 3d char *CApath..=
8000: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
8010: 2a 44 48 70 61 72 61 6d 73 09 09 3d 20 4e 55 4c *DHparams..= NUL
8020: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 L;. char *mod
8030: 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 el...= NULL;.
8040: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
8050: 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f e..= NULL;./* ho
8060: 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 stname for Serve
8070: 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f r Name Indicatio
8080: 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 n */. const u
8090: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 nsigned char *se
80a0: 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b ssion_id = NULL;
80b0: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 73 65 . Tcl_Size se
80c0: 73 73 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 ss_len..= 0;.
80d0: 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 4f 62 Tcl_Obj *alpnOb
80e0: 6a 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 j..= NULL;. i
80f0: 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c nt ssl2 = 0, ssl
8100: 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 3 = 0;. int t
8110: 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 ls1 = 1, tls1_1
8120: 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c = 1, tls1_2 = 1,
8130: 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 tls1_3 = 1;.
8140: 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 int proto = 0,
8150: 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 level = -1;.
8160: 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 int verify = 0,
8170: 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 require = 0, req
8180: 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 uest = 1, post_h
8190: 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a 20 20 andshake = 0;.
81a0: 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 (void) clientD
81b0: 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ata;.. dprint
81c0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 f("Called");..#i
81d0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
81e0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
81f0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 ENSSL_NO_TLS1).
8200: 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e tls1 = 0;.#en
8210: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
8220: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
8230: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8240: 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 _TLS1_1). tls
8250: 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 1_1 = 0;.#endif.
8260: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
8270: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
8280: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
8290: 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 1_2). tls1_2
82a0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 0;.#endif.#if
82b0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
82c0: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
82d0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
82e0: 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b . tls1_3 = 0;
82f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 .#endif.. if
8300: 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 (objc < 2) {..Tc
8310: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
8320: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
8330: 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e "channel ?option
8340: 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 s?");..return TC
8350: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
8360: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
8370: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e ror();.. chan
8380: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
8390: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
83a0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 tString(objv[1])
83b0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 , NULL);. if
83c0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
83d0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
83e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
83f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
8400: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
8410: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
8420: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
8430: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
8440: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
8450: 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 );.. for (idx
8460: 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 = 2; idx < objc
8470: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 69 66 20 28 ; idx++) {..if (
8480: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d Tcl_GetIndexFrom
8490: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
84a0: 5b 69 64 78 5d 2c 20 63 6f 6d 6d 61 6e 64 5f 6f [idx], command_o
84b0: 70 74 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 pts, "option", 0
84c0: 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b , &fn) != TCL_OK
84d0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
84e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
84f0: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 /* Validate arg
8500: 68 61 73 20 76 61 6c 75 65 20 2a 2f 0a 09 69 66 has value */..if
8510: 20 28 2b 2b 69 64 78 20 3e 3d 20 6f 62 6a 63 29 (++idx >= objc)
8520: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
8530: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
8540: 20 22 4e 6f 20 76 61 6c 75 65 20 66 6f 72 20 6f "No value for o
8550: 70 74 69 6f 6e 20 5c 22 22 2c 20 63 6f 6d 6d 61 ption \"", comma
8560: 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 22 5c 22 nd_opts[fn], "\"
8570: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
8580: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
8590: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 73 CL_ERROR;..}...s
85a0: 77 69 74 63 68 28 66 6e 29 20 7b 0a 09 63 61 73 witch(fn) {..cas
85b0: 65 20 5f 6f 70 74 5f 61 6c 70 6e 3a 0a 09 20 20 e _opt_alpn:..
85c0: 20 20 61 6c 70 6e 4f 62 6a 20 3d 20 6f 62 6a 76 alpnObj = objv
85d0: 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 [idx];.. brea
85e0: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 61 k;..case _opt_ca
85f0: 64 69 72 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 dir:.. GET_OP
8600: 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 T_STRING(objv[id
8610: 78 5d 2c 20 43 41 70 61 74 68 2c 20 4e 55 4c 4c x], CApath, NULL
8620: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 );.. break;..
8630: 63 61 73 65 20 5f 6f 70 74 5f 63 61 66 69 6c 65 case _opt_cafile
8640: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 :.. GET_OPT_S
8650: 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c TRING(objv[idx],
8660: 20 43 41 66 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a CAfile, NULL);.
8670: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 . break;..cas
8680: 65 20 5f 6f 70 74 5f 63 65 72 74 3a 0a 09 20 20 e _opt_cert:..
8690: 20 20 47 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41 GET_OPT_BYTE_A
86a0: 52 52 41 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 RRAY(objv[idx],
86b0: 63 65 72 74 2c 20 26 63 65 72 74 5f 6c 65 6e 29 cert, &cert_len)
86c0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 ;.. break;..c
86d0: 61 73 65 20 5f 6f 70 74 5f 63 65 72 74 66 69 6c ase _opt_certfil
86e0: 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f e:.. GET_OPT_
86f0: 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d STRING(objv[idx]
8700: 2c 20 63 65 72 74 66 69 6c 65 2c 20 4e 55 4c 4c , certfile, NULL
8710: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 );.. break;..
8720: 63 61 73 65 20 5f 6f 70 74 5f 63 69 70 68 65 72 case _opt_cipher
8730: 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 69 70 :..case _opt_cip
8740: 68 65 72 73 3a 0a 09 20 20 20 20 47 45 54 5f 4f hers:.. GET_O
8750: 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 PT_STRING(objv[i
8760: 64 78 5d 2c 20 63 69 70 68 65 72 73 2c 20 4e 55 dx], ciphers, NU
8770: 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b LL);.. break;
8780: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 69 70 68 ..case _opt_ciph
8790: 65 72 73 75 69 74 65 3a 0a 09 20 20 20 20 47 45 ersuite:.. GE
87a0: 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a T_OPT_STRING(obj
87b0: 76 5b 69 64 78 5d 2c 20 63 69 70 68 65 72 73 75 v[idx], ciphersu
87c0: 69 74 65 73 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ites, NULL);..
87d0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f break;..case _
87e0: 6f 70 74 5f 63 6d 64 3a 0a 09 20 20 20 20 63 6d opt_cmd:.. cm
87f0: 64 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d dObj = objv[idx]
8800: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 ;.. break;..c
8810: 61 73 65 20 5f 6f 70 74 5f 64 68 70 61 72 61 6d ase _opt_dhparam
8820: 73 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f s:.. GET_OPT_
8830: 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d STRING(objv[idx]
8840: 2c 20 44 48 70 61 72 61 6d 73 2c 20 4e 55 4c 4c , DHparams, NULL
8850: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 );.. break;..
8860: 63 61 73 65 20 5f 6f 70 74 5f 6b 65 79 3a 0a 09 case _opt_key:..
8870: 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59 54 45 GET_OPT_BYTE
8880: 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64 78 5d _ARRAY(objv[idx]
8890: 2c 20 6b 65 79 2c 20 26 6b 65 79 5f 6c 65 6e 29 , key, &key_len)
88a0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 ;.. break;..c
88b0: 61 73 65 20 5f 6f 70 74 5f 6b 65 79 66 69 6c 65 ase _opt_keyfile
88c0: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 :.. GET_OPT_S
88d0: 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c TRING(objv[idx],
88e0: 20 6b 65 79 66 69 6c 65 2c 20 4e 55 4c 4c 29 3b keyfile, NULL);
88f0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 .. break;..ca
8900: 73 65 20 5f 6f 70 74 5f 6d 6f 64 65 6c 3a 0a 09 se _opt_model:..
8910: 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 GET_OPT_STRI
8920: 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 6d 6f NG(objv[idx], mo
8930: 64 65 6c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 del, NULL);..
8940: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f break;..case _o
8950: 70 74 5f 70 61 73 73 77 6f 72 64 3a 0a 09 20 20 pt_password:..
8960: 20 20 70 61 73 73 77 64 4f 62 6a 20 3d 20 6f 62 passwdObj = ob
8970: 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 jv[idx];.. br
8980: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f eak;..case _opt_
8990: 68 61 6e 64 73 68 61 6b 65 3a 0a 09 20 20 20 20 handshake:..
89a0: 47 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a GET_OPT_BOOL(obj
89b0: 76 5b 69 64 78 5d 2c 20 26 70 6f 73 74 5f 68 61 v[idx], &post_ha
89c0: 6e 64 73 68 61 6b 65 29 3b 0a 09 20 20 20 20 62 ndshake);.. b
89d0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 reak;..case _opt
89e0: 5f 72 65 71 75 65 73 74 3a 0a 09 20 20 20 20 47 _request:.. G
89f0: 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a 76 ET_OPT_BOOL(objv
8a00: 5b 69 64 78 5d 2c 20 26 72 65 71 75 65 73 74 29 [idx], &request)
8a10: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 ;.. break;..c
8a20: 61 73 65 20 5f 6f 70 74 5f 72 65 71 75 69 72 65 ase _opt_require
8a30: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 :.. GET_OPT_B
8a40: 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 OOL(objv[idx], &
8a50: 72 65 71 75 69 72 65 29 3b 0a 09 20 20 20 20 62 require);.. b
8a60: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 reak;..case _opt
8a70: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 3a _security_level:
8a80: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e .. GET_OPT_IN
8a90: 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 6c 65 T(objv[idx], &le
8aa0: 76 65 6c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b vel);.. break
8ab0: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 65 72 ;..case _opt_ser
8ac0: 76 65 72 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 ver:.. GET_OP
8ad0: 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d T_BOOL(objv[idx]
8ae0: 2c 20 26 73 65 72 76 65 72 29 3b 0a 09 20 20 20 , &server);..
8af0: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f break;..case _o
8b00: 70 74 5f 73 65 72 76 65 72 6e 61 6d 65 3a 0a 09 pt_servername:..
8b10: 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 GET_OPT_STRI
8b20: 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 73 65 NG(objv[idx], se
8b30: 72 76 65 72 6e 61 6d 65 2c 20 4e 55 4c 4c 29 3b rvername, NULL);
8b40: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 .. break;..ca
8b50: 73 65 20 5f 6f 70 74 5f 73 65 73 73 69 6f 6e 5f se _opt_session_
8b60: 69 64 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 id:.. GET_OPT
8b70: 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 _BYTE_ARRAY(objv
8b80: 5b 69 64 78 5d 2c 20 73 65 73 73 69 6f 6e 5f 69 [idx], session_i
8b90: 64 2c 20 26 73 65 73 73 5f 6c 65 6e 29 3b 0a 09 d, &sess_len);..
8ba0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 break;..case
8bb0: 20 5f 6f 70 74 5f 73 73 6c 32 3a 0a 09 20 20 20 _opt_ssl2:..
8bc0: 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a GET_OPT_INT(obj
8bd0: 76 5b 69 64 78 5d 2c 20 26 73 73 6c 32 29 3b 0a v[idx], &ssl2);.
8be0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 . break;..cas
8bf0: 65 20 5f 6f 70 74 5f 73 73 6c 33 3a 0a 09 20 20 e _opt_ssl3:..
8c00: 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 GET_OPT_INT(ob
8c10: 6a 76 5b 69 64 78 5d 2c 20 26 73 73 6c 33 29 3b jv[idx], &ssl3);
8c20: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 .. break;..ca
8c30: 73 65 20 5f 6f 70 74 5f 74 6c 73 31 3a 0a 09 20 se _opt_tls1:..
8c40: 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f GET_OPT_INT(o
8c50: 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73 31 29 bjv[idx], &tls1)
8c60: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 ;.. break;..c
8c70: 61 73 65 20 5f 6f 70 74 5f 74 6c 73 31 31 3a 0a ase _opt_tls11:.
8c80: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 . GET_OPT_INT
8c90: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73 (objv[idx], &tls
8ca0: 31 5f 31 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 1_1);.. break
8cb0: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74 6c 73 ;..case _opt_tls
8cc0: 31 32 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 12:.. GET_OPT
8cd0: 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 _INT(objv[idx],
8ce0: 26 74 6c 73 31 5f 32 29 3b 0a 09 20 20 20 20 62 &tls1_2);.. b
8cf0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 reak;..case _opt
8d00: 5f 74 6c 73 31 33 3a 0a 09 20 20 20 20 47 45 54 _tls13:.. GET
8d10: 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 _OPT_INT(objv[id
8d20: 78 5d 2c 20 26 74 6c 73 31 5f 33 29 3b 0a 09 20 x], &tls1_3);..
8d30: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 break;..case
8d40: 5f 6f 70 74 5f 76 61 6c 69 64 61 74 65 3a 0a 09 _opt_validate:..
8d50: 63 61 73 65 20 5f 6f 70 74 5f 76 63 6d 64 3a 0a case _opt_vcmd:.
8d60: 09 20 20 20 20 76 63 6d 64 20 3d 20 6f 62 6a 76 . vcmd = objv
8d70: 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 [idx];.. brea
8d80: 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 k;..}. }..
8d90: 20 69 66 20 28 72 65 71 75 65 73 74 29 09 09 76 if (request)..v
8da0: 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 erify |= SSL_VER
8db0: 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 IFY_CLIENT_ONCE
8dc0: 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 | SSL_VERIFY_PEE
8dd0: 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 R;. if (reque
8de0: 73 74 20 26 26 20 72 65 71 75 69 72 65 29 09 76 st && require).v
8df0: 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 erify |= SSL_VER
8e00: 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 IFY_FAIL_IF_NO_P
8e10: 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 EER_CERT;. if
8e20: 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 (request && pos
8e30: 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72 t_handshake).ver
8e40: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
8e50: 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 Y_POST_HANDSHAKE
8e60: 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 79 ;. if (verify
8e70: 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20 3d == 0)..verify =
8e80: 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 SSL_VERIFY_NONE
8e90: 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 ;.. proto |=
8ea0: 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 (ssl2 ? TLS_PROT
8eb0: 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 O_SSL2 : 0);.
8ec0: 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 proto |= (ssl3
8ed0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 ? TLS_PROTO_SSL3
8ee0: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f : 0);. proto
8ef0: 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f |= (tls1 ? TLS_
8f00: 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b PROTO_TLS1 : 0);
8f10: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 . proto |= (t
8f20: 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 ls1_1 ? TLS_PROT
8f30: 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 O_TLS1_1 : 0);.
8f40: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 proto |= (tls
8f50: 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 1_2 ? TLS_PROTO_
8f60: 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 TLS1_2 : 0);.
8f70: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f proto |= (tls1_
8f80: 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 3 ? TLS_PROTO_TL
8f90: 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 S1_3 : 0);..
8fa0: 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c /* reset to NULL
8fb0: 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 if blank string
8fc0: 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 provided */.
8fd0: 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 if (cert && !*c
8fe0: 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63 65 ert).. ce
8ff0: 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c rt. = NUL
9000: 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 L;. if (key &
9010: 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 & !*key)..
9020: 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 key. =
9030: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 NULL;. if (ce
9040: 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 rtfile && !*cert
9050: 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 file) ce
9060: 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 rtfile.= NULL;.
9070: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 if (keyfile &
9080: 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 & !*keyfile)..ke
9090: 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 yfile. =
90a0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 NULL;. if (ci
90b0: 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 phers && !*ciphe
90c0: 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70 68 rs). ciph
90d0: 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ers. = NU
90e0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 LL;. if (ciph
90f0: 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 69 ersuites && !*ci
9100: 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70 68 phersuites) ciph
9110: 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55 ersuites = NU
9120: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 LL;. if (CAfi
9130: 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 le && !*CAfile).
9140: 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 CAfile.
9150: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
9160: 20 20 20 69 66 20 28 43 41 70 61 74 68 20 26 26 if (CApath &&
9170: 20 21 2a 43 41 70 61 74 68 29 09 20 20 20 20 20 !*CApath).
9180: 20 20 20 43 41 70 61 74 68 09 20 20 20 20 20 20 CApath.
9190: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
91a0: 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a (DHparams && !*
91b0: 44 48 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 DHparams).
91c0: 20 20 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 DHparams
91d0: 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f = NULL;.. /
91e0: 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 * new SSL state
91f0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 */. statePtr.
9200: 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 .= (State *) cka
9210: 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 lloc((unsigned)
9220: 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a sizeof(State));.
9230: 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 memset(state
9240: 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 Ptr, 0, sizeof(S
9250: 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 tate));.. sta
9260: 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 tePtr->flags.= f
9270: 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 lags;. stateP
9280: 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 tr->interp.= int
9290: 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 erp;. statePt
92a0: 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 r->vflags.= veri
92b0: 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 fy;. statePtr
92c0: 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 ->err.= "";..
92d0: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 /* allocate scr
92e0: 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 ipt */. if (c
92f0: 6d 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b mdObj != NULL) {
9300: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 ..(void) Tcl_Get
9310: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 63 6d StringFromObj(cm
9320: 64 4f 62 6a 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 dObj, &len);..if
9330: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 (len) {.. st
9340: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
9350: 20 3d 20 63 6d 64 4f 62 6a 3b 0a 09 20 20 20 20 = cmdObj;..
9360: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
9370: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
9380: 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a ack);..}. }..
9390: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 /* allocate
93a0: 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 password */.
93b0: 69 66 20 28 70 61 73 73 77 64 4f 62 6a 20 21 3d if (passwdObj !=
93c0: 20 4e 55 4c 4c 29 20 7b 0a 09 28 76 6f 69 64 29 NULL) {..(void)
93d0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
93e0: 6f 6d 4f 62 6a 28 70 61 73 73 77 64 4f 62 6a 2c omObj(passwdObj,
93f0: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e &len);..if (len
9400: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 ) {.. statePt
9410: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 r->password = pa
9420: 73 73 77 64 4f 62 6a 3b 0a 09 20 20 20 20 54 63 sswdObj;.. Tc
9430: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 l_IncrRefCount(s
9440: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
9450: 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 d);..}. }..
9460: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 /* allocate va
9470: 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a lidate command *
9480: 2f 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 /. if (vcmd)
9490: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 {..(void) Tcl_Ge
94a0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 tStringFromObj(v
94b0: 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 cmd, &len);..if
94c0: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 (len) {.. sta
94d0: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 tePtr->vcmd = vc
94e0: 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 md;.. Tcl_Inc
94f0: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
9500: 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 tr->vcmd);..}.
9510: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 }.. if (mod
9520: 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 el != NULL) {..i
9530: 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 nt mode;../* Get
9540: 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e the "model" con
9550: 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 text */..chan =
9560: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
9570: 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d nterp, model, &m
9580: 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 ode);..if (chan
9590: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
95a0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c NULL) {.. Tl
95b0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 s_Free((tls_free
95c0: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 _type *) statePt
95d0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
95e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
95f0: 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 /*.. * Make sure
9600: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
9610: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
9620: 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 el.. */..chan =
9630: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
9640: 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 l(chan);..if (Tc
9650: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
9660: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
9670: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
9680: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
9690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
96a0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
96b0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
96c0: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 e(chan),..."\":
96d0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
96e0: 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c l", (char *) NUL
96f0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
9700: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
9710: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
9720: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 ", "CHANNEL", "I
9730: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a NVALID", (char *
9740: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c ) NULL);.. Tl
9750: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 s_Free((tls_free
9760: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 _type *) statePt
9770: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
9780: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 TCL_ERROR;..}..c
9790: 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 tx = ((State *)T
97a0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
97b0: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 tanceData(chan))
97c0: 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 ->ctx;. } els
97d0: 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 e {..if ((ctx =
97e0: 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 CTX_Init(statePt
97f0: 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f r, server, proto
9800: 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66 , keyfile, certf
9810: 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 ile, key, cert,
9820: 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e 2c 0a 09 (int) key_len,..
9830: 20 20 20 20 28 69 6e 74 29 20 63 65 72 74 5f 6c (int) cert_l
9840: 65 6e 2c 20 43 41 70 61 74 68 2c 20 43 41 66 69 en, CApath, CAfi
9850: 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 le, ciphers, cip
9860: 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c hersuites, level
9870: 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 , DHparams)) ==
9880: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 NULL) {.. Tls
9890: 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f _Free((tls_free_
98a0: 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 type *) statePtr
98b0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
98c0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 CL_ERROR;..}.
98d0: 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 }.. statePtr
98e0: 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 ->ctx = ctx;..
98f0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e /*. * We n
9900: 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 eed to make sure
9910: 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 that the channe
9920: 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 l works in binar
9930: 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 y (for the.
9940: 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 * encryption not
9950: 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 to get goofed u
9960: 70 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 p).. */.
9970: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
9980: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
9990: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 nslation);. T
99a0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
99b0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
99c0: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 king);. Tcl_D
99d0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
99e0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
99f0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
9a00: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e gInit(&upperChan
9a10: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 nelEncoding);.
9a20: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
9a30: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
9a40: 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c han, "-eofchar",
9a50: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f &upperChannelEO
9a60: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f FChar);. Tcl_
9a70: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
9a80: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
9a90: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 -encoding", &upp
9aa0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
9ab0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 g);. Tcl_GetC
9ac0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
9ad0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 erp, chan, "-tra
9ae0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 nslation", &uppe
9af0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
9b00: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 ion);. Tcl_Ge
9b10: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
9b20: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 nterp, chan, "-b
9b30: 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 locking", &upper
9b40: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 ChannelBlocking)
9b50: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
9b60: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
9b70: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 p, chan, "-trans
9b80: 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 lation", "binary
9b90: 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ");. Tcl_SetC
9ba0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
9bb0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f erp, chan, "-blo
9bc0: 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b cking", "true");
9bd0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f . dprintf("Co
9be0: 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e nsuming Tcl chan
9bf0: 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 nel %s", Tcl_Get
9c00: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
9c10: 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 ));. statePtr
9c20: 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 ->self = Tcl_Sta
9c30: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 ckChannel(interp
9c40: 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 , Tls_ChannelTyp
9c50: 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 e(), (ClientData
9c60: 29 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54 43 ) statePtr,..(TC
9c70: 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c L_READABLE | TCL
9c80: 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e _WRITABLE), chan
9c90: 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 );. if (state
9ca0: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 Ptr->self == (Tc
9cb0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
9cc0: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 {../*.. * No us
9cd0: 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 e of Tcl_Eventua
9ce0: 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20 llyFree because
9cf0: 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f no possible Tcl_
9d00: 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 Preserve... */..
9d10: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 Tls_Free((tls_fr
9d20: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 ee_type *) state
9d30: 50 74 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 Ptr);..Tcl_DStri
9d40: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 ngFree(&upperCha
9d50: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 nnelTranslation)
9d60: 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ;..Tcl_DStringFr
9d70: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ee(&upperChannel
9d80: 45 6e 63 6f 64 69 6e 67 29 3b 0a 09 54 63 6c 5f Encoding);..Tcl_
9d90: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 DStringFree(&upp
9da0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
9db0: 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 );..Tcl_DStringF
9dc0: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 ree(&upperChanne
9dd0: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 09 72 65 74 lBlocking);..ret
9de0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
9df0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
9e00: 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e f("Created chann
9e10: 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 el named %s", Tc
9e20: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
9e30: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
9e40: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
9e50: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
9e60: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
9e70: 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f lf, "-translatio
9e80: 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 n", Tcl_DStringV
9e90: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
9ea0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b elTranslation));
9eb0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
9ec0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
9ed0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
9ee0: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 , "-encoding", T
9ef0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
9f00: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
9f10: 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c oding));. Tcl
9f20: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
9f30: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
9f40: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 tr->self, "-eofc
9f50: 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e har", Tcl_DStrin
9f60: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
9f70: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 nnelEOFChar));.
9f80: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
9f90: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
9fa0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 statePtr->self,
9fb0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c "-blocking", Tcl
9fc0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
9fd0: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
9fe0: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44 ing));. Tcl_D
9ff0: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
a000: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
a010: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ion);. Tcl_DS
a020: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
a030: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
a040: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
a050: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e gFree(&upperChan
a060: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 nelEOFChar);.
a070: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
a080: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c (&upperChannelBl
a090: 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a ocking);.. /*
a0a0: 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 . * SSL Init
a0b0: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 ialization.
a0c0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
a0d0: 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 >ssl = SSL_new(s
a0e0: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 tatePtr->ctx);.
a0f0: 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72 if (!statePtr
a100: 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c ->ssl) {../* SSL
a110: 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a library error *
a120: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 /..Tcl_AppendRes
a130: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 ult(interp, "cou
a140: 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 ldn't construct
a150: 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 ssl session: ",
a160: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
a170: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
a180: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
a190: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
a1a0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
a1b0: 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 "INIT", "FAILED
a1c0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
a1d0: 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 74 6c );..Tls_Free((tl
a1e0: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 s_free_type *) s
a1f0: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 tatePtr);..retur
a200: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
a210: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 }.. /* Set h
a220: 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 ost server name
a230: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 */. if (serve
a240: 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 rname) {../* Set
a250: 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d s the server nam
a260: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e e indication (SN
a270: 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c I) in ClientHell
a280: 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 o extension */..
a290: 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 2c /* Per RFC 6066,
a2a0: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 hostname is a A
a2b0: 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 SCII encoded str
a2c0: 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20 ing, though RFC
a2d0: 34 33 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e 4366 says UTF-8.
a2e0: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 */..if (!SSL_se
a2f0: 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 t_tlsext_host_na
a300: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c me(statePtr->ssl
a310: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 , servername) &&
a320: 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 require) {..
a330: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
a340: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 53 t(interp, "Set S
a350: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 NI extension fai
a360: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f led: ", GET_ERR_
a370: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
a380: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
a390: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
a3a0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
a3b0: 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 IMPORT", "SNI",
a3c0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
a3d0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
a3e0: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 ls_Free((tls_fre
a3f0: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 e_type *) stateP
a400: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
a410: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
a420: 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 ./* Set hostname
a430: 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 for peer certif
a440: 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 icate hostname v
a450: 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 erification in c
a460: 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 lients... Don'
a470: 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 t use SSL_set1_h
a480: 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 ost since it has
a490: 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f limitations. */
a4a0: 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f ..if (!SSL_add1_
a4b0: 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 host(statePtr->s
a4c0: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 sl, servername))
a4d0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
a4e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
a4f0: 20 22 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 "Set DNS hostna
a500: 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 me failed: ", GE
a510: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
a520: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
a530: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f . Tcl_SetErro
a540: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
a550: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 LS", "IMPORT", "
a560: 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c HOSTNAME", "FAIL
a570: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
a580: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
a590: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 ee((tls_free_typ
a5a0: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a e *) statePtr);.
a5b0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
a5c0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
a5d0: 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 . /* Resume s
a5e0: 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 ession id */.
a5f0: 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 if (session_id
a600: 26 26 20 73 65 73 73 5f 6c 65 6e 20 3c 3d 20 53 && sess_len <= S
a610: 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c SL_MAX_SID_CTX_L
a620: 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c ENGTH) {../* SSL
a630: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a _set_session() *
a640: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 /..if (!SSL_SESS
a650: 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 ION_set1_id_cont
a660: 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 ext(SSL_get_sess
a670: 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ion(statePtr->ss
a680: 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 l), session_id,
a690: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 (unsigned int) s
a6a0: 65 73 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 ess_len)) {..
a6b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
a6c0: 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d t(interp, "Resum
a6d0: 65 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64 e session failed
a6e0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
a6f0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
a700: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
a710: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
a720: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
a730: 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c ORT", "SESSION",
a740: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
a750: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
a760: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 Tls_Free((tls_fr
a770: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 ee_type *) state
a780: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
a790: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
a7a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e }.. /* En
a7b0: 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e able Application
a7c0: 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 -Layer Protocol
a7d0: 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 Negotiation. Exa
a7e0: 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f mples are: http/
a7f0: 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 1.0,..http/1.1,
a800: 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 h2, h3, ftp, ima
a810: 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c p, pop3, xmpp-cl
a820: 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 ient, xmpp-serve
a830: 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 r, mqtt, irc, et
a840: 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c c. */. if (al
a850: 70 6e 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b pnObj != NULL) {
a860: 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 ../* Convert a T
a870: 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 CL list into a p
a880: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 rotocol-list in
a890: 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 wire-format */..
a8a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
a8b0: 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 rotos, *p;..unsi
a8c0: 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f gned int protos_
a8d0: 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 len = 0;..Tcl_Si
a8e0: 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 ze cnt, i;..int
a8f0: 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 j;..Tcl_Obj **li
a900: 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 st;...if (Tcl_Li
a910: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 stObjGetElements
a920: 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 4f 62 6a (interp, alpnObj
a930: 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 , &cnt, &list) !
a940: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
a950: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 Tls_Free((tls_f
a960: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 ree_type *) stat
a970: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
a980: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
a990: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 .../* Determine
a9a0: 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 the memory requi
a9b0: 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 red for the prot
a9c0: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f ocol-list */..fo
a9d0: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e r (i = 0; i < cn
a9e0: 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 t; i++) {.. T
a9f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
aa00: 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 Obj(list[i], &le
aa10: 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e n);.. if (len
aa20: 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f > 255) {...Tcl_
aa30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
aa40: 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f erp, "ALPN proto
aa50: 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f col names too lo
aa60: 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ng", (char *) NU
aa70: 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 LL);...Tcl_SetEr
aa80: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
aa90: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
aaa0: 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 "ALPN", "FAILED
aab0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
aac0: 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 74 );...Tls_Free((t
aad0: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 ls_free_type *)
aae0: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 statePtr);...ret
aaf0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
ab00: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f }.. proto
ab10: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e s_len += 1 + (in
ab20: 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 t) len;..}.../*
ab30: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 Build the comple
ab40: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 te protocol-list
ab50: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b */..protos = ck
ab60: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e alloc(protos_len
ab70: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d );../* protocol-
ab80: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 lists consist of
ab90: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 8-bit length-pr
aba0: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 efixed, byte str
abb0: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 ings */..for (j
abc0: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b = 0, p = protos;
abd0: 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b j < cnt; j++) {
abe0: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 .. char *str
abf0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
ac00: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 romObj(list[j],
ac10: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b &len);.. *p++
ac20: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 = (unsigned cha
ac30: 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d r) len;.. mem
ac40: 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a cpy(p, str, (siz
ac50: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 e_t) len);..
ac60: 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f p += len;..}.../
ac70: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 * SSL_set_alpn_p
ac80: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f rotos makes a co
ac90: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 py of the protoc
aca0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e ol-list */../* N
acb0: 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 ote: This functi
acc0: 6f 6e 20 72 65 76 65 72 73 65 73 20 74 68 65 20 on reverses the
acd0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e return value con
ace0: 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 vention */..if (
acf0: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f SSL_set_alpn_pro
ad00: 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 tos(statePtr->ss
ad10: 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f l, protos, proto
ad20: 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 s_len)) {.. T
ad30: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
ad40: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c 50 interp, "Set ALP
ad50: 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c N protocols fail
ad60: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 ed: ", GET_ERR_R
ad70: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
ad80: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 ) NULL);.. Tc
ad90: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
ada0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
adb0: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 MPORT", "ALPN",
adc0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
add0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
ade0: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 ls_Free((tls_fre
adf0: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 e_type *) stateP
ae00: 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 tr);.. ckfree
ae10: 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 (protos);.. r
ae20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
ae30: 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 ..}.../* Store p
ae40: 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f rotocols list */
ae50: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
ae60: 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 os = protos;..st
ae70: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c atePtr->protos_l
ae80: 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b en = protos_len;
ae90: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 . } else {..s
aea0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
aeb0: 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 = NULL;..statePt
aec0: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 r->protos_len =
aed0: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0;. }.. /*
aee0: 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c . * SSL Call
aef0: 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 backs. */.
af00: 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 SSL_set_app_da
af10: 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ta(statePtr->ssl
af20: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
af30: 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 tr);./* point ba
af40: 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 ck to us */.
af50: 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 SSL_set_verify(s
af60: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 tatePtr->ssl, ve
af70: 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c rify, VerifyCall
af80: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 back);. SSL_s
af90: 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b et_info_callback
afa0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
afb0: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a InfoCallback);..
afc0: 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 /* Callback
afd0: 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72 for observing pr
afe0: 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 otocol messages
aff0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 */.#ifndef OPENS
b000: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a SL_NO_SSL_TRACE.
b010: 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f /* void SSL_
b020: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c CTX_set_msg_call
b030: 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 back_arg(statePt
b040: 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 r->ctx, (void *)
b050: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76 statePtr);. v
b060: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f oid SSL_CTX_set_
b070: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 msg_callback(sta
b080: 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 tePtr->ctx, Mess
b090: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f ageCallback); */
b0a0: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 . SSL_set_msg
b0b0: 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 _callback_arg(st
b0c0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f atePtr->ssl, (vo
b0d0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
b0e0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f SSL_set_msg_
b0f0: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
b100: 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 r->ssl, MessageC
b110: 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 allback);.#endif
b120: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
b130: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 Tcl_Channel BIO
b140: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 Handler */. s
b150: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d tatePtr->p_bio.=
b160: 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 BIO_new_tcl(sta
b170: 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f tePtr, BIO_NOCLO
b180: 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 SE);. statePt
b190: 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 r->bio.= BIO_new
b1a0: 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a (BIO_f_ssl());..
b1b0: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20 if (server)
b1c0: 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c {../* Server cal
b1d0: 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 lbacks */..SSL_C
b1e0: 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 TX_set_tlsext_se
b1f0: 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 rvername_arg(sta
b200: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 tePtr->ctx, (voi
b210: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 d *)statePtr);..
b220: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 SSL_CTX_set_tlse
b230: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 xt_servername_ca
b240: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d llback(statePtr-
b250: 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 >ctx, SNICallbac
b260: 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 k);..SSL_CTX_set
b270: 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 _client_hello_cb
b280: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
b290: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 HelloCallback, (
b2a0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
b2b0: 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d ;..if (statePtr-
b2c0: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 >protos != NULL)
b2d0: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f {.. SSL_CTX_
b2e0: 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f set_alpn_select_
b2f0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 cb(statePtr->ctx
b300: 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 , ALPNCallback,
b310: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
b320: 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 );.#ifdef USE_NP
b330: 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f N.. if (tls1_
b340: 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 2 == 0 && tls1_3
b350: 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 == 0) {...SSL_C
b360: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 TX_set_next_prot
b370: 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62 os_advertised_cb
b380: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
b390: 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f NPNCallback, (vo
b3a0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
b3b0: 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d . }.#endif..}
b3c0: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 .../* Enable ser
b3d0: 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74 ver to send cert
b3e0: 20 72 65 71 75 65 73 74 20 61 66 74 65 72 20 68 request after h
b3f0: 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e andshake (TLS 1.
b400: 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 3 only) */../* A
b410: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e write operation
b420: 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65 must take place
b430: 20 66 6f 72 20 74 68 65 20 43 65 72 74 69 66 69 for the Certifi
b440: 63 61 74 65 20 52 65 71 75 65 73 74 20 74 6f 20 cate Request to
b450: 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74 be.. sent to t
b460: 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 he client, this
b470: 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68 can be done with
b480: 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b SSL_do_handshak
b490: 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 e(). */..if (req
b4a0: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e uest && post_han
b4b0: 64 73 68 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 dshake && tls1_3
b4c0: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 ) {.. SSL_ver
b4d0: 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f ify_client_post_
b4e0: 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 handshake(stateP
b4f0: 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f tr->ssl);..}.../
b500: 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 * set automatic
b510: 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 curve selection
b520: 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 */..SSL_set_ecdh
b530: 5f 61 75 74 6f 28 73 74 61 74 65 50 74 72 2d 3e _auto(statePtr->
b540: 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 ssl, 1);.../* Se
b550: 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f t server mode */
b560: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
b570: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 s |= TLS_TCL_SER
b580: 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 VER;..SSL_set_ac
b590: 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 cept_state(state
b5a0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
b5b0: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 else {../* Clie
b5c0: 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a nt callbacks */.
b5d0: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 #ifdef USE_NPN..
b5e0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 if (statePtr->pr
b5f0: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 otos != NULL &&
b600: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 tls1_2 == 0 && t
b610: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 ls1_3 == 0) {..
b620: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e SSL_CTX_set_n
b630: 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 ext_proto_select
b640: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
b650: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c x, ALPNCallback,
b660: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
b670: 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 r);..}.#endif...
b680: 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69 /* Session cachi
b690: 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 ng */..SSL_CTX_s
b6a0: 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 et_session_cache
b6b0: 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e _mode(statePtr->
b6c0: 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 ctx, SSL_SESS_CA
b6d0: 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c CHE_CLIENT | SSL
b6e0: 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 _SESS_CACHE_NO_I
b6f0: 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a NTERNAL_STORE);.
b700: 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 .SSL_CTX_sess_se
b710: 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 t_new_cb(statePt
b720: 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 r->ctx, SessionC
b730: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 allback);.../* E
b740: 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 nable post hands
b750: 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74 hake Authenticat
b760: 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 ion extension. T
b770: 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 LS 1.3 only, not
b780: 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 http/2. */..if
b790: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 (request && post
b7a0: 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 _handshake) {..
b7b0: 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f SSL_set_post_
b7c0: 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73 handshake_auth(s
b7d0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 tatePtr->ssl, 1)
b7e0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c ;..}.../* Set cl
b7f0: 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 ient mode */..SS
b800: 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 L_set_connect_st
b810: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ate(statePtr->ss
b820: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 l);. }. SS
b830: 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 L_set_bio(stateP
b840: 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 tr->ssl, statePt
b850: 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 r->p_bio, stateP
b860: 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 tr->p_bio);.
b870: 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 BIO_set_ssl(stat
b880: 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 ePtr->bio, state
b890: 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f Ptr->ssl, BIO_NO
b8a0: 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a CLOSE);.. /*.
b8b0: 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 * End of SS
b8c0: 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 L Init. */.
b8d0: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
b8e0: 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 rning %s", Tcl_G
b8f0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
b900: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a atePtr->self));.
b910: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
b920: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 t(interp, (char
b930: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *) Tcl_GetChanne
b940: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
b950: 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 self), TCL_VOLAT
b960: 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 ILE);.. retur
b970: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
b980: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
b990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b9c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 ------. *. * Uni
b9d0: 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 mportObjCmd --.
b9e0: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
b9f0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ure is invoked t
ba00: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 o remove the top
ba10: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c most channel fil
ba20: 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ter.. *. * Resul
ba30: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
ba40: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
ba50: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
ba60: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 :. *.May modify
ba70: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 the behavior of
ba80: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 an IO channel..
ba90: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
baa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bad0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
bae0: 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f ic int.UnimportO
baf0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
bb00: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
bb10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
bb20: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
bb30: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
bb40: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ) {. Tcl_Chan
bb50: 6e 65 6c 20 63 68 61 6e 2c 20 63 68 69 6c 64 3b nel chan, child;
bb60: 09 2f 2a 20 54 68 65 20 73 74 61 63 6b 65 64 20 ./* The stacked
bb70: 61 6e 64 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 and underlying c
bb80: 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 20 20 54 hannels */. T
bb90: 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 cl_DString upper
bba0: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
bbb0: 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c on, upperChannel
bbc0: 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 Blocking, upperC
bbd0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 hannelEncoding,
bbe0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
bbf0: 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 har;. int res
bc00: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 28 = TCL_OK;. (
bc10: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
bc20: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
bc30: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
bc40: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
bc50: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
bc60: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
bc70: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
bc80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
bc90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
bca0: 56 61 6c 69 64 61 74 65 20 63 68 61 6e 6e 65 6c Validate channel
bcb0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 68 61 name */. cha
bcc0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
bcd0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
bce0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d etString(objv[1]
bcf0: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 ), NULL);. if
bd00: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
bd10: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
bd20: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
bd30: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
bd40: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
bd50: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
bd60: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a most channel */.
bd70: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
bd80: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
bd90: 6e 29 3b 0a 20 20 20 20 63 68 69 6c 64 20 3d 20 n);. child =
bda0: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 Tcl_GetStackedCh
bdb0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 annel(chan);..
bdc0: 20 20 2f 2a 20 56 65 72 69 66 79 20 69 73 20 61 /* Verify is a
bdd0: 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c stacked channel
bde0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 68 69 6c */. if (chil
bdf0: 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 d == NULL) {..Tc
be00: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
be10: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
be20: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
be30: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
be40: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
be50: 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 22 stacked channel"
be60: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
be70: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
be80: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
be90: 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 "TLS", "UNIMPORT
bea0: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 ", "CHANNEL", "I
beb0: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a NVALID", (char *
bec0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
bed0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
bee0: 7d 0a 0a 20 20 20 20 2f 2a 20 46 6c 75 73 68 20 }.. /* Flush
bef0: 61 6e 79 20 70 65 6e 64 69 6e 67 20 64 61 74 61 any pending data
bf00: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f */. if (Tcl_
bf10: 46 6c 75 73 68 28 63 68 61 6e 29 20 21 3d 20 54 Flush(chan) != T
bf20: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
bf30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
bf40: 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
bf50: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
bf60: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 nnelTranslation)
bf70: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
bf80: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e gInit(&upperChan
bf90: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 nelBlocking);.
bfa0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
bfb0: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 t(&upperChannelE
bfc0: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c OFChar);. Tcl
bfd0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
bfe0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
bff0: 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 ng);.. /* Get
c000: 20 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 20 current config
c010: 2d 20 45 4f 4c 20 74 72 61 6e 73 6c 61 74 69 6f - EOL translatio
c020: 6e 2c 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 20 n, encoding and
c030: 62 75 66 66 65 72 69 6e 67 20 6f 70 74 69 6f 6e buffering option
c040: 73 20 61 72 65 20 73 68 61 72 65 64 20 62 65 74 s are shared bet
c050: 77 65 65 6e 20 61 6c 6c 20 63 68 61 6e 6e 65 6c ween all channel
c060: 73 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 2a s in the stack *
c070: 2f 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 /. Tcl_GetCha
c080: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
c090: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b p, chan, "-block
c0a0: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e ing", &upperChan
c0b0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 nelBlocking);.
c0c0: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
c0d0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
c0e0: 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 han, "-encoding"
c0f0: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 , &upperChannelE
c100: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 ncoding);. Tc
c110: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_GetChannelOpti
c120: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
c130: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 "-eofchar", &up
c140: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 perChannelEOFCha
c150: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 r);. Tcl_GetC
c160: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
c170: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 erp, chan, "-tra
c180: 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 nslation", &uppe
c190: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
c1a0: 69 6f 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e ion);.. /* Un
c1b0: 73 74 61 63 6b 20 74 68 65 20 63 68 61 6e 6e 65 stack the channe
c1c0: 6c 20 61 6e 64 20 72 65 73 74 6f 72 65 20 75 6e l and restore un
c1d0: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c derlying channel
c1e0: 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20 69 config */. i
c1f0: 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 f (Tcl_UnstackCh
c200: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 annel(interp, ch
c210: 61 6e 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b an) == TCL_OK) {
c220: 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c ..Tcl_SetChannel
c230: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
c240: 68 69 6c 64 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 hild, "-encoding
c250: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 ", Tcl_DStringVa
c260: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 lue(&upperChanne
c270: 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 09 54 63 lEncoding));..Tc
c280: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
c290: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 69 6c 64 on(interp, child
c2a0: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 , "-eofchar", Tc
c2b0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
c2c0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
c2d0: 68 61 72 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 har));..Tcl_SetC
c2e0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
c2f0: 65 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d 74 72 erp, child, "-tr
c300: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f anslation", Tcl_
c310: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
c320: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
c330: 61 74 69 6f 6e 29 29 3b 0a 09 54 63 6c 5f 53 65 ation));..Tcl_Se
c340: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
c350: 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d nterp, child, "-
c360: 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 blocking", Tcl_D
c370: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
c380: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
c390: 67 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 g));. } else
c3a0: 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 {..res = TCL_ERR
c3b0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
c3c0: 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 * Clean-up */.
c3d0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
c3e0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 e(&upperChannelT
c3f0: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 ranslation);.
c400: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
c410: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e (&upperChannelEn
c420: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c coding);. Tcl
c430: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 _DStringFree(&up
c440: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 perChannelEOFCha
c450: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 r);. Tcl_DStr
c460: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 ingFree(&upperCh
c470: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a annelBlocking);.
c480: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a return res;.
c490: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
c4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
c4e0: 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 * CTX_Init -- c
c4f0: 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 onstruct a SSL_C
c500: 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 TX instance. *.
c510: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
c520: 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e valid SSL_CTX in
c530: 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a stance or NULL..
c540: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
c550: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 ts:. *.construct
c560: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 s SSL context (C
c570: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d TX). *. *-------
c580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
c5c0: 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 .static SSL_CTX
c5d0: 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 *.CTX_Init(State
c5e0: 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 *statePtr, int
c5f0: 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 isServer, int pr
c600: 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 oto, char *keyfi
c610: 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69 le, char *certfi
c620: 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 le,. unsigned
c630: 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 char *key, unsi
c640: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c gned char *cert,
c650: 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e int key_len, in
c660: 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72 t cert_len, char
c670: 20 2a 43 41 70 61 74 68 2c 0a 20 20 20 20 63 68 *CApath,. ch
c680: 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 ar *CAfile, char
c690: 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 *ciphers, char
c6a0: 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 *ciphersuites, i
c6b0: 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a nt level, char *
c6c0: 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 DHparams) {.
c6d0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
c6e0: 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp = statePtr->i
c6f0: 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 nterp;. SSL_C
c700: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a TX *ctx = NULL;.
c710: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
c720: 64 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 ds;. int off
c730: 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b 0a = 0, abort = 0;.
c740: 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 int load_pri
c750: 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f vate_key;. co
c760: 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a nst SSL_METHOD *
c770: 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 method;.. dpr
c780: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
c790: 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 . if (!proto)
c7a0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
c7b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f sult(interp, "no
c7c0: 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 valid protocol
c7d0: 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72 selected", (char
c7e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
c7f0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a rn NULL;. }..
c800: 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 /* create SS
c810: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 L context */.#if
c820: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
c830: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 _NUMBER >= 0x101
c840: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 00000L || define
c850: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 d(NO_SSL2) || de
c860: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
c870: 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 _SSL2). if (E
c880: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
c890: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b S_PROTO_SSL2)) {
c8a0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
c8b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 lt(interp, "SSL2
c8c0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
c8d0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
c8e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
c8f0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
c900: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
c910: 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 (NO_SSL3) || def
c920: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
c930: 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e SSL3). if (EN
c940: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
c950: 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a _PROTO_SSL3)) {.
c960: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
c970: 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 t(interp, "SSL3
c980: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
c990: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
c9a0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
c9b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
c9c0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
c9d0: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 NO_TLS1) || defi
c9e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
c9f0: 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 LS1). if (ENA
ca00: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
ca10: 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 PROTO_TLS1)) {..
ca20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
ca30: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e (interp, "TLS 1.
ca40: 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 0 protocol not s
ca50: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
ca60: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
ca70: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
ca80: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
ca90: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 d(NO_TLS1_1) ||
caa0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
cab0: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 NO_TLS1_1). i
cac0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
cad0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
cae0: 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 _1)) {..Tcl_Appe
caf0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
cb00: 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 "TLS 1.1 protoc
cb10: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
cb20: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
cb30: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
cb40: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 . }.#endif.#i
cb50: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
cb60: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
cb70: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
cb80: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 2). if (ENABL
cb90: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
cba0: 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 OTO_TLS1_2)) {..
cbb0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
cbc0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e (interp, "TLS 1.
cbd0: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 2 protocol not s
cbe0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
cbf0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
cc00: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
cc10: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
cc20: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 d(NO_TLS1_3) ||
cc30: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
cc40: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 NO_TLS1_3). i
cc50: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
cc60: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
cc70: 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 _3)) {..Tcl_Appe
cc80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
cc90: 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 "TLS 1.3 protoc
cca0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
ccb0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
ccc0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
ccd0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 . }.#endif.
cce0: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 if (proto == 0
ccf0: 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c ) {../* Use full
cd00: 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 range */..SSL_C
cd10: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f TX_set_min_proto
cd20: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 _version(ctx, 0)
cd30: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d ;..SSL_CTX_set_m
cd40: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e ax_proto_version
cd50: 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a (ctx, 0);. }.
cd60: 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f . switch (pro
cd70: 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 to) {.#if OPENSS
cd80: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
cd90: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 < 0x10100000L &
cda0: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 & !defined(NO_SS
cdb0: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L2) && !defined(
cdc0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
cdd0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
cde0: 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f OTO_SSL2:..metho
cdf0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 d = isServer ? S
ce00: 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 SLv2_server_meth
ce10: 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 od() : SSLv2_cli
ce20: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
ce30: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
ce40: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
ce50: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
ce60: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 PENSSL_NO_SSL3)
ce70: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
ce80: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 SSL_NO_SSL3_METH
ce90: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 OD). case TLS
cea0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 _PROTO_SSL3:..me
ceb0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
cec0: 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d ? SSLv3_server_m
ced0: 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f ethod() : SSLv3_
cee0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
cef0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
cf00: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
cf10: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 TLS1) && !define
cf20: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
cf30: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
cf40: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d PENSSL_NO_TLS1_M
cf50: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 ETHOD). case
cf60: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a TLS_PROTO_TLS1:.
cf70: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
cf80: 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 er ? TLSv1_serve
cf90: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 r_method() : TLS
cfa0: 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 v1_client_method
cfb0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
cfc0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
cfd0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
cfe0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
cff0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
d000: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d010: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a _TLS1_1_METHOD).
d020: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
d030: 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 TO_TLS1_1:..meth
d040: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
d050: 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d TLSv1_1_server_m
d060: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f ethod() : TLSv1_
d070: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 1_client_method(
d080: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
d090: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
d0a0: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
d0b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d0c0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
d0d0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d0e0: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_2_METHOD).
d0f0: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
d100: 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f O_TLS1_2:..metho
d110: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
d120: 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 LSv1_2_server_me
d130: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 thod() : TLSv1_2
d140: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
d150: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
d160: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
d170: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 _TLS1_3) && !def
d180: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d190: 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 TLS1_3). case
d1a0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
d1b0: 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 3:../* Use the g
d1c0: 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e eneric method an
d1d0: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e d constraint ran
d1e0: 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 ge after context
d1f0: 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 is created */..
d200: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
d210: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d r ? TLS_server_m
d220: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c ethod() : TLS_cl
d230: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
d240: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 break;.#endif.
d250: 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e default:../* N
d260: 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 egotiate highest
d270: 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 available SSL/T
d280: 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d LS version */..m
d290: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
d2a0: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 ? TLS_server_me
d2b0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 thod() : TLS_cli
d2c0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 ent_method();.#i
d2d0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
d2e0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
d2f0: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 00000L && !defin
d300: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 ed(NO_SSL2) && !
d310: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d320: 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d NO_SSL2)..off |=
d330: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
d340: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 TLS_PROTO_SSL2)
d350: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f ? 0 : SSL_OP_
d360: 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 NO_SSLv2);.#endi
d370: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
d380: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
d390: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
d3a0: 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e SL3)..off |= (EN
d3b0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
d3c0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f _PROTO_SSL3) ?
d3d0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 0 : SSL_OP_NO_S
d3e0: 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 SLv3);.#endif.#i
d3f0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
d400: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
d410: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
d420: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
d430: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
d440: 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a TO_TLS1) ? 0 :
d450: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
d460: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
d470: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
d480: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d490: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
d4a0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
d4b0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
d4c0: 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a TO_TLS1_1) ? 0 :
d4d0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
d4e0: 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 _1);.#endif.#if
d4f0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
d500: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
d510: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
d520: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 2)..off |= (ENAB
d530: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
d540: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 ROTO_TLS1_2) ? 0
d550: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
d560: 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 v1_2);.#endif.#i
d570: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
d580: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
d590: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d5a0: 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 1_3)..off |= (EN
d5b0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
d5c0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f _PROTO_TLS1_3) ?
d5d0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
d5e0: 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a LSv1_3);.#endif.
d5f0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 .break;. }..
d600: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 ERR_clear_err
d610: 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d or();.. ctx =
d620: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 SSL_CTX_new(met
d630: 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 hod);. if (!c
d640: 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 tx) {..return NU
d650: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 LL;. }.. i
d660: 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 f (getenv(SSLKEY
d670: 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c LOGFILE)) {..SSL
d680: 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f _CTX_set_keylog_
d690: 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 callback(ctx, Ke
d6a0: 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 yLogCallback);.
d6b0: 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e }..#if !defin
d6c0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 ed(NO_TLS1_3) &&
d6d0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
d6e0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
d6f0: 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c if (proto == TL
d700: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 S_PROTO_TLS1_3)
d710: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d {..SSL_CTX_set_m
d720: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e in_proto_version
d730: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 (ctx, TLS1_3_VER
d740: 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f SION);..SSL_CTX_
d750: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 set_max_proto_ve
d760: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f rsion(ctx, TLS1_
d770: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 3_VERSION);.
d780: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a }.#endif.. /*
d790: 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 Force cipher se
d7a0: 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 lection order by
d7b0: 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 server */. i
d7c0: 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a f (!isServer) {.
d7d0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 .SSL_CTX_set_opt
d7e0: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 ions(ctx, SSL_OP
d7f0: 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 _CIPHER_SERVER_P
d800: 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 REFERENCE);.
d810: 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 }..#if OPENSSL_V
d820: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
d830: 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 0x10100000L.
d840: 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f OpenSSL_add_all_
d850: 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a algorithms(); /*
d860: 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 6e Load ciphers an
d870: 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e d digests */.#en
d880: 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 dif.. SSL_CTX
d890: 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 _set_app_data(ct
d8a0: 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 x, (void*)interp
d8b0: 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 );./* remember t
d8c0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a he interpreter *
d8d0: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 /. SSL_CTX_se
d8e0: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 t_options(ctx, S
d8f0: 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 SL_OP_ALL);./* a
d900: 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 ll SSL bug worka
d910: 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 rounds */. SS
d920: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e L_CTX_set_option
d930: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f s(ctx, SSL_OP_NO
d940: 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f _COMPRESSION);./
d950: 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 * disable compre
d960: 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 ssion even if su
d970: 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 pported */. S
d980: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
d990: 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f ns(ctx, off);../
d9a0: 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 * disable protoc
d9b0: 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 ol versions */.#
d9c0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
d9d0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
d9e0: 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 101000L. SSL_
d9f0: 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 CTX_set_mode(ctx
da00: 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f , SSL_MODE_AUTO_
da10: 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c RETRY);./* handl
da20: 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 e new handshakes
da30: 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 in background.
da40: 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e On by default in
da50: 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 OpenSSL 1.1.1.
da60: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 */.#endif. SS
da70: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 L_CTX_sess_set_c
da80: 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 ache_size(ctx, 1
da90: 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 28);.. /* Set
daa0: 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 user defined ci
dab0: 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 phers, cipher su
dac0: 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 ites, and securi
dad0: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 ty level */.
dae0: 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 if ((ciphers !=
daf0: 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 NULL) && !SSL_CT
db00: 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 X_set_cipher_lis
db10: 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 t(ctx, ciphers))
db20: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
db30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 sult(interp, "Se
db40: 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 t ciphers failed
db50: 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 : No valid ciphe
db60: 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 rs", (char *) NU
db70: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 LL);..SSL_CTX_fr
db80: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e ee(ctx);..return
db90: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
dba0: 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69 74 if ((ciphersuit
dbb0: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 es != NULL) && !
dbc0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 SSL_CTX_set_ciph
dbd0: 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 ersuites(ctx, ci
dbe0: 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 phersuites)) {..
dbf0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
dc00: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 (interp, "Set ci
dc10: 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c pher suites fail
dc20: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 ed: No valid cip
dc30: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 hers", (char *)
dc40: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f NULL);..SSL_CTX_
dc50: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 free(ctx);..retu
dc60: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a rn NULL;. }..
dc70: 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 /* Set secur
dc80: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 ity level */.
dc90: 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 if (level > -1
dca0: 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a && level < 6) {.
dcb0: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 ./* SSL_set_secu
dcc0: 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 rity_level */..S
dcd0: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 SL_CTX_set_secur
dce0: 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c ity_level(ctx, l
dcf0: 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 evel);. }..
dd00: 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 /* set some ca
dd10: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 llbacks */. S
dd20: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 SL_CTX_set_defau
dd30: 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 lt_passwd_cb(ctx
dd40: 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 , PasswordCallba
dd50: 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 ck);. SSL_CTX
dd60: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 _set_default_pas
dd70: 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 swd_cb_userdata(
dd80: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ctx, (void *)sta
dd90: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 tePtr);.. /*
dda0: 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 read a Diffie-He
ddb0: 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 llman parameters
ddc0: 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 file, or use th
ddd0: 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a e built-in one *
dde0: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e /. Tcl_DStrin
ddf0: 67 49 6e 69 74 28 26 64 73 29 3b 0a 23 69 66 64 gInit(&ds);.#ifd
de00: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 ef OPENSSL_NO_DH
de10: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d . if (DHparam
de20: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 s != NULL) {..Tc
de30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
de40: 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d nterp, "DH param
de50: 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 eter support not
de60: 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 available", (ch
de70: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 ar *) NULL);..SS
de80: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
de90: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
dea0: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b }.#else. {
deb0: 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 ..DH* dh;..if (D
dec0: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 Hparams != NULL)
ded0: 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f {.. BIO *bio
dee0: 3b 0a 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 ;... bio = BI
def0: 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 O_new_file(F2N(D
df00: 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 Hparams, &ds), "
df10: 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 r");.. if (!b
df20: 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 io) {...Tcl_DStr
df30: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 ingFree(&ds);...
df40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
df50: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 (interp, "Could
df60: 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 not find DH para
df70: 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 meters file", (c
df80: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
df90: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
dfa0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
dfb0: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 ;.. }... d
dfc0: 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f h = PEM_read_bio
dfd0: 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e _DHparams(bio, N
dfe0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 ULL, NULL, NULL)
dff0: 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 ;.. BIO_free(
e000: 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 bio);.. Tcl_D
e010: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
e020: 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b .. if (!dh) {
e030: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
e040: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 ult(interp, "Cou
e050: 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 ld not read DH p
e060: 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 arameters from f
e070: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ile", (char *) N
e080: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
e090: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
e0a0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
e0b0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
e0c0: 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 t_tmp_dh(ctx, dh
e0d0: 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28 );.. DH_free(
e0e0: 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a dh);...} else {.
e0f0: 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c . /* Use well
e100: 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 known DH parame
e110: 74 65 72 73 20 74 68 61 74 20 68 61 76 65 20 62 ters that have b
e120: 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 uilt-in support
e130: 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 in OpenSSL */..
e140: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f if (!SSL_CTX_
e150: 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c set_dh_auto(ctx,
e160: 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 1)) {...Tcl_App
e170: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
e180: 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 , "Could not ena
e190: 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a ble set DH auto:
e1a0: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 ", GET_ERR_REAS
e1b0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
e1c0: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
e1d0: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
e1e0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
e1f0: 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 ..}. }.#endif
e200: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 .. /* set our
e210: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
e220: 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 load_private
e230: 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 _key = 0;. if
e240: 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 (certfile != NU
e250: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 LL) {..load_priv
e260: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 69 ate_key = 1;...i
e270: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
e280: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 ertificate_file(
e290: 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c ctx, F2N(certfil
e2a0: 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c e, &ds), SSL_FIL
e2b0: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 ETYPE_PEM) <= 0)
e2c0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 {.. Tcl_DStr
e2d0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
e2e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
e2f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
e300: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 ble to set certi
e310: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 ficate file ", c
e320: 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 ertfile, ": ",..
e330: 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 .GET_ERR_REASON(
e340: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
e350: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
e360: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 free(ctx);..
e370: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a return NULL;..}.
e380: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
e390: 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65 6c (&ds);.. } el
e3a0: 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e se if (cert != N
e3b0: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 ULL) {..load_pri
e3c0: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 vate_key = 1;..i
e3d0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
e3e0: 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 ertificate_ASN1(
e3f0: 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 ctx, cert_len, c
e400: 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 ert) <= 0) {..
e410: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
e420: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 lt(interp, "unab
e430: 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 le to set certif
e440: 69 63 61 74 65 3a 20 22 2c 0a 09 09 47 45 54 5f icate: ",...GET_
e450: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
e460: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
e470: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 SSL_CTX_free(
e480: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ctx);.. retur
e490: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 20 20 20 20 n NULL;..}..
e4a0: 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 } else {..certfi
e4b0: 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 le = (char*)X509
e4c0: 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 _get_default_cer
e4d0: 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 t_file();...if (
e4e0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 SSL_CTX_use_cert
e4f0: 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 ificate_file(ctx
e500: 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f , certfile, SSL_
e510: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d FILETYPE_PEM) <=
e520: 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 0) {.#if 0..
e530: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
e540: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
e550: 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 e to use default
e560: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c certificate fil
e570: 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 e ", certfile, "
e580: 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 : ",...GET_ERR_R
e590: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
e5a0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 ) NULL);.. SS
e5b0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
e5c0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
e5d0: 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 L;.#endif..}.
e5e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f }.. /* set o
e5f0: 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a ur private key *
e600: 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 /. if (load_p
e610: 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 rivate_key) {..i
e620: 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 f (keyfile == NU
e630: 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c LL && key == NUL
e640: 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c L) {.. keyfil
e650: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d e = certfile;..}
e660: 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 ...if (keyfile !
e670: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f = NULL) {.. /
e680: 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 * get the privat
e690: 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 e key associated
e6a0: 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 with this certi
e6b0: 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 ficate */.. i
e6c0: 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 f (keyfile == NU
e6d0: 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 LL) {...keyfile
e6e0: 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 = certfile;..
e6f0: 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c }... if (SSL
e700: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 _CTX_use_Private
e710: 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 Key_file(ctx, F2
e720: 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c N(keyfile, &ds),
e730: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 SSL_FILETYPE_PE
e740: 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c M) <= 0) {...Tcl
e750: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
e760: 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 );.../* flush th
e770: 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 e passphrase whi
e780: 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 ch might be left
e790: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a in the result *
e7a0: 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c /...Tcl_SetResul
e7b0: 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 t(interp, NULL,
e7c0: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 TCL_STATIC);...T
e7d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e7e0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
e7f0: 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 to set public ke
e800: 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c y file ", keyfil
e810: 65 2c 20 22 20 22 2c 0a 09 09 20 20 20 20 47 45 e, " ",... GE
e820: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
e830: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
e840: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
e850: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
e860: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 LL;.. }..
e870: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
e880: 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 &ds);...} else i
e890: 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 f (key != NULL)
e8a0: 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 {.. if (SSL_C
e8b0: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 TX_use_PrivateKe
e8c0: 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f y_ASN1(EVP_PKEY_
e8d0: 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 RSA, ctx, key,ke
e8e0: 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 y_len) <= 0) {..
e8f0: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 ./* flush the pa
e900: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d ssphrase which m
e910: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 ight be left in
e920: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 the result */...
e930: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
e940: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f terp, NULL, TCL_
e950: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 STATIC);...Tcl_A
e960: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
e970: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
e980: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 et public key: "
e990: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
e9a0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
e9b0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
e9c0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
e9d0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 n NULL;.. }..
e9e0: 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f }../* Now we kno
e9f0: 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 w that a key and
ea00: 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 cert have been
ea10: 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 set against.. *
ea20: 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 the SSL context
ea30: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 */..if (!SSL_CTX
ea40: 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b _check_private_k
ea50: 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 ey(ctx)) {..
ea60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
ea70: 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 (interp, "privat
ea80: 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d e key does not m
ea90: 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69 atch the certifi
eaa0: 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 cate public key"
eab0: 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20 ,.... (char
eac0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
ead0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
eae0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
eaf0: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 LL;..}. }..
eb00: 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 20 /* Set to use
eb10: 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e default location
eb20: 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 65 and file for Ce
eb30: 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 rtificate Author
eb40: 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66 69 ity (CA) certifi
eb50: 63 61 74 65 73 2e 20 54 68 65 0a 20 20 20 20 20 cates. The.
eb60: 2a 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e * verify path an
eb70: 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65 20 6f d store can be o
eb80: 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 verridden by the
eb90: 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e SSL_CERT_DIR en
eba0: 76 20 76 61 72 2e 20 54 68 65 20 76 65 72 69 66 v var. The verif
ebb0: 79 20 66 69 6c 65 20 63 61 6e 0a 20 20 20 20 20 y file can.
ebc0: 2a 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 * be overridden
ebd0: 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f by the SSL_CERT_
ebe0: 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f FILE env var. */
ebf0: 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 . if (!SSL_CT
ec00: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 X_set_default_ve
ec10: 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 rify_paths(ctx))
ec20: 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 {..abort++;.
ec30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 72 }.. /* Overr
ec40: 69 64 65 73 20 66 6f 72 20 74 68 65 20 43 41 20 ides for the CA
ec50: 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 verify path and
ec60: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 file */. {.#i
ec70: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
ec80: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
ec90: 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70 61 00000L..if (CApa
eca0: 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 th != NULL || CA
ecb0: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
ecc0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
ecd0: 20 64 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f 44 ds1;.. Tcl_D
ece0: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 StringInit(&ds1)
ecf0: 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c ;... if (!SSL
ed00: 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 _CTX_load_verify
ed10: 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 _locations(ctx,
ed20: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 F2N(CAfile, &ds)
ed30: 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 , F2N(CApath, &d
ed40: 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b s1))) {...abort+
ed50: 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 +;.. }.. T
ed60: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
ed70: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 ds);.. Tcl_DS
ed80: 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b tringFree(&ds1);
ed90: 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 ... /* Set li
eda0: 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e st of CAs to sen
edb0: 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e d to client when
edc0: 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c requesting a cl
edd0: 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 ient certificate
ede0: 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 */.. /* http
edf0: 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e s://sourceforge.
ee00: 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 net/p/tls/bugs/5
ee10: 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 7/ */.. /* XX
ee20: 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 X:TODO: Let the
ee30: 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 user supply valu
ee40: 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 es here instead
ee50: 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 of something tha
ee60: 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 t exists on the
ee70: 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 filesystem */..
ee80: 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 STACK_OF(X509
ee90: 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 _NAME) *certName
eea0: 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 s = SSL_load_cli
eeb0: 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 ent_CA_file(F2N(
eec0: 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 CAfile, &ds));..
eed0: 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 if (certName
eee0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 s != NULL) {...S
eef0: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
ef00: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 t_CA_list(ctx, c
ef10: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 ertNames);..
ef20: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
ef30: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a ngFree(&ds);..}.
ef40: 0a 23 65 6c 73 65 0a 09 69 66 20 28 43 41 70 61 .#else..if (CApa
ef50: 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 th != NULL) {..
ef60: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f if (!SSL_CTX_
ef70: 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28 load_verify_dir(
ef80: 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c ctx, F2N(CApath,
ef90: 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 &ds))) {...abor
efa0: 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 t++;.. }..
efb0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
efc0: 28 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28 43 (&ds);..}..if (C
efd0: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b Afile != NULL) {
efe0: 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 .. if (!SSL_C
eff0: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 TX_load_verify_f
f000: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 ile(ctx, F2N(CAf
f010: 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 ile, &ds))) {...
f020: 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a abort++;.. }.
f030: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
f040: 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 Free(&ds);...
f050: 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 /* Set list of
f060: 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 CAs to send to c
f070: 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 lient when reque
f080: 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 sting a client c
f090: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 ertificate */..
f0a0: 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 STACK_OF(X509
f0b0: 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 _NAME) *certName
f0c0: 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 s = SSL_load_cli
f0d0: 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 ent_CA_file(F2N(
f0e0: 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 CAfile, &ds));..
f0f0: 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 if (certName
f100: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 s != NULL) {...S
f110: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
f120: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 t_CA_list(ctx, c
f130: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 ertNames);..
f140: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
f150: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a ngFree(&ds);..}.
f160: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
f170: 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a return ctx;.}.
f180: 0c 0a 2f 2a 0a 20 2a 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 2d 0a 20 2a 0a 20 2a ----------. *. *
f1d0: 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d StatusObjCmd --
f1e0: 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 return certific
f1f0: 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 ate for connecte
f200: 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 d peer.. *. * Re
f210: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
f220: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
f230: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
f240: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
f250: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
f260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f290: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
f2a0: 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 c int.StatusObjC
f2b0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
f2c0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
f2d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
f2e0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
f2f0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
f300: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
f310: 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a ePtr;. X509 *
f320: 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 peer;. Tcl_Ob
f330: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 j *objPtr;. T
f340: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
f350: 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e . char *chann
f360: 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 elName, *ciphers
f370: 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a ;. int mode;.
f380: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
f390: 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a ed char *proto;.
f3a0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
f3b0: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 len;. int ni
f3c0: 64 2c 20 72 65 73 3b 0a 20 20 20 20 28 76 6f 69 d, res;. (voi
f3d0: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a d) clientData;..
f3e0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
f3f0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
f400: 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 objc < 2 || objc
f410: 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d > 3 || (objc ==
f420: 20 33 20 26 26 20 21 73 74 72 63 6d 70 28 54 63 3 && !strcmp(Tc
f430: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
f440: 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 [1]), "-local"))
f450: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
f460: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
f470: 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f objv, "?-local?
f480: 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 channel");..ret
f490: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
f4a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 }.. /* Get
f4b0: 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 channel Id */.
f4c0: 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d channelName =
f4d0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
f4e0: 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f bjv[(objc == 2 ?
f4f0: 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63 1 : 2)]);. c
f500: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
f510: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 nnel(interp, cha
f520: 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 nnelName, &mode)
f530: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
f540: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
f550: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
f560: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
f570: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
f580: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
f590: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
f5a0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
f5b0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
f5c0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
f5d0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
f5e0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
f5f0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
f600: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
f610: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
f620: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
f630: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
f640: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
f650: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
f660: 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e nel", (char *) N
f670: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 ULL);..Tcl_SetEr
f680: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
f690: 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c "TLS", "STATUS",
f6a0: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
f6b0: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
f6c0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
f6d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
f6e0: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
f6f0: 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 State *) Tcl_Get
f700: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
f710: 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 ata(chan);..
f720: 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61 /* Get certifica
f730: 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 te for peer or s
f740: 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f elf */. if (o
f750: 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 bjc == 2) {..pee
f760: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 r = SSL_get_peer
f770: 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 _certificate(sta
f780: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
f790: 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 } else {..peer
f7a0: 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 = SSL_get_certif
f7b0: 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e icate(statePtr->
f7c0: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ssl);. }..
f7d0: 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 /* Get X509 cer
f7e0: 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f tificate info */
f7f0: 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b . if (peer) {
f800: 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e ..objPtr = Tls_N
f810: 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 ewX509Obj(interp
f820: 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 , peer);..if (ob
f830: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 jc == 2) {..
f840: 58 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b X509_free(peer);
f850: 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c .. peer = NUL
f860: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 L;..}. } else
f870: 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c {..objPtr = Tcl
f880: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
f890: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ULL);. }..
f8a0: 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f /* Peer name */
f8b0: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
f8c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f8d0: 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c "peername", SSL
f8e0: 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 _get0_peername(s
f8f0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d tatePtr->ssl), -
f900: 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 1);. LAPPEND_
f910: 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
f920: 74 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c tr, "sbits", SSL
f930: 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 _get_cipher_bits
f940: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
f950: 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 NULL));.. cip
f960: 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 hers = (char*)SS
f970: 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 L_get_cipher(sta
f980: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
f990: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
f9a0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 erp, objPtr, "ci
f9b0: 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 pher", ciphers,
f9c0: 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 -1);.. /* Ver
f9d0: 69 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 ify the X509 cer
f9e0: 74 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 tificate present
f9f0: 65 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a ed by the peer *
fa00: 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 /. LAPPEND_ST
fa10: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
fa20: 2c 20 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 , "verifyResult"
fa30: 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 ,..X509_verify_c
fa40: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 ert_error_string
fa50: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f (SSL_get_verify_
fa60: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d result(statePtr-
fa70: 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 >ssl)), -1);..
fa80: 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 /* Verify mode
fa90: 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 */. mode = S
faa0: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f SL_get_verify_mo
fab0: 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c de(statePtr->ssl
fac0: 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 );. if (mode
fad0: 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f && SSL_VERIFY_NO
fae0: 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 NE) {..LAPPEND_S
faf0: 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
fb00: 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c r, "verifyMode",
fb10: 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 "none", -1);.
fb20: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f } else {..Tcl_
fb30: 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 Obj *listObjPtr
fb40: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
fb50: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 (0, NULL);..if (
fb60: 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
fb70: 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20 FY_PEER) {..
fb80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
fb90: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
fba0: 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c listObjPtr, Tcl
fbb0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 _NewStringObj("p
fbc0: 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 eer", -1));..}..
fbd0: 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f if (mode && SSL_
fbe0: 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e VERIFY_FAIL_IF_N
fbf0: 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 O_PEER_CERT) {..
fc00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
fc10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
fc20: 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c erp, listObjPtr,
fc30: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
fc40: 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 j("fail if no pe
fc50: 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a er cert", -1));.
fc60: 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 .}..if (mode &&
fc70: 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e SSL_VERIFY_CLIEN
fc80: 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 T_ONCE) {.. T
fc90: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
fca0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
fcb0: 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f listObjPtr, Tcl_
fcc0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c NewStringObj("cl
fcd0: 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 ient once", -1))
fce0: 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 ;..}..if (mode &
fcf0: 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 & SSL_VERIFY_POS
fd00: 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 T_HANDSHAKE) {..
fd10: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
fd20: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
fd30: 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c erp, listObjPtr,
fd40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
fd50: 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b j("post handshak
fd60: 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 e", -1));..}..LA
fd70: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
fd80: 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 , objPtr, "verif
fd90: 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 yMode", listObjP
fda0: 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f tr). }.. /
fdb0: 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 * Verify mode de
fdc0: 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 pth */. LAPPE
fdd0: 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
fde0: 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44 65 bjPtr, "verifyDe
fdf0: 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 pth", SSL_get_ve
fe00: 72 69 66 79 5f 64 65 70 74 68 28 73 74 61 74 65 rify_depth(state
fe10: 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 Ptr->ssl));..
fe20: 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 /* Report the s
fe30: 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
fe40: 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
fe50: 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 the negotiation
fe60: 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f */. SSL_get0_
fe70: 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 alpn_selected(st
fe80: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 atePtr->ssl, &pr
fe90: 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 oto, &len);.
fea0: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
feb0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 rp, objPtr, "alp
fec0: 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 n", (char *)prot
fed0: 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 o, (Tcl_Size) le
fee0: 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f n);. LAPPEND_
fef0: 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
ff00: 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 tr, "protocol",
ff10: 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 SSL_get_version(
ff20: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 statePtr->ssl),
ff30: 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c -1);.. /* Val
ff40: 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 id for non-RSA s
ff50: 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 ignature and TLS
ff60: 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 1.3 */. if (
ff70: 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 objc == 2) {..re
ff80: 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 s = SSL_get_peer
ff90: 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 _signature_nid(s
ffa0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e tatePtr->ssl, &n
ffb0: 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 id);. } else
ffc0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 {..res = SSL_get
ffd0: 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 _signature_nid(s
ffe0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e tatePtr->ssl, &n
fff0: 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 id);. }. i
10000 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 f (!res) {nid =
10010 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 0;}. LAPPEND_
10020 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
10030 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 tr, "signatureHa
10040 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 shAlgorithm", OB
10050 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d J_nid2ln(nid), -
10060 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 65 1);.. /* Adde
10070 64 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 d in OpenSSL 1.1
10080 2e 31 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 .1a */.#if OPENS
10090 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
100a0 52 20 3e 20 30 78 31 30 31 30 31 30 30 30 4c 0a R > 0x10101000L.
100b0 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 if (objc ==
100c0 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 2) {..res = SSL_
100d0 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 get_peer_signatu
100e0 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 re_type_nid(stat
100f0 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 ePtr->ssl, &nid)
10100 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
10110 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 res = SSL_get_si
10120 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 gnature_type_nid
10130 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
10140 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 &nid);. }.
10150 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 if (!res) {nid
10160 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e = 0;}. LAPPEN
10170 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
10180 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 jPtr, "signature
10190 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c Type", OBJ_nid2l
101a0 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 23 65 6e n(nid), -1);.#en
101b0 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 dif.. Tcl_Set
101c0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
101d0 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 , objPtr);. r
101e0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
101f0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
10200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
10240 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f ConnectionInfoO
10250 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 bjCmd -- return
10260 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 connection info
10270 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a from OpenSSL.. *
10280 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
10290 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 A list of connec
102a0 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a tion info. *. *
102b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
102c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
102d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
102e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
102f0 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 ---. */..static
10300 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e int ConnectionIn
10310 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 foObjCmd(ClientD
10320 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
10330 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
10340 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
10350 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
10360 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
10370 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
10380 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
10390 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a 2f set a mode on */
103a0 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
103b0 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 ePtr;../* client
103c0 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
103d0 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c ocket */. Tcl
103e0 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c _Obj *objPtr, *l
103f0 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 istPtr;. cons
10400 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 t SSL *ssl;.
10410 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 const SSL_CIPHER
10420 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 6f *cipher;. co
10430 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 nst SSL_SESSION
10440 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f *session;. co
10450 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a nst EVP_MD *md;.
10460 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e (void) clien
10470 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 tData;.. if (
10480 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 objc != 2) {..Tc
10490 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
104a0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
104b0 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 "channel");..ret
104c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
104d0 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d }.. chan =
104e0 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
104f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
10500 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 tring(objv[1]),
10510 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
10520 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
10530 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
10540 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
10550 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
10560 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
10570 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
10580 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
10590 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
105a0 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
105b0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
105c0 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
105d0 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
105e0 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
105f0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
10600 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
10610 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
10620 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
10630 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 . "\": not a
10640 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 TLS channel", (c
10650 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 har *) NULL);..T
10660 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
10670 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
10680 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 CONNECTION", "CH
10690 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 ANNEL", "INVALID
106a0 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
106b0 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
106c0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
106d0 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 objPtr = Tcl_Ne
106e0 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
106f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 );.. /* Conne
10700 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ction info */.
10710 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 statePtr = (St
10720 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 ate *)Tcl_GetCha
10730 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
10740 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 (chan);. ssl
10750 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b = statePtr->ssl;
10760 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 . if (ssl !=
10770 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e NULL) {../* conn
10780 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a ection state */.
10790 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
107a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 erp, objPtr, "st
107b0 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f ate", SSL_state_
107c0 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 string_long(ssl)
107d0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 , -1);.../* Get
107e0 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65 SNI requested se
107f0 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 rver name */..LA
10800 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
10810 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 , objPtr, "serve
10820 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f rname", SSL_get_
10830 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 servername(ssl,
10840 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f TLSEXT_NAMETYPE_
10850 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b host_name), -1);
10860 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 .../* Get protoc
10870 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 ol */..LAPPEND_S
10880 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10890 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 r, "protocol", S
108a0 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 SL_get_version(s
108b0 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 sl), -1);.../* R
108c0 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c enegotiation all
108d0 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 owed */..LAPPEND
108e0 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
108f0 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 jPtr, "renegotia
10900 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 tion_allowed", S
10910 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 SL_get_secure_re
10920 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 negotiation_supp
10930 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 ort((SSL *) ssl)
10940 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 );.../* Get secu
10950 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c rity level */..L
10960 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
10970 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 p, objPtr, "secu
10980 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c rity_level", SSL
10990 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _get_security_le
109a0 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 vel(ssl));.../*
109b0 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a Session info */.
109c0 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
109d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
109e0 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 ession_reused",
109f0 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 SSL_session_reus
10a00 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 ed(ssl));.../* I
10a10 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f s server info */
10a20 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
10a30 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10a40 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f is_server", SSL_
10a50 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b is_server(ssl));
10a60 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f .../* Is DTLS */
10a70 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
10a80 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10a90 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 is_dtls", SSL_is
10aa0 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 _dtls(ssl));.
10ab0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 }.. /* Ciphe
10ac0 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 r info */. ci
10ad0 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 pher = SSL_get_c
10ae0 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 urrent_cipher(ss
10af0 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 l);. if (ciph
10b00 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 er != NULL) {..c
10b10 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 har buf[BUFSIZ]
10b20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 = {0};..int bits
10b30 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a , alg_bits;.../*
10b40 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a Cipher name */.
10b50 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
10b60 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 erp, objPtr, "ci
10b70 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 pher", SSL_CIPHE
10b80 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 R_get_name(ciphe
10b90 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 r), -1);.../* RF
10ba0 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 C name of cipher
10bb0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
10bc0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10bd0 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 "standard_name"
10be0 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 , SSL_CIPHER_sta
10bf0 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 ndard_name(ciphe
10c00 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 r), -1);.../* Op
10c10 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 enSSL name of ci
10c20 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 pher */..LAPPEND
10c30 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
10c40 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 Ptr, "openssl_na
10c50 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 me", OPENSSL_cip
10c60 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 her_name(SSL_CIP
10c70 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d HER_standard_nam
10c80 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b e(cipher)), -1);
10c90 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 .../* number of
10ca0 73 65 63 72 65 74 20 62 69 74 73 20 75 73 65 64 secret bits used
10cb0 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 for cipher */..
10cc0 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 bits = SSL_CIPHE
10cd0 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 R_get_bits(ciphe
10ce0 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 r, &alg_bits);..
10cf0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
10d00 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 rp, objPtr, "sec
10d10 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29 ret_bits", bits)
10d20 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 ;..LAPPEND_INT(i
10d30 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10d40 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c algorithm_bits",
10d50 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 alg_bits);../*
10d60 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 alg_bits is actu
10d70 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 al key secret bi
10d80 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 ts. If use bits
10d90 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f and secret (algo
10da0 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 rithm) bits diff
10db0 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 er,.. the rest
10dc0 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 of the bits are
10dd0 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 fixed, i.e. for
10de0 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 limited export
10df0 63 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 ciphers (bits <
10e00 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 56) */.../* Indi
10e10 63 61 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f cates which SSL/
10e20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 TLS protocol ver
10e30 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e sion first defin
10e40 65 64 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f ed the cipher */
10e50 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
10e60 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d terp, objPtr, "m
10e70 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c in_version", SSL
10e80 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 _CIPHER_get_vers
10e90 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 ion(cipher), -1)
10ea0 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 ;.../* Cipher NI
10eb0 44 2c 20 64 69 67 65 73 74 20 4e 49 44 20 28 6e D, digest NID (n
10ec0 6f 6e 65 20 66 6f 72 20 41 45 41 44 20 63 69 70 one for AEAD cip
10ed0 68 65 72 20 73 75 69 74 65 73 29 2c 20 4b 65 79 her suites), Key
10ee0 20 45 78 63 68 61 6e 67 65 20 4e 49 44 2c 20 61 Exchange NID, a
10ef0 6e 64 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f nd authenticatio
10f00 6e 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e n NID */..LAPPEN
10f10 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
10f20 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 jPtr, "cipherNID
10f30 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e ", (char *)OBJ_n
10f40 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 id2ln(SSL_CIPHER
10f50 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 _get_cipher_nid(
10f60 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 cipher)), -1);..
10f70 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
10f80 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 rp, objPtr, "dig
10f90 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a estNID", (char *
10fa0 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f )OBJ_nid2ln(SSL_
10fb0 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 CIPHER_get_diges
10fc0 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 t_nid(cipher)),
10fd0 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 -1);..LAPPEND_ST
10fe0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
10ff0 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 , "keyExchangeNI
11000 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f D", (char *)OBJ_
11010 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 nid2ln(SSL_CIPHE
11020 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 R_get_kx_nid(cip
11030 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 her)), -1);..LAP
11040 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11050 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e objPtr, "authen
11060 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 ticationNID", (c
11070 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e har *)OBJ_nid2ln
11080 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f (SSL_CIPHER_get_
11090 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 auth_nid(cipher)
110a0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 ), -1);.../* mes
110b0 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 sage authenticat
110c0 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 ion code - Ciphe
110d0 72 20 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 r is AEAD (e.g.
110e0 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f GCM or ChaCha20/
110f0 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 Poly1305) or not
11100 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 */../* Authenti
11110 63 61 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e cated Encryption
11120 20 77 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 with associated
11130 20 64 61 74 61 20 28 41 45 41 44 29 20 63 68 65 data (AEAD) che
11140 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 ck */..LAPPEND_B
11150 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
11160 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 tr, "cipher_is_a
11170 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 ead", SSL_CIPHER
11180 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 _is_aead(cipher)
11190 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e );.../* Get Open
111a0 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c SSL-specific ID,
111b0 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a not IANA ID */.
111c0 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 .LAPPEND_INT(int
111d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 erp, objPtr, "ci
111e0 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 pher_id", (int)
111f0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 SSL_CIPHER_get_i
11200 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a d(cipher));.../*
11210 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65 Two-byte ID use
11220 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f d in the TLS pro
11230 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 tocol of the giv
11240 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 en cipher */..LA
11250 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
11260 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f , objPtr, "proto
11270 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 col_id", (int) S
11280 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72 SL_CIPHER_get_pr
11290 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 otocol_id(cipher
112a0 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c ));.../* Textual
112b0 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 description of
112c0 74 68 65 20 63 69 70 68 65 72 2e 20 49 6e 63 6c the cipher. Incl
112d0 75 64 65 73 3a 20 63 69 70 68 65 72 20 6e 61 6d udes: cipher nam
112e0 65 2c 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 e, protocol vers
112f0 69 6f 6e 2c 20 6b 65 79 0a 09 20 20 20 65 78 63 ion, key.. exc
11300 68 61 6e 67 65 2c 20 61 75 74 68 65 6e 74 69 63 hange, authentic
11310 61 74 69 6f 6e 2c 20 73 79 6d 6d 65 74 72 69 63 ation, symmetric
11320 20 65 6e 63 72 79 70 74 69 6f 6e 20 6d 65 74 68 encryption meth
11330 6f 64 2c 20 6d 65 73 73 61 67 65 20 61 75 74 68 od, message auth
11340 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 entication code
11350 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 */..if (SSL_CIPH
11360 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 ER_description(c
11370 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 ipher, buf, size
11380 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c of(buf)) != NULL
11390 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 ) {.. LAPPEND
113a0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
113b0 50 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f Ptr, "descriptio
113c0 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d n", buf, -1);..}
113d0 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65 .../* Digest use
113e0 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c d during the SSL
113f0 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77 /TLS handshake w
11400 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69 hen using the ci
11410 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 pher. */..md = S
11420 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61 SL_CIPHER_get_ha
11430 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63 ndshake_digest(c
11440 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 ipher);..LAPPEND
11450 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11460 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f Ptr, "handshake_
11470 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a digest", (char *
11480 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 )EVP_MD_name(md)
11490 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 , -1);. }..
114a0 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 /* Session inf
114b0 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e o */. session
114c0 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 = SSL_get_sessi
114d0 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 on(ssl);. if
114e0 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c (session != NULL
114f0 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 ) {..const unsig
11500 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 ned char *ticket
11510 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a ;..size_t len2;.
11520 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c .unsigned int ul
11530 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 en;..const unsig
11540 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
11550 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 n_id, *proto;..u
11560 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 nsigned char buf
11570 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 fer[SSL_MAX_MAST
11580 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a ER_KEY_LENGTH];.
11590 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 ../* Report the
115a0 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f selected protoco
115b0 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 l as a result of
115c0 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 the ALPN negoti
115d0 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 ation */..SSL_SE
115e0 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f SSION_get0_alpn_
115f0 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e selected(session
11600 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 , &proto, &len2)
11610 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
11620 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11630 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 alpn", (char *)
11640 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 proto, (Tcl_Size
11650 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 ) len2);.../* Re
11660 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 port the selecte
11670 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 d protocol as a
11680 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 result of the NP
11690 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f N negotiation */
116a0 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a .#ifdef USE_NPN.
116b0 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 .SSL_get0_next_p
116c0 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 roto_negotiated(
116d0 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c ssl, &proto, &ul
116e0 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 en);..LAPPEND_ST
116f0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11700 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a , "npn", (char *
11710 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 ) proto, (Tcl_Si
11720 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 ze) ulen);.#endi
11730 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 f.../* Resumable
11740 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 session */..LAP
11750 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 PEND_BOOL(interp
11760 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d , objPtr, "resum
11770 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 able", SSL_SESSI
11780 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 ON_is_resumable(
11790 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 session));.../*
117a0 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 Session start ti
117b0 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 me (seconds sinc
117c0 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 e epoch) */..LAP
117d0 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 PEND_LONG(interp
117e0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 , objPtr, "start
117f0 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 _time", SSL_SESS
11800 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 ION_get_time(ses
11810 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d sion));.../* Tim
11820 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c eout value - SSL
11830 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 _CTX_get_timeout
11840 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f (in seconds) */
11850 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 ..LAPPEND_LONG(i
11860 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11870 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 timeout", SSL_SE
11880 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 SSION_get_timeou
11890 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f t(session));.../
118a0 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 * Session id - T
118b0 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 LSv1.2 and below
118c0 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f only */..sessio
118d0 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 n_id = SSL_SESSI
118e0 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f ON_get_id(sessio
118f0 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 n, &ulen);..LAPP
11900 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 END_BARRAY(inter
11910 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 p, objPtr, "sess
11920 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e ion_id", session
11930 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 _id, (Tcl_Size)
11940 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 ulen);.../* Sess
11950 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 ion context */..
11960 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c session_id = SSL
11970 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 _SESSION_get0_id
11980 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e _context(session
11990 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 , &ulen);..LAPPE
119a0 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 ND_BARRAY(interp
119b0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 , objPtr, "sessi
119c0 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 on_context", ses
119d0 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 sion_id, (Tcl_Si
119e0 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 ze) ulen);.../*
119f0 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d Session ticket -
11a00 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a client only */.
11a10 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 .SSL_SESSION_get
11a20 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 0_ticket(session
11a30 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 , &ticket, &len2
11a40 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
11a50 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
11a60 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b r, "session_tick
11a70 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 et", ticket, (Tc
11a80 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a l_Size) len2);..
11a90 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b ./* Session tick
11aa0 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 et lifetime hint
11ab0 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f (in seconds) */
11ac0 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 ..LAPPEND_LONG(i
11ad0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11ae0 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 lifetime", SSL_S
11af0 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 ESSION_get_ticke
11b00 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 t_lifetime_hint(
11b10 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 session));.../*
11b20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 Ticket app data
11b30 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 */.#if OPENSSL_V
11b40 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
11b50 30 78 33 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 0x30000000L..SSL
11b60 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 _SESSION_get0_ti
11b70 63 6b 65 74 5f 61 70 70 64 61 74 61 28 28 53 53 cket_appdata((SS
11b80 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 L_SESSION *) ses
11b90 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 sion, &ticket, &
11ba0 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f len2);..LAPPEND_
11bb0 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f BARRAY(interp, o
11bc0 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 bjPtr, "ticket_a
11bd0 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 pp_data", ticket
11be0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e , (Tcl_Size) len
11bf0 32 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 2);.#endif.../*
11c00 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a Get master key *
11c10 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 /..len2 = SSL_SE
11c20 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 SSION_get_master
11c30 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 _key(session, bu
11c40 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 ffer, SSL_MAX_MA
11c50 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 STER_KEY_LENGTH)
11c60 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 ;..LAPPEND_BARRA
11c70 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 Y(interp, objPtr
11c80 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 , "master_key",
11c90 62 75 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a buffer, (Tcl_Siz
11ca0 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 e) len2);.../* C
11cb0 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f ompression id */
11cc0 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 ..unsigned int i
11cd0 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f d = SSL_SESSION_
11ce0 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 get_compress_id(
11cf0 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 session);..LAPPE
11d00 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11d10 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 bjPtr, "compress
11d20 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 ion_id", id == 1
11d30 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e ? "zlib" : "non
11d40 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a e", -1);. }..
11d50 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 /* Compressi
11d60 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 on info */. i
11d70 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 f (ssl != NULL)
11d80 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 {.#ifdef HAVE_SS
11d90 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 L_COMPRESSION..c
11da0 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 onst COMP_METHOD
11db0 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 *comp, *expn;..
11dc0 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 comp = SSL_get_c
11dd0 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 urrent_compressi
11de0 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d on(ssl);..expn =
11df0 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 SSL_get_current
11e00 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b _expansion(ssl);
11e10 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ...LAPPEND_STR(i
11e20 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11e30 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f compression", co
11e40 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 mp ? SSL_COMP_ge
11e50 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 t_name(comp) : "
11e60 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 none", -1);..LAP
11e70 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11e80 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 objPtr, "expans
11e90 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c ion", expn ? SSL
11ea0 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 _COMP_get_name(e
11eb0 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d xpn) : "none", -
11ec0 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 1);.#else..LAPPE
11ed0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11ee0 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 bjPtr, "compress
11ef0 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 ion", "none", -1
11f00 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
11f10 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11f20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f "expansion", "no
11f30 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 ne", -1);.#endif
11f40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
11f50 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 erver info */.
11f60 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d {..long mode =
11f70 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 SSL_CTX_get_ses
11f80 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 sion_cache_mode(
11f90 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
11fa0 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 .char *msg;...if
11fb0 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
11fc0 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 S_CACHE_OFF) {..
11fd0 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b msg = "off";
11fe0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 ..} else if (mod
11ff0 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 e & SSL_SESS_CAC
12000 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 HE_CLIENT) {..
12010 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 msg = "client"
12020 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f ;..} else if (mo
12030 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
12040 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 CHE_SERVER) {..
12050 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72 msg = "server
12060 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d ";..} else if (m
12070 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 ode & SSL_SESS_C
12080 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 ACHE_BOTH) {..
12090 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a msg = "both";.
120a0 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d .} else {.. m
120b0 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a sg = "unknown";.
120c0 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 .}..LAPPEND_STR(
120d0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
120e0 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d "session_cache_m
120f0 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a ode", msg, -1);.
12100 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 }.. /* CA
12110 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 List */. /*
12120 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c IF not a server,
12130 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 same as SSL_get
12140 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 0_peer_CA_list.
12150 49 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 61 If server same a
12160 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c s SSL_CTX_get_cl
12170 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a ient_CA_list */.
12180 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63 listPtr = Tc
12190 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
121a0 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b NULL);. STACK
121b0 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a _OF(X509_NAME) *
121c0 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 ca_list;. if
121d0 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f ((ca_list = SSL_
121e0 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 get_client_CA_li
121f0 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c st(ssl)) != NULL
12200 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72 ) {..char buffer
12210 5b 42 55 46 53 49 5a 5d 3b 0a 0a 09 66 6f 72 20 [BUFSIZ];...for
12220 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 (int i = 0; i <
12230 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d sk_X509_NAME_num
12240 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 (ca_list); i++)
12250 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 {.. X509_NAME
12260 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 *name = sk_X509
12270 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c _NAME_value(ca_l
12280 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 ist, i);.. if
12290 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 (name) {...X509
122a0 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 _NAME_oneline(na
122b0 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 me, buffer, BUFS
122c0 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f IZ);...Tcl_ListO
122d0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
122e0 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c interp, listPtr,
122f0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
12300 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a j(buffer, -1));.
12310 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a . }..}. }.
12320 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 LAPPEND_OBJ(
12330 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12340 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 "caList", listPt
12350 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f r);. LAPPEND_
12360 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
12370 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 tr, "caListCount
12380 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f ", sk_X509_NAME_
12390 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a num(ca_list));..
123a0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
123b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
123c0 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
123d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
123e0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
123f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12420 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 ------. *. * Mis
12430 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 cObjCmd -- misc
12440 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 commands. *. * R
12450 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
12460 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
12470 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
12480 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
12490 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
124a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
124b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
124c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
124d0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
124e0 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d ic int.MiscObjCm
124f0 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
12500 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
12510 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
12520 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
12530 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
12540 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 static const
12550 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 char *commands
12560 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 [] = { "req", "s
12570 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a trreq", NULL };.
12580 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 enum command
12590 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 { C_REQ, C_STRR
125a0 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 EQ, C_DUMMY };.
125b0 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b Tcl_Size cmd;
125c0 0a 20 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a . int isStr;.
125d0 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b char buffer[
125e0 31 36 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 16384];. (voi
125f0 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a d) clientData;..
12600 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
12610 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
12620 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c objc < 2) {..Tcl
12630 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
12640 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
12650 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 subcommand ?args
12660 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c ?");..return TCL
12670 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
12680 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 if (Tcl_GetInd
12690 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 exFromObj(interp
126a0 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 , objv[1], comma
126b0 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 nds, "command",
126c0 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 0, &cmd) != TCL_
126d0 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
126e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
126f0 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
12700 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 ror();.. isSt
12710 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 r = (cmd == C_ST
12720 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 RREQ);. switc
12730 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 h ((enum command
12740 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 ) cmd) {..case C
12750 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 _REQ:..case C_ST
12760 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 RREQ: {.. EVP
12770 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c _PKEY *pkey=NULL
12780 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 ;.. X509 *cer
12790 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 t=NULL;.. X50
127a0 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 9_NAME *name=NUL
127b0 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 L;.. Tcl_Obj
127c0 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63 **listv;.. Tc
127d0 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 l_Size listc;..
127e0 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 int i;...
127f0 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a BIO *out=NULL;..
12800 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 . char *k_C="
12810 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d ",*k_ST="",*k_L=
12820 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 "",*k_O="",*k_OU
12830 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f ="",*k_CN="",*k_
12840 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 Email="";.. c
12850 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d har *keyout,*pem
12860 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 out,*str;.. i
12870 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 nt keysize,seria
12880 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 l=0,days=365;..#
12890 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
128a0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
128b0 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 000000L.. BIG
128c0 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b NUM *bne = NULL;
128d0 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d .. RSA *rsa =
128e0 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 NULL;.#else..
128f0 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a EVP_PKEY_CTX *
12900 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 ctx = NULL;.#end
12910 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 if... if ((ob
12920 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 jc<5) || (objc>6
12930 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 )) {...Tcl_Wrong
12940 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
12950 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 2, objv, "keysiz
12960 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 e keyfile certfi
12970 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 le ?info?");...r
12980 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
12990 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 .. }... if
129a0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
129b0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
129c0 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 [2], &keysize) !
129d0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 = TCL_OK) {...re
129e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
129f0 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f . }.. keyo
12a00 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ut=Tcl_GetString
12a10 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 (objv[3]);..
12a20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 pemout=Tcl_GetSt
12a30 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 ring(objv[4]);..
12a40 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b if (isStr) {
12a50 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e ...Tcl_SetVar(in
12a60 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 terp,keyout,"",0
12a70 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 );...Tcl_SetVar(
12a80 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 interp,pemout,""
12a90 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ,0);.. }...
12aa0 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b if (objc>=6) {
12ab0 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f ...if (Tcl_ListO
12ac0 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e bjGetElements(in
12ad0 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 terp, objv[5], &
12ae0 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 listc, &listv) !
12af0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 = TCL_OK) {...
12b00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
12b10 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 OR;...}....if ((
12b20 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b listc%2) != 0) {
12b30 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 ... Tcl_SetRe
12b40 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 sult(interp,"Inf
12b50 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 ormation list mu
12b60 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d st have even num
12b70 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
12b80 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 ",NULL);... r
12b90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
12ba0 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b ...}...for (i=0;
12bb0 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 i<listc; i+=2)
12bc0 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f {... str=Tcl_
12bd0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
12be0 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 i]);... if (s
12bf0 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 trcmp(str,"days"
12c00 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 )==0) {....if (T
12c10 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
12c20 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b (interp,listv[i+
12c30 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 1],&days)!=TCL_O
12c40 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e K).... return
12c50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 TCL_ERROR;...
12c60 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
12c70 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 cmp(str,"serial"
12c80 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 )==0) {....if (T
12c90 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
12ca0 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b (interp,listv[i+
12cb0 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 1],&serial)!=TCL
12cc0 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 _OK).... retu
12cd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
12ce0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
12cf0 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d trcmp(str,"C")==
12d00 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 0) {....k_C=Tcl_
12d10 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
12d20 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
12d30 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
12d40 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 tr,"ST")==0) {..
12d50 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 ..k_ST=Tcl_GetSt
12d60 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
12d70 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
12d80 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c f (strcmp(str,"L
12d90 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d ")==0) {....k_L=
12da0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
12db0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
12dc0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
12dd0 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 mp(str,"O")==0)
12de0 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 {....k_O=Tcl_Get
12df0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
12e00 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
12e10 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
12e20 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b "OU")==0) {....k
12e30 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e _OU=Tcl_GetStrin
12e40 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
12e50 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
12e60 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 strcmp(str,"CN")
12e70 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 ==0) {....k_CN=T
12e80 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
12e90 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
12ea0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
12eb0 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d p(str,"Email")==
12ec0 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 0) {....k_Email=
12ed0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
12ee0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
12ef0 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c } else {....Tcl
12f00 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
12f10 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d p,"Unknown param
12f20 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 eter",NULL);....
12f30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
12f40 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 ;... }...}..
12f50 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 }..#if OPENSS
12f60 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
12f70 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
12f80 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 bne = BN_new
12f90 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 ();.. rsa = R
12fa0 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 SA_new();.. p
12fb0 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e key = EVP_PKEY_n
12fc0 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 ew();.. if (b
12fd0 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 ne == NULL || rs
12fe0 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 a == NULL || pke
12ff0 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e y == NULL || !BN
13000 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 _set_word(bne,RS
13010 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f A_F4) ||...!RSA_
13020 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 generate_key_ex(
13030 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e rsa, keysize, bn
13040 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 e, NULL) || !EVP
13050 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 _PKEY_assign_RSA
13060 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 (pkey, rsa)) {..
13070 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 .EVP_PKEY_free(p
13080 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 key);.../* RSA_f
13090 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 ree(rsa); freed
130a0 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 by EVP_PKEY_free
130b0 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e */...BN_free(bn
130c0 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 e);.#else.. p
130d0 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 key = EVP_RSA_ge
130e0 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 n((unsigned int)
130f0 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 keysize);..
13100 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 ctx = EVP_PKEY_C
13110 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c TX_new(pkey,NULL
13120 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 );.. if (pkey
13130 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 == NULL || ctx
13140 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f == NULL || !EVP_
13150 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 PKEY_keygen_init
13160 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f (ctx) ||...!EVP_
13170 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 PKEY_CTX_set_rsa
13180 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 _keygen_bits(ctx
13190 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 , keysize) || !E
131a0 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 VP_PKEY_keygen(c
131b0 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 tx, &pkey)) {...
131c0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
131d0 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f ey);...EVP_PKEY_
131e0 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 CTX_free(ctx);.#
131f0 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 endif...Tcl_SetR
13200 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 esult(interp,"Er
13210 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 ror generating p
13220 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c rivate key",NULL
13230 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
13240 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c ERROR;.. } el
13250 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 se {...if (isStr
13260 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 ) {... out=BI
13270 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 O_new(BIO_s_mem(
13280 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 ));... PEM_wr
13290 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b ite_bio_PrivateK
132a0 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c ey(out,pkey,NULL
132b0 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c ,NULL,0,NULL,NUL
132c0 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f L);... i=BIO_
132d0 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c read(out,buffer,
132e0 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 sizeof(buffer)-1
132f0 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 );... i=(i<0)
13300 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 ? 0 : i;...
13310 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a buffer[i]='\0';.
13320 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 .. Tcl_SetVar
13330 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 (interp,keyout,b
13340 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 uffer,0);...
13350 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a BIO_flush(out);.
13360 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f .. BIO_free(o
13370 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a ut);...} else {.
13380 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
13390 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b w(BIO_s_file());
133a0 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 ... BIO_write
133b0 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 _filename(out,ke
133c0 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d yout);... PEM
133d0 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 _write_bio_Priva
133e0 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e teKey(out,pkey,N
133f0 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c ULL,NULL,0,NULL,
13400 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 NULL);... /*
13410 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 PEM_write_bio_RS
13420 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c APrivateKey(out,
13430 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c rsa, NULL, NULL
13440 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 , 0, NULL, NULL)
13450 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 ; */... BIO_f
13460 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 ree_all(out);..
13470 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d .}....if ((cert=
13480 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c X509_new())==NUL
13490 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 L) {... Tcl_S
134a0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
134b0 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e "Error generatin
134c0 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65 g certificate re
134d0 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 quest",NULL);...
134e0 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 EVP_PKEY_fre
134f0 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 e(pkey);.#if OPE
13500 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
13510 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
13520 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 L... BN_free(
13530 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 bne);.#endif...
13540 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
13550 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 ROR;...}....X509
13560 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 _set_version(cer
13570 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 t,2);...ASN1_INT
13580 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 EGER_set(X509_ge
13590 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 t_serialNumber(c
135a0 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 ert),serial);...
135b0 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 X509_gmtime_adj(
135c0 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 X509_getm_notBef
135d0 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 ore(cert),0);...
135e0 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 X509_gmtime_adj(
135f0 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 X509_getm_notAft
13600 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 er(cert),(long)6
13610 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 0*60*24*days);..
13620 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 .X509_set_pubkey
13630 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 (cert,pkey);....
13640 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 name=X509_get_su
13650 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 bject_name(cert)
13660 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 ;....X509_NAME_a
13670 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
13680 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 name,"C", MBSTRI
13690 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
136a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
136b0 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b k_C, -1, -1, 0);
136c0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
136d0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
136e0 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e me,"ST", MBSTRIN
136f0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
13700 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
13710 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _ST, -1, -1, 0);
13720 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
13730 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
13740 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 me,"L", MBSTRING
13750 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
13760 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
13770 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 L, -1, -1, 0);..
13780 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
13790 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
137a0 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 ,"O", MBSTRING_A
137b0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
137c0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c ned char *) k_O,
137d0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
137e0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
137f0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
13800 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 OU", MBSTRING_AS
13810 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
13820 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c ed char *) k_OU,
13830 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
13840 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
13850 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
13860 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 CN", MBSTRING_AS
13870 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
13880 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c ed char *) k_CN,
13890 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
138a0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
138b0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
138c0 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 Email", MBSTRING
138d0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
138e0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
138f0 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 Email, -1, -1, 0
13900 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 );....X509_set_s
13910 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 ubject_name(cert
13920 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 ,name);....if (!
13930 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 X509_sign(cert,p
13940 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 key,EVP_sha256()
13950 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f )) {... X509_
13960 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 free(cert);...
13970 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 EVP_PKEY_free(
13980 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 pkey);.#if OPENS
13990 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
139a0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
139b0 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e .. BN_free(bn
139c0 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 e);.#endif...
139d0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
139e0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 nterp,"Error sig
139f0 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ning certificate
13a00 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 ",NULL);... r
13a10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
13a20 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 ...}....if (isSt
13a30 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 r) {... out=B
13a40 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d IO_new(BIO_s_mem
13a50 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ());... PEM_w
13a60 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 rite_bio_X509(ou
13a70 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 t,cert);... i
13a80 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 =BIO_read(out,bu
13a90 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 ffer,sizeof(buff
13aa0 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d er)-1);... i=
13ab0 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 (i<0) ? 0 : i;..
13ac0 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 . buffer[i]='
13ad0 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 \0';... Tcl_S
13ae0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d etVar(interp,pem
13af0 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 out,buffer,0);..
13b00 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f . BIO_flush(o
13b10 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 ut);... BIO_f
13b20 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c ree(out);...} el
13b30 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 se {... out=B
13b40 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c IO_new(BIO_s_fil
13b50 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f e());... BIO_
13b60 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f write_filename(o
13b70 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 ut,pemout);...
13b80 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
13b90 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a X509(out,cert);.
13ba0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 .. BIO_free_a
13bb0 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 ll(out);...}....
13bc0 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b X509_free(cert);
13bd0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
13be0 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e (pkey);.#if OPEN
13bf0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
13c00 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
13c10 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b ...BN_free(bne);
13c20 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 .#endif.. }..
13c30 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 }..break;. de
13c40 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 fault:..break;.
13c50 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
13c60 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a TCL_OK;.}.../***
13c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13c80 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 */./* Init
13c90 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a */./*****
13ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
13cb0 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
13cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
13d00 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a Tls_Free --. *.
13d10 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
13d20 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e e cleans up when
13d30 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
13d40 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 sed channel. *.i
13d50 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 s closed and its
13d60 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
13d70 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 falls below 1.
13d80 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
13d90 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .none. *. * Side
13da0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 effects:. *.Fre
13db0 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 es all the state
13dc0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
13dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
13e10 69 64 0a 54 6c 73 5f 46 72 65 65 28 74 6c 73 5f id.Tls_Free(tls_
13e20 66 72 65 65 5f 74 79 70 65 20 2a 62 6c 6f 63 6b free_type *block
13e30 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 Ptr) {. State
13e40 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
13e50 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a ate *)blockPtr;.
13e60 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
13e70 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 lled");.. Tls
13e80 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 _Clean(statePtr)
13e90 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f ;. ckfree(blo
13ea0 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ckPtr);.}.../*.
13eb0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
13ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ef0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 ----. *. * Tls_C
13f00 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 lean --. *. *.Th
13f10 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 is procedure cle
13f20 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 ans up when a SS
13f30 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 L socket based c
13f40 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f hannel. *.is clo
13f50 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 sed and its refe
13f60 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c rence count fall
13f70 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 s below 1. This
13f80 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 should. *.be ca
13f90 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 lled synchronous
13fa0 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 ly by the CloseP
13fb0 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a roc, not in the.
13fc0 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 *.EventuallyFre
13fd0 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 e callback.. *.
13fe0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f * Results:. *.no
13ff0 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
14000 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 fects:. *.Frees
14010 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a all the state. *
14020 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
14030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14060 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 ------. */.void
14070 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 Tls_Clean(State
14080 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 *statePtr) {.
14090 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
140a0 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 ");.. /*.
140b0 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e * we're assumin
140c0 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72 g here that we'r
140d0 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 e single-threade
140e0 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 d. */. if
140f0 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 (statePtr->time
14100 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 r != (Tcl_TimerT
14110 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 oken) NULL) {..T
14120 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 cl_DeleteTimerHa
14130 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e ndler(statePtr->
14140 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 timer);..statePt
14150 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b r->timer = NULL;
14160 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
14170 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
14180 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 ) {..ckfree(stat
14190 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 ePtr->protos);..
141a0 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
141b0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
141c0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
141d0 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 >bio) {../* This
141e0 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 will call SSL_s
141f0 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 hutdown. Bug 141
14200 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 4045 */..dprintf
14210 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 ("BIO_free_all(%
14220 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 p)", statePtr->b
14230 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 io);..BIO_free_a
14240 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ll(statePtr->bio
14250 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 );..statePtr->bi
14260 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a o = NULL;. }.
14270 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
14280 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 ->ssl) {..dprint
14290 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 f("SSL_free(%p)"
142a0 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 , statePtr->ssl)
142b0 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 ;..SSL_free(stat
142c0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 ePtr->ssl);..sta
142d0 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c tePtr->ssl = NUL
142e0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
142f0 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 (statePtr->ctx)
14300 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 {..SSL_CTX_free(
14310 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
14320 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d .statePtr->ctx =
14330 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
14340 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
14350 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f allback) {..Tcl_
14360 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 DecrRefCount(sta
14370 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
14380 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c ;..statePtr->cal
14390 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 lback = NULL;.
143a0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
143b0 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 ePtr->password)
143c0 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f {..Tcl_DecrRefCo
143d0 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 unt(statePtr->pa
143e0 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 ssword);..stateP
143f0 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e tr->password = N
14400 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
14410 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d f (statePtr->vcm
14420 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 d) {..Tcl_DecrRe
14430 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
14440 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 >vcmd);..statePt
14450 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a r->vcmd = NULL;.
14460 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
14470 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b tf("Returning");
14480 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
14490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144d0 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49 6e 66 . *. * Build Inf
144e0 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a o Command --. *.
144f0 20 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e *.Create comman
14500 64 20 74 6f 20 72 65 74 75 72 6e 20 62 75 69 6c d to return buil
14510 64 20 69 6e 66 6f 20 66 6f 72 20 70 61 63 6b 61 d info for packa
14520 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ge.. *. * Result
14530 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
14540 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 Tcl result. *.
14550 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
14560 20 2a 09 43 72 65 61 74 65 64 20 62 75 69 6c 64 *.Created build
14570 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20 -info command..
14580 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
14590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
145d0 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47 49 46 #ifndef STRINGIF
145e0 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 49 Y.# define STRI
145f0 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e 47 49 NGIFY(x) STRINGI
14600 46 59 31 28 78 29 0a 23 20 20 64 65 66 69 6e 65 FY1(x).# define
14610 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 20 23 STRINGIFY1(x) #
14620 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 75 x.#endif..int.Bu
14630 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54 ildInfoCommand(T
14640 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65 72 cl_Interp* inter
14650 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64 p) {. Tcl_Cmd
14660 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 Info info;..
14670 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 if (Tcl_GetComma
14680 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 22 ndInfo(interp, "
14690 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66 ::tcl::build-inf
146a0 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a 09 54 o", &info)) {..T
146b0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
146c0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
146d0 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c ls::build-info",
146e0 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28 info.objProc, (
146f0 76 6f 69 64 20 2a 29 28 0a 09 09 50 41 43 4b 41 void *)(...PACKA
14700 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20 53 GE_VERSION "+" S
14710 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 45 52 TRINGIFY(TLS_VER
14720 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66 20 64 SION_UUID).#if d
14730 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f efined(__clang__
14740 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 63 ) && defined(__c
14750 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09 lang_major__)...
14760 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20 53 . ".clang-" S
14770 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 TRINGIFY(__clang
14780 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f _major__).#if __
14790 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 clang_minor__ <
147a0 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65 10.... "0".#e
147b0 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 49 ndif.... STRI
147c0 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69 NGIFY(__clang_mi
147d0 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 nor__).#endif.#i
147e0 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 f defined(__cplu
147f0 73 70 6c 75 73 29 20 26 26 20 21 64 65 66 69 6e splus) && !defin
14800 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09 ed(__OBJC__)....
14810 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 73 22 ".cplusplus"
14820 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 .#endif.#ifndef
14830 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e NDEBUG.... ".
14840 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 debug".#endif.#i
14850 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 f !defined(__cla
14860 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 ng__) && !define
14870 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c d(__INTEL_COMPIL
14880 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f ER) && defined(_
14890 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20 20 _GNUC__)....
148a0 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 49 46 ".gcc-" STRINGIF
148b0 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 20 Y(__GNUC__).#if
148c0 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c __GNUC_MINOR__ <
148d0 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 10.... "0".#
148e0 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 endif.... STR
148f0 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d 49 INGIFY(__GNUC_MI
14900 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 NOR__).#endif.#i
14910 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d fdef __INTEL_COM
14920 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22 2e 69 PILER.... ".i
14930 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f cc-" STRINGIFY(_
14940 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 _INTEL_COMPILER)
14950 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 .#endif.#ifdef T
14960 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09 09 CL_MEM_DEBUG....
14970 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 22 0a ".memdebug".
14980 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
14990 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09 09 ed(_MSC_VER)....
149a0 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 54 52 ".msvc-" STR
149b0 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 52 29 INGIFY(_MSC_VER)
149c0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 55 .#endif.#ifdef U
149d0 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20 20 SE_NMAKE....
149e0 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66 0a ".nmake".#endif.
149f0 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 47 5f #ifndef TCL_CFG_
14a00 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 20 20 OPTIMIZED....
14a10 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a ".no-optimize".
14a20 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f #endif.#ifdef __
14a30 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22 2e OBJC__.... ".
14a40 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 69 66 objective-c".#if
14a50 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 defined(__cplus
14a60 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22 70 6c plus).... "pl
14a70 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 usplus".#endif.#
14a80 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c endif.#ifdef TCL
14a90 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09 09 _CFG_PROFILED...
14aa0 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 22 0a . ".profile".
14ab0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 50 55 #endif.#ifdef PU
14ac0 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e 70 75 RIFY.... ".pu
14ad0 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 69 66 rify".#endif.#if
14ae0 64 65 66 20 53 54 41 54 49 43 5f 42 55 49 4c 44 def STATIC_BUILD
14af0 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74 69 63 .... ".static
14b00 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e 55 ".#endif...), NU
14b10 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 LL);. }. r
14b20 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
14b30 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
14b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
14b80 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a Tls_Init --. *.
14b90 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63 *.This is a pac
14ba0 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 kage initializat
14bb0 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 ion procedure, w
14bc0 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 hich is called.
14bd0 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 *.by Tcl when th
14be0 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f is package is to
14bf0 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 be added to an
14c00 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a interpreter.. *.
14c10 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c * Results: Ssl
14c20 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 configured and
14c30 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 loaded. *. * Sid
14c40 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 e effects:. *. c
14c50 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f reate the ssl co
14c60 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a mmand, initializ
14c70 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a e ssl context. *
14c80 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
14c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14cc0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 20 ------. */..#if
14cd0 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
14ce0 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 N > 8.#define MI
14cf0 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a N_VERSION "9.0".
14d00 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 #else.#define MI
14d10 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a N_VERSION "8.5".
14d20 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 63 #endif..static c
14d30 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c onst char tlsTcl
14d40 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b InitScript[] = {
14d50 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 .#include "tls.t
14d60 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 cl.h"..0x00.
14d70 7d 3b 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e };..DLLEXPORT in
14d80 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 t Tls_Init(Tcl_I
14d90 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b nterp *interp) {
14da0 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
14db0 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65 66 alled");..#ifdef
14dc0 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 USE_TCL_STUBS.
14dd0 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 if (Tcl_InitS
14de0 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d 49 4e tubs(interp, MIN
14df0 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 _VERSION, 0) ==
14e00 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
14e10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
14e20 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 .#endif. if (
14e30 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 Tcl_PkgRequire(i
14e40 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d 49 nterp, "Tcl", MI
14e50 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d N_VERSION, 0) ==
14e60 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
14e70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
14e80 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 }.. if (TlsLi
14e90 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f bInit(0) != TCL_
14ea0 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e OK) {..Tcl_Appen
14eb0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
14ec0 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 "could not initi
14ed0 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 alize SSL librar
14ee0 79 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c y", (char *) NUL
14ef0 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
14f00 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
14f10 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
14f20 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
14f30 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f ::tls::connectio
14f40 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e n", ConnectionIn
14f50 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e foObjCmd, (Clien
14f60 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 tData) NULL, (Tc
14f70 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
14f80 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
14f90 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
14fa0 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c nd(interp, "::tl
14fb0 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 s::handshake", H
14fc0 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 andshakeObjCmd,
14fd0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c (ClientData) NUL
14fe0 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 L, (Tcl_CmdDelet
14ff0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
15000 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
15010 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
15020 20 22 3a 3a 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 "::tls::import"
15030 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 , ImportObjCmd,
15040 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c (ClientData) NUL
15050 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 L, (Tcl_CmdDelet
15060 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
15070 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
15080 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
15090 20 22 3a 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 "::tls::misc",
150a0 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 MiscObjCmd, (Cli
150b0 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 entData) NULL, (
150c0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
150d0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
150e0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
150f0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a mand(interp, "::
15100 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 tls::unimport",
15110 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 UnimportObjCmd,
15120 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c (ClientData) NUL
15130 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 L, (Tcl_CmdDelet
15140 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
15150 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
15160 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
15170 20 22 3a 3a 74 6c 73 3a 3a 75 6e 73 74 61 63 6b "::tls::unstack
15180 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d ", UnimportObjCm
15190 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
151a0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
151b0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
151c0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
151d0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
151e0 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 74 rp, "::tls::stat
151f0 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d us", StatusObjCm
15200 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
15210 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
15220 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
15230 29 3b 0a 0a 20 20 20 20 42 75 69 6c 64 49 6e 66 );.. BuildInf
15240 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 29 oCommand(interp)
15250 3b 0a 20 20 20 20 54 6c 73 5f 44 69 67 65 73 74 ;. Tls_Digest
15260 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29 Commands(interp)
15270 3b 0a 20 20 20 20 54 6c 73 5f 45 6e 63 72 79 70 ;. Tls_Encryp
15280 74 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 tCommands(interp
15290 29 3b 0a 20 20 20 20 54 6c 73 5f 49 6e 66 6f 43 );. Tls_InfoC
152a0 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29 3b ommands(interp);
152b0 0a 20 20 20 20 54 6c 73 5f 4b 44 46 43 6f 6d 6d . Tls_KDFComm
152c0 61 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a 20 20 ands(interp);.
152d0 20 20 54 6c 73 5f 52 61 6e 64 43 6f 6d 6d 61 6e Tls_RandComman
152e0 64 73 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 ds(interp);..
152f0 20 69 66 20 28 69 6e 74 65 72 70 20 26 26 20 54 if (interp && T
15300 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 cl_Eval(interp,
15310 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 tlsTclInitScript
15320 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
15330 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
15340 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 ;. }.. ret
15350 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 urn Tcl_PkgProvi
15360 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 de(interp, PACKA
15370 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 GE_NAME, PACKAGE
15380 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a _VERSION);.}../*
15390 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
153a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
153b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
153c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a ---------*. *. *
153d0 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d .Tls_SafeInit --
153e0 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *.---------
153f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15410 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e -------*. *.Stan
15420 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 72 dard procedure r
15430 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64 equired by 'load
15440 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 '.. *.Initialize
15450 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e s this extension
15460 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 for a safe inte
15470 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d rpreter.. *.----
15480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
154a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
154b0 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 . *.Side effects
154c0 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 :. *..As of 'Tls
154d0 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 _Init'. *. *.Res
154e0 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 ult:. *..A stand
154f0 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f ard Tcl error co
15500 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d de.. *. *-------
15510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
15540 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 . */.DLLEXPORT i
15550 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 nt Tls_SafeInit(
15560 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
15570 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 rp) {. dprint
15580 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 f("Called");.
15590 20 72 65 74 75 72 6e 20 54 6c 73 5f 49 6e 69 74 return Tls_Init
155a0 28 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a (interp);.}../*.
155b0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
155c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
155d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
155e0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
155f0 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a TlsLibInit --. *
15600 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
15610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15630 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c ----*. *.Initial
15640 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 izes SSL library
15650 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 once per applic
15660 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d ation. *.-------
15670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a ---------*. *. *
156a0 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 .Side effects:.
156b0 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 *..initializes S
156c0 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a SL library. *. *
156d0 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e .Result:. *..non
156e0 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
156f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
15720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c */.static int Tl
15730 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 sLibInit(int uni
15740 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 nitialize) {.
15750 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 static int init
15760 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 ialized = 0;.
15770 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43 int status = TC
15780 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 L_OK;.#if define
15790 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
157a0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
157b0 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 73 L_THREADS). s
157c0 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b ize_t num_locks;
157d0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 .#endif.. if
157e0 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b (uninitialize) {
157f0 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a ..if (!initializ
15800 65 64 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e ed) {.. dprin
15810 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 tf("Asked to uni
15820 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 nitialize, but w
15830 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 e are not initia
15840 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20 72 lized");... r
15850 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 7d eturn TCL_OK;..}
15860 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 ...dprintf("Aske
15870 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a d to uninitializ
15880 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 e");..#if define
15890 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
158a0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
158b0 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f L_THREADS)..Tcl_
158c0 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f MutexLock(&init_
158d0 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 mx);...if (locks
158e0 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28 6c 6f ) {.. free(lo
158f0 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 cks);.. locks
15900 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f = NULL;.. lo
15910 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d cksCount = 0;..}
15920 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c .#endif..initial
15930 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 ized = 0;..#if d
15940 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
15950 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
15960 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
15970 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b .Tcl_MutexUnlock
15980 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 (&init_mx);.#end
15990 69 66 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f if...return TCL_
159a0 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OK;. }.. i
159b0 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 f (initialized)
159c0 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c {..dprintf("Call
159d0 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61 ed, but using ca
159e0 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 ched value");..r
159f0 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a 20 20 eturn status;.
15a00 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
15a10 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 ("Called");..#if
15a20 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
15a30 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
15a40 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
15a50 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c ). Tcl_MutexL
15a60 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 ock(&init_mx);.#
15a70 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 endif. initia
15a80 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 lized = 1;..#if
15a90 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
15aa0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
15ab0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
15ac0 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d . num_locks =
15ad0 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 1;. locksCou
15ae0 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c nt = (int) num_l
15af0 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 ocks;. locks
15b00 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 = malloc(sizeof(
15b10 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f *locks) * num_lo
15b20 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 cks);. memset
15b30 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f (locks, 0, sizeo
15b40 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f f(*locks) * num_
15b50 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a locks);.#endif..
15b60 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a /* Initializ
15b70 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f e BOTH libcrypto
15b80 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a and libssl. */.
15b90 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 OPENSSL_init
15ba0 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 _ssl(OPENSSL_INI
15bb0 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e T_LOAD_SSL_STRIN
15bc0 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 GS | OPENSSL_INI
15bd0 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 T_LOAD_CRYPTO_ST
15be0 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c RINGS..| OPENSSL
15bf0 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 _INIT_ADD_ALL_CI
15c00 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f PHERS | OPENSSL_
15c10 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 INIT_ADD_ALL_DIG
15c20 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 ESTS, NULL);..
15c30 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 BIO_new_tcl(NU
15c40 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 64 65 66 LL, 0);..#if def
15c50 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
15c60 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
15c70 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 (TCL_THREADS).
15c80 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 Tcl_MutexUnloc
15c90 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e k(&init_mx);.#en
15ca0 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 dif.. return
15cb0 73 74 61 74 75 73 3b 0a 7d 0a status;.}.