0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61 (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69 some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68 ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32 pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72 ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79 poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53 right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29 *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61 2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68 st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64 * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61 dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64 .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74 ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 full fileevent
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 Also work done
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68 ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 e impetus to do
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 pts.h".#include
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 rsa.h>.#include
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61 <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72 10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76 "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69 1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72 dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a (key), (dsp))).
04e0: 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 .static SSL_CTX
04f0: 2a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 *CTX_Init(State
0500: 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 *statePtr, int i
0510: 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f sServer, int pro
0520: 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 to, char *key,..
0530: 09 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c .char *certfile,
0540: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
0550: 6b 65 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e key_asn1, unsign
0560: 65 64 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73 ed char *cert_as
0570: 6e 31 2c 0a 09 09 69 6e 74 20 6b 65 79 5f 61 73 n1,...int key_as
0580: 6e 31 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 n1_len, int cert
0590: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68 61 72 20 _asn1_len, char
05a0: 2a 43 41 64 69 72 2c 20 63 68 61 72 20 2a 43 41 *CAdir, char *CA
05b0: 66 69 6c 65 2c 0a 09 09 63 68 61 72 20 2a 63 69 file,...char *ci
05c0: 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 phers, char *cip
05d0: 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c hersuites, int l
05e0: 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 evel, char *DHpa
05f0: 72 61 6d 73 29 3b 0a 0a 73 74 61 74 69 63 20 69 rams);..static i
0600: 6e 74 09 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e nt.TlsLibInit(in
0610: 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 3b t uninitialize);
0620: 0a 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 ..#define TLS_PR
0630: 4f 54 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a 23 OTO_SSL2..0x01.#
0640: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f define TLS_PROTO
0650: 5f 53 53 4c 33 09 09 30 78 30 32 0a 23 64 65 66 _SSL3..0x02.#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ine TLS_PROTO_TL
0670: 53 31 09 09 30 78 30 34 0a 23 64 65 66 69 6e 65 S1..0x04.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
0690: 31 09 30 78 30 38 0a 23 64 65 66 69 6e 65 20 54 1.0x08.#define T
06a0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 LS_PROTO_TLS1_2.
06b0: 30 78 31 30 0a 23 64 65 66 69 6e 65 20 54 4c 53 0x10.#define TLS
06c0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78 _PROTO_TLS1_3.0x
06d0: 32 30 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 4c 20.#define ENABL
06e0: 45 44 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28 ED(flag, mask).(
06f0: 28 28 66 6c 61 67 29 20 26 20 28 6d 61 73 6b 29 ((flag) & (mask)
0700: 29 20 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 64 ) == (mask))..#d
0710: 65 66 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 46 efine SSLKEYLOGF
0720: 49 4c 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47 46 ILE.."SSLKEYLOGF
0730: 49 4c 45 22 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 ILE"../*. * Thre
0740: 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64 65 ad-Safe TLS Code
0750: 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c . */..#ifdef TCL
0760: 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e 65 _THREADS.#define
0770: 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 5f OPENSSL_THREAD_
0780: 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64 65 DEFINES.#include
0790: 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 73 <openssl/openss
07a0: 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65 66 lconf.h>..#ifdef
07b0: 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 OPENSSL_THREADS
07c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 .#include <opens
07d0: 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69 6e sl/crypto.h>.#in
07e0: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 clude <openssl/s
07f0: 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 72 sl.h>../*. * Thr
0800: 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 20 eaded operation
0810: 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e 67 requires locking
0820: 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42 61 callbacks. * Ba
0830: 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74 6f sed from /crypto
0840: 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20 4f /cryptlib.c of O
0850: 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70 65 penSSL and NSOpe
0860: 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 nSSL.. */..stati
0870: 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f 63 c Tcl_Mutex *loc
0880: 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 ks = NULL;.stati
0890: 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e 74 c int locksCount
08a0: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63 6c = 0;.static Tcl
08b0: 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b 0a _Mutex init_mx;.
08c0: 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53 53 #endif /* OPENSS
08d0: 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65 6e L_THREADS */.#en
08e0: 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45 41 dif /* TCL_THREA
08f0: 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a DS */..../******
0900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
0910: 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 /* Callbacks
0920: 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a */./********
0930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f ************/../
0940: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0980: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76 -------. *. * Ev
0990: 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d al Callback Comm
09a0: 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 and --. *. *.Eva
09b0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
09c0: 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e 79 nd and catch any
09d0: 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 errors. *. * Re
09e0: 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43 6f sults:. *.0 = Co
09f0: 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20 66 mmand returned f
0a00: 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74 75 ail or eval retu
0a10: 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a 20 rned TCL_ERROR.
0a20: 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 *.1 = Command re
0a30: 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20 6f turned success o
0a40: 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64 20 r eval returned
0a50: 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 TCL_OK. *. * Sid
0a60: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45 76 e effects:. *.Ev
0a70: 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63 6b aluates callback
0a80: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d command. *. *--
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ad0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
0ae0: 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54 63 .EvalCallback(Tc
0af0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
0b00: 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 , State *statePt
0b10: 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 r, Tcl_Obj *cmdP
0b20: 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f tr) {. int co
0b30: 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 de, ok = 0;..
0b40: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
0b50: 22 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 ");.. Tcl_Pre
0b60: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 serve((ClientDat
0b70: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 a) interp);.
0b80: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c Tcl_Preserve((Cl
0b90: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
0ba0: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 tr);.. /* Eva
0bb0: 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 l callback with
0bc0: 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f success for ok o
0bd0: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 31 r return value 1
0be0: 2c 20 66 61 69 6c 20 66 6f 72 20 65 72 72 6f 72 , fail for error
0bf0: 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 or return value
0c00: 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 0 */. Tcl_Re
0c10: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 setResult(interp
0c20: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 );. code = Tc
0c30: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 l_EvalObjEx(inte
0c40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f rp, cmdPtr, TCL_
0c50: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 EVAL_GLOBAL);.
0c60: 20 20 64 70 72 69 6e 74 66 28 22 45 76 61 6c 43 dprintf("EvalC
0c70: 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f allback: %d", co
0c80: 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 de);. if (cod
0c90: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 e == TCL_OK) {..
0ca0: 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74 20 /* Check result
0cb0: 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 for return value
0cc0: 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 */..Tcl_Obj *re
0cd0: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 sult = Tcl_GetOb
0ce0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b jResult(interp);
0cf0: 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 ..if (result ==
0d00: 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 NULL || Tcl_GetI
0d10: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
0d20: 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 , result, &ok) !
0d30: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
0d40: 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 ok = 1;..}..dpr
0d50: 69 6e 74 66 28 22 52 65 73 75 6c 74 3a 20 25 64 intf("Result: %d
0d60: 22 2c 20 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c ", ok);. } el
0d70: 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d se {../* Error -
0d80: 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 reject the cert
0d90: 69 66 69 63 61 74 65 20 2a 2f 0a 09 64 70 72 69 ificate */..dpri
0da0: 6e 74 66 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f ntf("Tcl_Backgro
0db0: 75 6e 64 45 72 72 6f 72 22 29 3b 0a 23 69 66 20 undError");.#if
0dc0: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
0dd0: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
0de0: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
0df0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
0e00: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 undError(interp)
0e10: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 ;.#else..Tcl_Bac
0e20: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e kgroundException
0e30: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a (interp, code);.
0e40: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
0e50: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 Tcl_Release((C
0e60: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
0e70: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 Ptr);. Tcl_Re
0e80: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
0e90: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 a) interp);.
0ea0: 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f return ok;.}.../
0eb0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e -------. *. * In
0f00: 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a foCallback --. *
0f10: 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c . *.Monitors SSL
0f20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 connection proc
0f30: 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ess. *. * Result
0f40: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
0f50: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
0f60: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
0f70: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
0f80: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fc0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
0fd0: 63 20 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 c void.InfoCallb
0fe0: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
0ff0: 73 6c 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 sl, int where, i
1000: 6e 74 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 nt ret) {. St
1010: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
1020: 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f (State*)SSL_get_
1030: 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 app_data((SSL *)
1040: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e ssl);. Tcl_In
1050: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
1060: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
1070: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
1080: 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a dPtr;. char *
1090: 6d 61 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e major; char *min
10a0: 6f 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 or;.. dprintf
10b0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
10c0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
10d0: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f allback == (Tcl_
10e0: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 Obj*)NULL)..retu
10f0: 72 6e 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 rn;.. if (whe
1100: 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 re & SSL_CB_HAND
1110: 53 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 SHAKE_START) {..
1120: 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 major = "handsha
1130: 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 ke";..minor = "s
1140: 74 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 tart";. } els
1150: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 e if (where & SS
1160: 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 L_CB_HANDSHAKE_D
1170: 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 ONE) {..major =
1180: 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 "handshake";..mi
1190: 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 nor = "done";.
11a0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 } else {..if (
11b0: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 where & SSL_CB_A
11c0: 4c 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 LERT)..major = "
11d0: 61 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 alert";..else if
11e0: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 (where & SSL_ST
11f0: 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 _CONNECT).major
1200: 3d 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c = "connect";..el
1210: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
1220: 53 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09 6d SL_ST_ACCEPT)..m
1230: 61 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22 3b ajor = "accept";
1240: 0a 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 ..else.....major
1250: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 = "unknown";...
1260: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
1270: 43 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 CB_READ)..minor
1280: 3d 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 = "read";..else
1290: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
12a0: 43 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 CB_WRITE)..minor
12b0: 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 = "write";..els
12c0: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 e if (where & SS
12d0: 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f L_CB_LOOP)..mino
12e0: 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 r = "loop";..els
12f0: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 e if (where & SS
1300: 4c 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f L_CB_EXIT)..mino
1310: 72 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 r = "exit";..els
1320: 65 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 e.....minor = "u
1330: 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a nknown";. }..
1340: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f /* Create co
1350: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f mmand to eval */
1360: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
1370: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
1380: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
1390: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 k);. Tcl_List
13a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
13b0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
13c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
13d0: 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a j("info", -1));.
13e0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
13f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
1400: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
1410: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
1420: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
1430: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
1440: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
1450: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
1460: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
1470: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
1480: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 wStringObj(major
1490: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
14a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
14b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
14c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
14d0: 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 ngObj(minor, -1)
14e0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 );.. if (wher
14f0: 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 e & SSL_CB_ALERT
1500: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
1510: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1520: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
1530: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
1540: 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 Obj(SSL_alert_de
1550: 73 63 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 sc_string_long(r
1560: 65 74 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f et), -1));..Tcl_
1570: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1580: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1590: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
15a0: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 wStringObj(SSL_a
15b0: 6c 65 72 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 lert_type_string
15c0: 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 _long(ret), -1))
15d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
15e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
15f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1600: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
1610: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 l_NewStringObj(S
1620: 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f SL_state_string_
1630: 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b long(ssl), -1));
1640: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
1650: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1660: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
1670: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 ewStringObj("inf
1680: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a o", -1));. }.
1690: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
16a0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
16b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
16c0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
16d0: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 EvalCallback(
16e0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
16f0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 , cmdPtr);. T
1700: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
1710: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a cmdPtr);.}.../*.
1720: 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1760: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 -----. *. * Mess
1770: 61 67 65 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 ageCallback --.
1780: 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 *. *.Monitors SS
1790: 4c 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 L protocol messa
17a0: 67 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ges. *. * Result
17b0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
17c0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
17d0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
17e0: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
17f0: 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1830: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 ------. */.#ifnd
1840: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ef OPENSSL_NO_SS
1850: 4c 5f 54 52 41 43 45 0a 73 74 61 74 69 63 20 76 L_TRACE.static v
1860: 6f 69 64 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 oid.MessageCallb
1870: 61 63 6b 28 69 6e 74 20 77 72 69 74 65 5f 70 2c ack(int write_p,
1880: 20 69 6e 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e int version, in
1890: 74 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 t content_type,
18a0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 75 66 2c const void *buf,
18b0: 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c size_t len, SSL
18c0: 20 2a 73 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 *ssl, void *arg
18d0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
18e0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
18f0: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 *)arg;. Tcl_I
1900: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
1910: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
1920: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
1930: 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 mdPtr;. char
1940: 2a 76 65 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 *ver, *type;.
1950: 20 42 49 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 BIO *bio;. c
1960: 68 61 72 20 62 75 66 66 65 72 5b 31 35 30 30 30 har buffer[15000
1970: 5d 3b 0a 20 20 20 20 62 75 66 66 65 72 5b 30 5d ];. buffer[0]
1980: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e = 0;.. dprin
1990: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
19a0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
19b0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 >callback == (Tc
19c0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 l_Obj*)NULL)..re
19d0: 74 75 72 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 turn;.. switc
19e0: 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 h(version) {.#if
19f0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
1a00: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
1a10: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 0000L && !define
1a20: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 d(NO_SSL2) && !d
1a30: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
1a40: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 O_SSL2). case
1a50: 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 SSL2_VERSION:..
1a60: 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 ver = "SSLv2";..
1a70: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
1a80: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
1a90: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
1aa0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
1ab0: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 56 . case SSL3_V
1ac0: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 ERSION:..ver = "
1ad0: 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a SSLv3";..break;.
1ae0: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 #endif. case
1af0: 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 TLS1_VERSION:..v
1b00: 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 er = "TLSv1";..b
1b10: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
1b20: 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 LS1_1_VERSION:..
1b30: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b ver = "TLSv1.1";
1b40: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1b50: 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e e TLS1_2_VERSION
1b60: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e :..ver = "TLSv1.
1b70: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 2";..break;.
1b80: 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 case TLS1_3_VERS
1b90: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 ION:..ver = "TLS
1ba0: 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 v1.3";..break;.
1bb0: 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65 72 20 case 0:..ver
1bc0: 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b = "none";..break
1bd0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 ;. default:..
1be0: 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b ver = "unknown";
1bf0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a ..break;. }..
1c00: 20 20 20 20 73 77 69 74 63 68 20 28 63 6f 6e 74 switch (cont
1c10: 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20 20 20 ent_type) {.
1c20: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 45 41 case SSL3_RT_HEA
1c30: 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 DER:..type = "He
1c40: 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 ader";..break;.
1c50: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f case SSL3_RT_
1c60: 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59 INNER_CONTENT_TY
1c70: 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e PE:..type = "Inn
1c80: 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70 65 22 er Content Type"
1c90: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1ca0: 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47 se SSL3_RT_CHANG
1cb0: 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a 0a 09 E_CIPHER_SPEC:..
1cc0: 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65 20 43 type = "Change C
1cd0: 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a ipher";..break;.
1ce0: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 case SSL3_RT
1cf0: 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d 20 _ALERT:..type =
1d00: 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b "Alert";..break;
1d10: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1d20: 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79 T_HANDSHAKE:..ty
1d30: 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22 pe = "Handshake"
1d40: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1d50: 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 se SSL3_RT_APPLI
1d60: 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 CATION_DATA:..ty
1d70: 70 65 20 3d 20 22 41 70 70 20 44 61 74 61 22 3b pe = "App Data";
1d80: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1d90: 65 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 e DTLS1_RT_HEART
1da0: 42 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 BEAT:..type = "H
1db0: 65 61 72 74 62 65 61 74 22 3b 0a 09 62 72 65 61 eartbeat";..brea
1dc0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a k;. default:.
1dd0: 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e .type = "unknown
1de0: 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a ";. }.. /*
1df0: 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 Needs compile t
1e00: 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 ime option "enab
1e10: 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a le-ssl-trace". *
1e20: 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f 20 3d /. if ((bio =
1e30: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d BIO_new(BIO_s_m
1e40: 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 em())) != NULL)
1e50: 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 {..int n;..SSL_t
1e60: 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20 76 65 race(write_p, ve
1e70: 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 rsion, content_t
1e80: 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 ype, buf, len, s
1e90: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 sl, (void *)bio)
1ea0: 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 ;..n = BIO_read(
1eb0: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 6d 69 6e bio, buffer, min
1ec0: 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f (BIO_pending(bio
1ed0: 29 2c 20 31 34 39 39 39 29 29 3b 0a 09 6e 20 3d ), 14999));..n =
1ee0: 20 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a (n<0) ? 0 : n;.
1ef0: 09 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a .buffer[n] = 0;.
1f00: 09 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 .(void)BIO_flush
1f10: 28 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 (bio);..BIO_free
1f20: 28 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 (bio);. }..
1f30: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
1f40: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
1f50: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
1f60: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
1f70: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
1f80: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1f90: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1fa0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
1fb0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
1fc0: 6d 65 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a message", -1));.
1fd0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
1fe0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
1ff0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
2000: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
2010: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
2020: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
2030: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
2040: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2050: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2060: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
2070: 77 53 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65 wStringObj(write
2080: 5f 70 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52 _p ? "Sent" : "R
2090: 65 63 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a eceived", -1));.
20a0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
20b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
20c0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
20d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65 _NewStringObj(ve
20e0: 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c r, -1));. Tcl
20f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2100: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
2110: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
2120: 69 6e 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29 ingObj(type, -1)
2130: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2140: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2150: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2160: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2170: 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a (buffer, -1));..
2180: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
2190: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
21a0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
21b0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
21c0: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 EvalCallback(i
21d0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
21e0: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 cmdPtr);. Tc
21f0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
2200: 6d 64 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 mdPtr);.}.#endif
2210: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
2220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
2260: 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b * VerifyCallback
2270: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f --. *. *.Monito
2280: 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 rs SSL certifica
2290: 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 te validation pr
22a0: 6f 63 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 ocess. Used to c
22b0: 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 ontrol the. *.be
22c0: 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 havior when the
22d0: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 SSL_VERIFY_PEER
22e0: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 flag is set. Thi
22f0: 73 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 s is called. *.w
2300: 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 henever a certif
2310: 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 icate is inspect
2320: 65 64 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e ed or decided in
2330: 76 61 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f valid. Called fo
2340: 72 0a 20 2a 09 65 61 63 68 20 63 65 72 74 69 66 r. *.each certif
2350: 69 63 61 74 65 20 69 6e 20 74 68 65 20 63 65 72 icate in the cer
2360: 74 20 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 t chain.. *. * C
2370: 68 65 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69 66 hecks:. *.certif
2380: 69 63 61 74 65 20 63 68 61 69 6e 20 69 73 20 63 icate chain is c
2390: 68 65 63 6b 65 64 20 73 74 61 72 74 69 6e 67 20 hecked starting
23a0: 77 69 74 68 20 74 68 65 20 64 65 65 70 65 73 74 with the deepest
23b0: 20 6e 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 nesting level.
23c0: 2a 09 20 20 28 74 68 65 20 72 6f 6f 74 20 43 41 *. (the root CA
23d0: 20 63 65 72 74 69 66 69 63 61 74 65 29 20 61 6e certificate) an
23e0: 64 20 77 6f 72 6b 65 64 20 75 70 77 61 72 64 20 d worked upward
23f0: 74 6f 20 74 68 65 20 70 65 65 72 27 73 20 63 65 to the peer's ce
2400: 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c rtificate.. *.Al
2410: 6c 20 73 69 67 6e 61 74 75 72 65 73 20 61 72 65 l signatures are
2420: 20 76 61 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 valid, current
2430: 74 69 6d 65 20 69 73 20 77 69 74 68 69 6e 20 66 time is within f
2440: 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 76 61 irst and last va
2450: 6c 69 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 lidity time.. *.
2460: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 63 Check that the c
2470: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 73 ertificate is is
2480: 73 75 65 64 20 62 79 20 74 68 65 20 69 73 73 75 sued by the issu
2490: 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20 69 er certificate i
24a0: 73 73 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 ssuer.. *.Check
24b0: 74 68 65 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 the revocation s
24c0: 74 61 74 75 73 20 66 6f 72 20 65 61 63 68 20 63 tatus for each c
24d0: 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 ertificate.. *.C
24e0: 68 65 63 6b 20 74 68 65 20 76 61 6c 69 64 69 74 heck the validit
24f0: 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 43 y of the given C
2500: 52 4c 20 61 6e 64 20 74 68 65 20 63 65 72 74 20 RL and the cert
2510: 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 revocation statu
2520: 73 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 s.. *.Check the
2530: 70 6f 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 policies of all
2540: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 73 the certificates
2550: 0a 20 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 . *. * Args. *.p
2560: 72 65 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 reverify_ok indi
2570: 63 61 74 65 73 20 77 68 65 74 68 65 72 20 74 68 cates whether th
2580: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 76 65 e certificate ve
2590: 72 69 66 69 63 61 74 69 6f 6e 20 70 61 73 73 65 rification passe
25a0: 64 20 28 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 d (1) or not (0)
25b0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
25c0: 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f *.A callback bo
25d0: 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 und to the socke
25e0: 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 t may return one
25f0: 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 of:. *. 0...
2600: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 - the certificat
2610: 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61 e is deemed inva
2620: 6c 69 64 2c 20 73 65 6e 64 20 76 65 72 69 66 69 lid, send verifi
2630: 63 61 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 cation. *.... f
2640: 61 69 6c 75 72 65 20 61 6c 65 72 74 20 74 6f 20 ailure alert to
2650: 70 65 65 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e peer, and termin
2660: 61 74 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 ate handshake..
2670: 2a 09 20 20 20 20 31 09 09 09 2d 20 74 68 65 20 *. 1...- the
2680: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64 certificate is d
2690: 65 65 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e eemed valid, con
26a0: 74 69 6e 75 65 20 77 69 74 68 20 68 61 6e 64 73 tinue with hands
26b0: 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 hake.. *. emp
26c0: 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 ty string.- no c
26d0: 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 hange to certifi
26e0: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a cate validation.
26f0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
2700: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 ts:. *.The err f
2710: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 ield of the curr
2720: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 ently operative
2730: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 State is set. *.
2740: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 to a string de
2750: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c scribing the SSL
2760: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 negotiation fai
2770: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 lure reason. *.
2780: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27c0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
27d0: 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 int.VerifyCallba
27e0: 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f ck(int ok, X509_
27f0: 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20 STORE_CTX *ctx)
2800: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 {. Tcl_Obj *c
2810: 6d 64 50 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 mdPtr;. SSL
2820: 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 *ssl..= (SSL*)X
2830: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 509_STORE_CTX_ge
2840: 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20 53 t_ex_data(ctx, S
2850: 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 SL_get_ex_data_X
2860: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 509_STORE_CTX_id
2870: 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20 20 x());. X509
2880: 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53 54 *cert..= X509_ST
2890: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 ORE_CTX_get_curr
28a0: 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 ent_cert(ctx);.
28b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
28c0: 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr.= (State*)SSL
28d0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73 _get_app_data(ss
28e0: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 l);. Tcl_Inte
28f0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
2900: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
2910: 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20 int depth..=
2920: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 X509_STORE_CTX_g
2930: 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63 et_error_depth(c
2940: 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 tx);. int err
2950: 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 ..= X509_STORE_C
2960: 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78 TX_get_error(ctx
2970: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 );.. dprintf(
2980: 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 64 "Called");. d
2990: 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61 printf("VerifyCa
29a0: 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 6f 6b 29 llback: %d", ok)
29b0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
29c0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 Ptr->vcmd == (Tc
29d0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
29e0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 66 if (statePtr->vf
29f0: 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 46 lags & SSL_VERIF
2a00: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 Y_FAIL_IF_NO_PEE
2a10: 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 72 R_CERT) {.. r
2a20: 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 eturn ok;..} els
2a30: 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 e {.. return
2a40: 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 1;..}. } else
2a50: 20 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c if (cert == NUL
2a60: 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c L || ssl == NULL
2a70: 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 ) {..return 0;.
2a80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
2a90: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
2aa0: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 val */. cmdPt
2ab0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
2ac0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
2ad0: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
2ae0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2af0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2b00: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2b10: 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 Obj("verify", -1
2b20: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2b30: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2b40: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2b50: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f ..Tcl_NewStringO
2b60: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
2b70: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
2b80: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
2b90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2ba0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2bb0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
2bc0: 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b wIntObj(depth));
2bd0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2be0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2bf0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c terp, cmdPtr, Tl
2c00: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 s_NewX509Obj(int
2c10: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 erp, cert));.
2c20: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2c30: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2c40: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
2c50: 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 wIntObj(ok));.
2c60: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2c70: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2c80: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f p, cmdPtr,..Tcl_
2c90: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 NewStringObj((ch
2ca0: 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f ar*)X509_verify_
2cb0: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e cert_error_strin
2cc0: 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 g(err), -1));..
2cd0: 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f /* Prevent I/
2ce0: 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b O while callback
2cf0: 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 is in progress
2d00: 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 */. /* stateP
2d10: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 tr->flags |= TLS
2d20: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a _TCL_CALLBACK; *
2d30: 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 /.. /* Eval c
2d40: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
2d50: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
2d60: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
2d70: 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 . ok = EvalCa
2d80: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 llback(interp, s
2d90: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 tatePtr, cmdPtr)
2da0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 ;. Tcl_DecrRe
2db0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
2dc0: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 . /* statePtr
2dd0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 ->flags &= ~(TLS
2de0: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 _TCL_CALLBACK);
2df0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b */. return(ok
2e00: 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 );./* By default
2e10: 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 , leave verifica
2e20: 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 tion unchanged.
2e30: 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d */.}.../*. *----
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2e80: 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 *. * Tls_Error
2e90: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 --. *. *.Calls c
2ea0: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 allback with lis
2eb0: 74 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a t of errors.. *.
2ec0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
2ed0: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c . *.The err fiel
2ee0: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 d of the current
2ef0: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 ly operative Sta
2f00: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 te is set. *. t
2f10: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 o a string descr
2f20: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 ibing the SSL ne
2f30: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 gotiation failur
2f40: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d e reason. *. *--
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f90: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 -. */.void.Tls_E
2fa0: 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 rror(State *stat
2fb0: 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 ePtr, char *msg)
2fc0: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 {. Tcl_Inter
2fd0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
2fe0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
2ff0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
3000: 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 r, *listPtr;.
3010: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 unsigned long e
3020: 72 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 rr;. statePtr
3030: 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 ->err = msg;..
3040: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
3050: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
3060: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
3070: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
3080: 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 LL)..return;..
3090: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
30a0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 and to eval */.
30b0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
30c0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
30d0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
30e0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
30f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3100: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3110: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3120: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 "error", -1));.
3130: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3140: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3150: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
3160: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3170: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
3180: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
3190: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
31a0: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 if (msg != NULL)
31b0: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
31c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
31d0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
31e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 _NewStringObj(ms
31f0: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 g, -1));.. }
3200: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 else if ((msg =
3210: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
3220: 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 mObj(Tcl_GetObjR
3230: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 28 esult(interp), (
3240: 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c Tcl_Size *) NULL
3250: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 )) != NULL) {..T
3260: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3270: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3280: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
3290: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 tringObj(msg, -1
32a0: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 ));.. } else
32b0: 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c {..listPtr = Tcl
32c0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
32d0: 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65 ULL);..while ((e
32e0: 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 rr = ERR_get_err
32f0: 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20 or()) != 0) {..
3300: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3310: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3320: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c rp, listPtr, Tcl
3330: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52 _NewStringObj(ER
3340: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 R_reason_error_s
3350: 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 tring(err), -1))
3360: 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 ;..}..Tcl_ListOb
3370: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3380: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c nterp, cmdPtr, l
3390: 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a istPtr);. }..
33a0: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
33b0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
33c0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
33d0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
33e0: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 EvalCallback(i
33f0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
3400: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 cmdPtr);. Tc
3410: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
3420: 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 mdPtr);.}.../*.
3430: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3470: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f ----. *. * KeyLo
3480: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a gCallback --. *.
3490: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 *.Write receive
34a0: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f d key data to lo
34b0: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 g file.. *. * Si
34c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
34d0: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3520: 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c .void KeyLogCall
3530: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a back(const SSL *
3540: 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 ssl, const char
3550: 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 *line) {. cha
3560: 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 r *str = getenv(
3570: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a SSLKEYLOGFILE);.
3580: 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 FILE *fd;..
3590: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
35a0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
35b0: 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 tr) {..fd = fope
35c0: 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 n(str, "a");..fp
35d0: 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 rintf(fd, "%s\n"
35e0: 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 ,line);..fclose(
35f0: 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f fd);. }.}.../
3600: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 50 61 -------. *. * Pa
3650: 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 ssword Callback
3660: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
3670: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 when a password
3680: 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65 for a private ke
3690: 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69 6e y loading/storin
36a0: 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 74 69 g a PEM. *.certi
36b0: 66 69 63 61 74 65 20 77 69 74 68 20 65 6e 63 72 ficate with encr
36c0: 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 yption. Evals ca
36d0: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 61 6e llback script an
36e0: 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 68 65 d returns. *.the
36f0: 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 70 result as the p
3700: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69 assword string i
3710: 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 n buf.. *. * Res
3720: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
3730: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
3740: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
3750: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
3760: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
3770: 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65 *.Password size
3780: 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20 in bytes or -1
3790: 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a for an error.. *
37a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
37f0: 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 c int.PasswordCa
3800: 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 llback(char *buf
3810: 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 , int size, int
3820: 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 rwflag, void *ud
3830: 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 ata) {. State
3840: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 *statePtr.= (St
3850: 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 ate *) udata;.
3860: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
3870: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
3880: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
3890: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
38a0: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 int code;..
38b0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
38c0: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e ");.. /* If n
38d0: 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 o callback, use
38e0: 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b default callback
38f0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
3900: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
3910: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 = NULL) {..if (T
3920: 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 cl_EvalEx(interp
3930: 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 , "tls::password
3940: 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f ", -1, TCL_EVAL_
3950: 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f GLOBAL) == TCL_O
3960: 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a K) {.. char *
3970: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 ret = (char *) T
3980: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 cl_GetStringResu
3990: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 lt(interp);..
39a0: 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 strncpy(buf, re
39b0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 t, (size_t) size
39c0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 );.. return (
39d0: 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b int)strlen(ret);
39e0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
39f0: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 return -1;..}.
3a00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
3a10: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
3a20: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 al */. cmdPtr
3a30: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
3a40: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 Obj(statePtr->pa
3a50: 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c ssword);. Tcl
3a60: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3a70: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3a80: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
3a90: 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64 ingObj("password
3aa0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
3ab0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3ac0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3ad0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 dPtr, Tcl_NewInt
3ae0: 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20 Obj(rwflag));.
3af0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
3b00: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3b10: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
3b20: 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b ewIntObj(size));
3b30: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 .. Tcl_Preser
3b40: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
3b50: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c interp);. Tcl
3b60: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
3b70: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
3b80: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
3b90: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
3ba0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
3bb0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
3bc0: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f . code = Tcl_
3bd0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 EvalObjEx(interp
3be0: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 , cmdPtr, TCL_EV
3bf0: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 AL_GLOBAL);.
3c00: 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f if (code != TCL_
3c10: 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d OK) {.#if (TCL_M
3c20: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 AJOR_VERSION ==
3c30: 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 8) && (TCL_MINOR
3c40: 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 _VERSION < 6)..T
3c50: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 cl_BackgroundErr
3c60: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 or(interp);.#els
3c70: 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e e..Tcl_Backgroun
3c80: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 dException(inter
3c90: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 p, code);.#endif
3ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
3cb0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
3cc0: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 tr);.. Tcl_Re
3cd0: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
3ce0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
3cf0: 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73 /* If success
3d00: 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70 ful, pass back p
3d10: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61 assword string a
3d20: 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66 20 74 nd truncate if t
3d30: 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 oo long */. i
3d40: 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f f (code == TCL_O
3d50: 4b 29 20 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c K) {..Tcl_Size l
3d60: 65 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d en;..char *ret =
3d70: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 (char *) Tcl_Ge
3d80: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 tStringFromObj(T
3d90: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
3da0: 69 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a interp), &len);.
3db0: 09 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f .if (len > (Tcl_
3dc0: 53 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a Size) size-1) {.
3dd0: 09 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f . len = (Tcl_
3de0: 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d Size) size-1;..}
3df0: 0a 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 ..strncpy(buf, r
3e00: 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e et, (size_t) len
3e10: 29 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 );..buf[len] = '
3e20: 5c 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 \0';..Tcl_Releas
3e30: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
3e40: 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 nterp);..return(
3e50: 28 69 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20 20 (int) len);.
3e60: 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 }. Tcl_Releas
3e70: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
3e80: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 nterp);. retu
3e90: 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a rn -1;.}.../*. *
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ee0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f ---. *. * Sessio
3ef0: 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 n Callback for C
3f00: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 lients --. *. *.
3f10: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 Called when a ne
3f20: 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64 w session is add
3f30: 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e ed to the cache.
3f40: 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 In TLS 1.3. *.t
3f50: 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 69 his may be recei
3f60: 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d ved multiple tim
3f70: 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61 6e es after the han
3f80: 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 dshake. For. *.e
3f90: 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c arlier versions,
3fa0: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 this will be re
3fb0: 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 68 ceived during th
3fc0: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 e handshake.. *.
3fd0: 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65 66 This is the pref
3fe0: 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74 erred way to obt
3ff0: 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20 ain a resumable
4000: 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 session.. *. * R
4010: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
4020: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
4030: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
4040: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
4050: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 d). *. * Return
4060: 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 codes:. *.0 = er
4070: 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 6f ror where sessio
4080: 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 n will be immedi
4090: 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 ately removed fr
40a0: 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 om the internal
40b0: 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 cache.. *.1 = su
40c0: 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70 20 ccess where app
40d0: 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 retains session
40e0: 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65 in session cache
40f0: 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 , and must call
4100: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 SSL_SESSION_free
4110: 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a () when done.. *
4120: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4160: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
4170: 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c c int.SessionCal
4180: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
4190: 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f *ssl, SSL_SESSIO
41a0: 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 N *session) {.
41b0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
41c0: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f r = (State*)SSL_
41d0: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 get_app_data((SS
41e0: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 L *)ssl);. Tc
41f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
4200: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
4210: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
4220: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f *cmdPtr;. co
4230: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4240: 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 r *ticket;. c
4250: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
4260: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a ar *session_id;.
4270: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b size_t len2;
4280: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e . unsigned in
4290: 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 t ulen;.. dpr
42a0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
42b0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
42c0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 r->callback == (
42d0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b Tcl_Obj*)NULL) {
42e0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
42f0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
4300: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d } else if (ssl =
4310: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
4320: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
4330: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
4340: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
4350: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a mand to eval */.
4360: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
4370: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
4380: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
4390: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
43a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
43b0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
43c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
43d0: 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 ("session", -1))
43e0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
43f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
4400: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
4410: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
4420: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
4430: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
4440: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a ->self), -1));..
4450: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 /* Session i
4460: 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e d */. session
4470: 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f _id = SSL_SESSIO
4480: 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e N_get_id(session
4490: 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 , &ulen);. Tc
44a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
44b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
44c0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 mdPtr, Tcl_NewBy
44d0: 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 teArrayObj(sessi
44e0: 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 on_id, (Tcl_Size
44f0: 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f ) ulen));.. /
4500: 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 * Session ticket
4510: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 */. SSL_SESS
4520: 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 ION_get0_ticket(
4530: 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 session, &ticket
4540: 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 , &len2);. Tc
4550: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4560: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4570: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 mdPtr, Tcl_NewBy
4580: 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 teArrayObj(ticke
4590: 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 t, (Tcl_Size) le
45a0: 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 n2));.. /* Li
45b0: 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 fetime - number
45c0: 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 of seconds */.
45d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
45e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
45f0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f p, cmdPtr,..Tcl_
4600: 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 NewLongObj((long
4610: 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 ) SSL_SESSION_ge
4620: 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d t_ticket_lifetim
4630: 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 e_hint(session))
4640: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 );.. /* Eval
4650: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
4660: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
4670: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
4680: 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 ;. EvalCallba
4690: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ck(interp, state
46a0: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 Ptr, cmdPtr);.
46b0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
46c0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
46d0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a return 0;.}.../*
46e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4720: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 ------. *. * ALP
4730: 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 N Callback for S
4740: 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 ervers and NPN C
4750: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 allback for Clie
4760: 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 nts --. *. *.Per
4770: 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 form protocol (h
4780: 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c ttp/1.1, h2, h3,
4790: 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e etc.) selection
47a0: 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f for the. *.inco
47b0: 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e ming connection.
47c0: 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 Called after He
47d0: 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 llo and server c
47e0: 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 allbacks.. *.Whe
47f0: 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 re 'out' is sele
4800: 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e cted protocol an
4810: 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 d 'in' is the pe
4820: 65 72 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 er advertised li
4830: 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 st.. *. * Result
4840: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
4850: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
4860: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
4870: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
4880: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 . * Return codes
4890: 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f :. *.SSL_TLSEXT_
48a0: 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f ERR_OK: ALPN pro
48b0: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 tocol selected.
48c0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
48d0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c ontinues.. *.SSL
48e0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 _TLSEXT_ERR_ALER
48f0: 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 T_FATAL: There w
4900: 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 as no overlap be
4910: 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 tween the client
4920: 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 's. *. suppli
4930: 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 ed list and the
4940: 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 server configura
4950: 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 tion. The connec
4960: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f tion will be abo
4970: 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 rted.. *.SSL_TLS
4980: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 EXT_ERR_NOACK: A
4990: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 LPN protocol not
49a0: 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c selected, e.g.,
49b0: 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e because no ALPN
49c0: 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c . *. protocol
49d0: 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 s are configured
49e0: 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 for this connec
49f0: 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 tion. The connec
4a00: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a tion continues..
4a10: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
4a60: 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c tic int.ALPNCall
4a70: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a back(const SSL *
4a80: 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 ssl, const unsig
4a90: 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 ned char **out,
4aa0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f unsigned char *o
4ab0: 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e utlen,..const un
4ac0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c signed char *in,
4ad0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e unsigned int in
4ae0: 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 len, void *arg)
4af0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
4b00: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
4b10: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 arg;. Tcl_Int
4b20: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
4b30: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
4b40: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
4b50: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 Ptr;. int cod
4b60: 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 e, res;.. dpr
4b70: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
4b80: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 . if (ssl ==
4b90: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e NULL || arg == N
4ba0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
4bb0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
4bc0: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ACK;. }..
4bd0: 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 /* Select protoc
4be0: 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 ol */. if (SS
4bf0: 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 L_select_next_pr
4c00: 6f 74 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c oto(out, outlen,
4c10: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
4c20: 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f s, statePtr->pro
4c30: 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e tos_len,..in, in
4c40: 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f len) == OPENSSL_
4c50: 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 NPN_NEGOTIATED)
4c60: 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e {../* Match foun
4c70: 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f d */..res = SSL_
4c80: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
4c90: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 } else {../*
4ca0: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f OPENSSL_NPN_NO_O
4cb0: 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 VERLAP = No over
4cc0: 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 lap, so use firs
4cd0: 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 t item from clie
4ce0: 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 nt protocol list
4cf0: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 */..res = SSL_T
4d00: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
4d10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
4d20: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
4d30: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
4d40: 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b ) {..return res;
4d50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
4d60: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
4d70: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 eval */. cmd
4d80: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
4d90: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
4da0: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f >vcmd);. Tcl_
4db0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
4dc0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
4dd0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
4de0: 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 ngObj("alpn", -1
4df0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
4e00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
4e10: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
4e20: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
4e30: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
4e40: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
4e50: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b tr->self), -1));
4e60: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4e70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4e80: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
4e90: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a l_NewStringObj(*
4ea0: 6f 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 out, -1));. T
4eb0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
4ec0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
4ed0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 cmdPtr, Tcl_NewB
4ee0: 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d ooleanObj(res ==
4ef0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
4f00: 4f 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 OK));.. /* Ev
4f10: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
4f20: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
4f30: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
4f40: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f tr);. if ((co
4f50: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 de = EvalCallbac
4f60: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
4f70: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 tr, cmdPtr)) > 1
4f80: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 ) {..res = SSL_T
4f90: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
4fa0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
4fb0: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 code == 1) {..re
4fc0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
4fd0: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 RR_OK;. } els
4fe0: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 e {..res = SSL_T
4ff0: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
5000: 46 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 FATAL;. }.
5010: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
5020: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 t(cmdPtr);. r
5030: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f eturn res;.}.../
5040: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5080: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 -------. *. * Ad
5090: 76 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c vertise Protocol
50a0: 73 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e s Callback for N
50b0: 65 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 ext Protocol Neg
50c0: 6f 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 otiation (NPN) i
50d0: 6e 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d n ServerHello --
50e0: 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 . *. *.called wh
50f0: 65 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 en a TLS server
5100: 6e 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 needs a list of
5110: 73 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 supported protoc
5120: 6f 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 ols for Next. *.
5130: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 Protocol Negotia
5140: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 tion.. *. * Resu
5150: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
5160: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
5170: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
5180: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 des:. *.SSL_TLSE
5190: 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 XT_ERR_OK: NPN p
51a0: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
51b0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
51c0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
51d0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
51e0: 41 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f ACK: NPN protoco
51f0: 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 l not selected.
5200: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
5210: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d ontinues.. *. *-
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5260: 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 --. */.#ifdef US
5270: 45 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 E_NPN.static int
5280: 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e .NPNCallback(con
5290: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e st SSL *ssl, con
52a0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
52b0: 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 **out, unsigned
52c0: 20 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f int *outlen, vo
52d0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
52e0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
52f0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 (State*)arg;..
5300: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
5310: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
5320: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 sl == NULL || ar
5330: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 g == NULL) {..re
5340: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
5350: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
5360: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f .. /* Set pro
5370: 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 tocols list */.
5380: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
5390: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 >protos != NULL)
53a0: 20 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 {..*out = state
53b0: 50 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f Ptr->protos;..*o
53c0: 75 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 utlen = statePtr
53d0: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 ->protos_len;.
53e0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 } else {..*out
53f0: 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 = NULL;..*outle
5400: 6e 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 n = 0;..return S
5410: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
5420: 41 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ACK;. }. r
5430: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
5440: 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 _ERR_OK;.}.#endi
5450: 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d f.../*. *-------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
54a0: 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 * SNI Callback
54b0: 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 for Servers --.
54c0: 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 *. *.Perform ser
54d0: 76 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 ver-side SNI hos
54e0: 74 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 tname selection
54f0: 61 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 after receiving
5500: 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a SNI extension. *
5510: 09 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f .in Client Hello
5520: 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 . Called after h
5530: 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 ello callback bu
5540: 74 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 t before ALPN ca
5550: 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 llback.. *. * Re
5560: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
5570: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
5580: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
5590: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
55a0: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 ). *. * Return c
55b0: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 odes:. *.SSL_TLS
55c0: 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 EXT_ERR_OK: SNI
55d0: 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 hostname is acce
55e0: 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 pted. The connec
55f0: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a tion continues..
5600: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
5610: 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 R_ALERT_FATAL: S
5620: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e NI hostname is n
5630: 6f 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 ot accepted. The
5640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 connection. *.
5650: 20 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 is aborted. D
5660: 65 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 efault for alert
5670: 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 is SSL_AD_UNREC
5680: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a OGNIZED_NAME.. *
5690: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
56a0: 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 ALERT_WARNING: S
56b0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e NI hostname is n
56c0: 6f 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 ot accepted, war
56d0: 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 ning alert. *.
56e0: 20 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 sent (not supp
56f0: 6f 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 orted in TLSv1.3
5700: 29 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f ). The connectio
5710: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 n continues.. *.
5720: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
5730: 4f 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 OACK: SNI hostna
5740: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 me is not accept
5750: 65 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f ed and not ackno
5760: 77 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 wledged,. *.
5770: 65 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 e.g. if SNI has
5780: 6e 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 not been configu
5790: 72 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 red. The connect
57a0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
57b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
5800: 69 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 ic int.SNICallba
5810: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 ck(const SSL *ss
5820: 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 l, int *alert, v
5830: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 oid *arg) {.
5840: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
5850: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 = (State*)arg;.
5860: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
5870: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
5880: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
5890: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
58a0: 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 int code, res
58b0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 ;. char *serv
58c0: 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a ername = NULL;..
58d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
58e0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
58f0: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 ssl == NULL || a
5900: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 rg == NULL) {..r
5910: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
5920: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
5930: 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 }.. /* Only w
5940: 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 orks for TLS 1.2
5950: 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a and earlier */.
5960: 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d servername =
5970: 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e SSL_get_servern
5980: 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f ame(ssl, TLSEXT_
5990: 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 NAMETYPE_host_na
59a0: 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 me);. if (!se
59b0: 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 rvername || serv
59c0: 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 ername[0] == '\0
59d0: 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c ') {..return SSL
59e0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
59f0: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 K;. }.. if
5a00: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 (statePtr->vcmd
5a10: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
5a20: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
5a30: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
5a40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
5a50: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
5a60: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 eval */. cmd
5a70: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
5a80: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
5a90: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f >vcmd);. Tcl_
5aa0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5ab0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5ac0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
5ad0: 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 ngObj("sni", -1)
5ae0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
5af0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
5b00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
5b10: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
5b20: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 ngObj(Tcl_GetCha
5b30: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
5b40: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a r->self), -1));.
5b50: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
5b60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5b70: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
5b80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 _NewStringObj(se
5b90: 72 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b rvername , -1));
5ba0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
5bb0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
5bc0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
5bd0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
5be0: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 if ((code =
5bf0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
5c00: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
5c10: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 mdPtr)) > 1) {..
5c20: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
5c30: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 _ERR_ALERT_WARNI
5c40: 4e 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 NG;..*alert = SS
5c50: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 L_AD_UNRECOGNIZE
5c60: 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 D_NAME; /* Not s
5c70: 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 upported by TLS
5c80: 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 1.3 */. } els
5c90: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 e if (code == 1)
5ca0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
5cb0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
5cc0: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
5cd0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5ce0: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 ALERT_FATAL;..*a
5cf0: 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e lert = SSL_AD_UN
5d00: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b RECOGNIZED_NAME;
5d10: 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 /* Not supporte
5d20: 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a d by TLS 1.3 */.
5d30: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
5d40: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
5d50: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 r);. return r
5d60: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d es;.}.../*. *---
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5db0: 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c . *. * ClientHel
5dc0: 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c lo Handshake Cal
5dd0: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 lback for Server
5de0: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 s --. *. *.Used
5df0: 62 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 by server to exa
5e00: 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 mine the server
5e10: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 name indication
5e20: 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a (SNI) extension.
5e30: 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 *.provided by t
5e40: 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 he client in ord
5e50: 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 er to select an
5e60: 61 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 appropriate cert
5e70: 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 ificate to. *.pr
5e80: 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 esent, and make
5e90: 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 other configurat
5ea0: 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 ion adjustments
5eb0: 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 relevant to that
5ec0: 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 server. *.name
5ed0: 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 and its configur
5ee0: 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c ation. This incl
5ef0: 75 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 udes swapping ou
5f00: 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 t the associated
5f10: 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e . *.SSL_CTX poin
5f20: 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 ter, modifying t
5f30: 68 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 he server's list
5f40: 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c of permitted TL
5f50: 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 S versions,. *.c
5f60: 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 hanging the serv
5f70: 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 er's cipher list
5f80: 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 in response to
5f90: 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 the client's cip
5fa0: 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 her list, etc..
5fb0: 2a 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 *.Called before
5fc0: 53 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c SNI and ALPN cal
5fd0: 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 lbacks.. *. * Re
5fe0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
5ff0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
6000: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
6010: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
6020: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 ). *. * Return c
6030: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 odes:. *.SSL_CLI
6040: 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a ENT_HELLO_RETRY:
6050: 20 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e suspend the han
6060: 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 dshake, and the
6070: 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 handshake functi
6080: 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 on will return i
6090: 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 mmediately. *.SS
60a0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
60b0: 52 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 RROR: failure, t
60c0: 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 erminate connect
60d0: 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 ion. Set alert t
60e0: 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a o error code.. *
60f0: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c .SSL_CLIENT_HELL
6100: 4f 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 O_SUCCESS: succe
6110: 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ss. *. *--------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
6160: 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f static int.Hello
6170: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
6180: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c SL *ssl, int *al
6190: 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 ert, void *arg)
61a0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
61b0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
61c0: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 arg;. Tcl_Int
61d0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
61e0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
61f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
6200: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 Ptr;. int cod
6210: 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 e, res;. cons
6220: 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 t char *serverna
6230: 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e me;. const un
6240: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a signed char *p;.
6250: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 size_t len,
6260: 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 remaining;..
6270: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
6280: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
6290: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 ePtr->vcmd == (T
62a0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
62b0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
62c0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 NT_HELLO_SUCCESS
62d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
62e0: 28 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 (ssl == (const S
62f0: 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 SL *)NULL || arg
6300: 20 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c == (void *)NULL
6310: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
6320: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6330: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
6340: 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 * Get names */.
6350: 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 if (!SSL_clie
6360: 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 nt_hello_get0_ex
6370: 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 t(ssl, TLSEXT_TY
6380: 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 PE_server_name,
6390: 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 &p, &remaining)
63a0: 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 || remaining <=
63b0: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 2) {..*alert = S
63c0: 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 SL_R_SSLV3_ALERT
63d0: 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 _ILLEGAL_PARAMET
63e0: 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ER;..return SSL_
63f0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6400: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
6410: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 * Extract the le
6420: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 ngth of the supp
6430: 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d lied list of nam
6440: 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d es. */. len =
6450: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a (*(p++) << 8);.
6460: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b len += *(p++
6470: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b );. if (len +
6480: 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 2 != remaining)
6490: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
64a0: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 _R_SSLV3_ALERT_I
64b0: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 LLEGAL_PARAMETER
64c0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
64d0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
64e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 ;. }. rema
64f0: 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 ining = len;..
6500: 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e /* The list in
6510: 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 practice only h
6520: 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d as a single elem
6530: 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 ent, so we only
6540: 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 consider the fir
6550: 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 st one. */. i
6560: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 f (remaining ==
6570: 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 0 || *p++ != TLS
6580: 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 EXT_NAMETYPE_hos
6590: 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 t_name) {..*aler
65a0: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f t = SSL_R_TLSV1_
65b0: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 ALERT_INTERNAL_E
65c0: 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 RROR;..return SS
65d0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
65e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
65f0: 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 remaining--;..
6600: 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 /* Now we can
6610: 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 finally pull out
6620: 20 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 the byte array
6630: 77 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 with the actual
6640: 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 hostname. */.
6650: 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c if (remaining <
6660: 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d = 2) {..*alert =
6670: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 SSL_R_TLSV1_ALE
6680: 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f RT_INTERNAL_ERRO
6690: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 R;..return SSL_C
66a0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
66b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e R;. }. len
66c0: 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 = (*(p++) << 8)
66d0: 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 ;. len += *(p
66e0: 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e ++);. if (len
66f0: 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 + 2 > remaining
6700: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
6710: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f L_R_TLSV1_ALERT_
6720: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a INTERNAL_ERROR;.
6730: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
6740: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
6750: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e }. remain
6760: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 ing = len;. s
6770: 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e ervername = (con
6780: 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 st char *)p;..
6790: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
67a0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 and to eval */.
67b0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
67c0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
67d0: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 tePtr->vcmd);.
67e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
67f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
6800: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
6810: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c ewStringObj("hel
6820: 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lo", -1));. T
6830: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6840: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6850: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
6860: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
6870: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
6880: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
6890: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
68a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
68b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
68c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
68d0: 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 ngObj(servername
68e0: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e , (Tcl_Size) len
68f0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c ));.. /* Eval
6900: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
6910: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
6920: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
6930: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 );. if ((code
6940: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 = EvalCallback(
6950: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
6960: 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 , cmdPtr)) > 1)
6970: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 {..res = SSL_CLI
6980: 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b ENT_HELLO_RETRY;
6990: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 ..*alert = SSL_R
69a0: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 _TLSV1_ALERT_USE
69b0: 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 R_CANCELLED;.
69c0: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 } else if (code
69d0: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 == 1) {..res =
69e0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
69f0: 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 _SUCCESS;. }
6a00: 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 else {..res = SS
6a10: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
6a20: 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 RROR;..*alert =
6a30: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
6a40: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 T_INTERNAL_ERROR
6a50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
6a60: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
6a70: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
6a80: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a res;.}.../*****
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
6aa0: 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 ./* Commands
6ab0: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
6ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
6ad0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
6b20: 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 iphersObjCmd --
6b30: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 list available c
6b40: 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 iphers. *. *.Thi
6b50: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
6b60: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
6b70: 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 s the "tls::ciph
6b80: 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 ers" command. *.
6b90: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c to list availabl
6ba0: 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 e ciphers, based
6bb0: 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 upon protocol s
6bc0: 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 elected.. *. * R
6bd0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
6be0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
6bf0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 list.. *. * Sid
6c00: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f e effects:. *.co
6c10: 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 nstructs and des
6c20: 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 troys SSL contex
6c30: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d t (CTX). *. *---
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c80: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 . */.static cons
6c90: 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c t char *protocol
6ca0: 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c s[] = {.."ssl2",
6cb0: 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c "ssl3", "tls1",
6cc0: 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 "tls1.1", "tls1
6cd0: 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e .2", "tls1.3", N
6ce0: 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 ULL.};.enum prot
6cf0: 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 ocol {. TLS_S
6d00: 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 SL2, TLS_SSL3, T
6d10: 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 LS_TLS1, TLS_TLS
6d20: 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 1_1, TLS_TLS1_2,
6d30: 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 TLS_TLS1_3, TLS
6d40: 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 _NONE.};..static
6d50: 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 int.CiphersObjC
6d60: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
6d70: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
6d80: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
6d90: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
6da0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
6db0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
6dc0: 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 jPtr = NULL;.
6dd0: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 SSL_CTX *ctx =
6de0: 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 NULL;. SSL *s
6df0: 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 sl = NULL;. S
6e00: 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 TACK_OF(SSL_CIPH
6e10: 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 ER) *sk;. cha
6e20: 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 49 r *cp, buf[BUFSI
6e30: 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 Z];. int inde
6e40: 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 x, verbose = 0,
6e50: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 use_supported =
6e60: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 0;. const SSL
6e70: 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b _METHOD *method;
6e80: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
6e90: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ntData;.. dpr
6ea0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
6eb0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c . if ((objc <
6ec0: 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 2) || (objc > 4
6ed0: 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e )) {..Tcl_WrongN
6ee0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
6ef0: 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f , objv, "protoco
6f00: 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 l ?verbose? ?sup
6f10: 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 ported?");..retu
6f20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
6f30: 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f }. if (Tcl_
6f40: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 GetIndexFromObj(
6f50: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c interp, objv[1],
6f60: 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f protocols, "pro
6f70: 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 tocol", 0, &inde
6f80: 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a x) != TCL_OK) {.
6f90: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
6fa0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
6fb0: 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 ((objc > 2) && T
6fc0: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f cl_GetBooleanFro
6fd0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
6fe0: 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 v[2], &verbose)
6ff0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 != TCL_OK) {..re
7000: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7010: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f }. if ((o
7020: 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f bjc > 3) && Tcl_
7030: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 GetBooleanFromOb
7040: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 j(interp, objv[3
7050: 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 ], &use_supporte
7060: 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a d) != TCL_OK) {.
7070: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7080: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 R;. }.. ER
7090: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
70a0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 .. switch ((e
70b0: 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 num protocol)ind
70c0: 65 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f ex) {..case TLS_
70d0: 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 SSL2:.#if OPENSS
70e0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
70f0: 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 >= 0x10100000L
7100: 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 || defined(NO_SS
7110: 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L2) || defined(O
7120: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
7130: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
7140: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
7150: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
7160: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
7170: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
7180: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
7190: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
71a0: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 . method = SS
71b0: 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 Lv2_method(); br
71c0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 eak;.#endif..cas
71d0: 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 e TLS_SSL3:.#if
71e0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
71f0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7200: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 SSL_NO_SSL3) ||
7210: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7220: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a NO_SSL3_METHOD).
7230: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
7240: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
7250: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
7260: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
7270: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
7280: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
7290: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
72a0: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 . method = SS
72b0: 4c 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 Lv3_method(); br
72c0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 eak;.#endif..cas
72d0: 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 e TLS_TLS1:.#if
72e0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
72f0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7300: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 SSL_NO_TLS1) ||
7310: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7320: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
7330: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
7340: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
7350: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
7360: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
7370: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
7380: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
7390: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
73a0: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c . method = TL
73b0: 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 Sv1_method(); br
73c0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 eak;.#endif..cas
73d0: 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 e TLS_TLS1_1:.#i
73e0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
73f0: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_1) || defined(
7400: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
7410: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
7420: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f ENSSL_NO_TLS1_1_
7430: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c METHOD).. Tcl
7440: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
7450: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
7460: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
7470: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
7480: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 d", NULL);..
7490: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
74a0: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 ;.#else.. met
74b0: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 hod = TLSv1_1_me
74c0: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 thod(); break;.#
74d0: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
74e0: 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 TLS1_2:.#if defi
74f0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c ned(NO_TLS1_2) |
7500: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
7510: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 L_NO_TLS1_2) ||
7520: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7530: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 NO_TLS1_2_METHOD
7540: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
7550: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
7560: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
7570: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
7580: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
7590: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
75a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
75b0: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 e.. method =
75c0: 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29 TLSv1_2_method()
75d0: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
75e0: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33 .case TLS_TLS1_3
75f0: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f :.#if defined(NO
7600: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 _TLS1_3) || defi
7610: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
7620: 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 63 6c 5f LS1_3).. Tcl_
7630: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7640: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
7650: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
7660: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
7670: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
7680: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7690: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
76a0: 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 od = TLS_method(
76b0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
76c0: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 set_min_proto_ve
76d0: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f rsion(ctx, TLS1_
76e0: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 3_VERSION);..
76f0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 SSL_CTX_set_max
7700: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
7710: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
7720: 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b ON);.. break;
7730: 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 .#endif..default
7740: 3a 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 :.. method =
7750: 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 TLS_method();..
7760: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
7770: 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 . ctx = SSL_C
7780: 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a TX_new(method);.
7790: 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e if (ctx == N
77a0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
77b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
77c0: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
77d0: 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ), NULL);..retur
77e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
77f0: 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 }.. ssl = SS
7800: 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 L_new(ctx);.
7810: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 if (ssl == NULL)
7820: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
7830: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 54 sult(interp, GET
7840: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 4e _ERR_REASON(), N
7850: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
7860: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
7870: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
7880: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c }.. /* Use l
7890: 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 ist and order as
78a0: 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 would be sent i
78b0: 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 n a ClientHello
78c0: 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 or all available
78d0: 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 ciphers */.
78e0: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 if (use_supporte
78f0: 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 d) {..sk = SSL_g
7900: 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 et1_supported_ci
7910: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 phers(ssl);.
7920: 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 } else {..sk = S
7930: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 SL_get_ciphers(s
7940: 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 sl);. }..
7950: 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 if (sk != NULL)
7960: 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 {..if (!verbose)
7970: 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d {.. objPtr =
7980: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
7990: 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 0, NULL);.. f
79a0: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 or (int i = 0; i
79b0: 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 < sk_SSL_CIPHER
79c0: 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b _num(sk); i++) {
79d0: 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 ...const SSL_CIP
79e0: 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f HER *c = sk_SSL_
79f0: 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c CIPHER_value(sk,
7a00: 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 i);...if (c ==
7a10: 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a NULL) continue;.
7a20: 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d .../* cipher nam
7a30: 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 e or (NONE) */..
7a40: 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 .cp = SSL_CIPHER
7a50: 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 _get_name(c);...
7a60: 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 if (cp == NULL)
7a70: 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 break;...Tcl_Lis
7a80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
7a90: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
7aa0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
7ab0: 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 bj(cp, -1));..
7ac0: 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 }...} else {..
7ad0: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
7ae0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 _NewStringObj(""
7af0: 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 ,0);.. for (i
7b00: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b nt i = 0; i < sk
7b10: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 _SSL_CIPHER_num(
7b20: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f sk); i++) {...co
7b30: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a nst SSL_CIPHER *
7b40: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 c = sk_SSL_CIPHE
7b50: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a R_value(sk, i);.
7b60: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 ..if (c == NULL)
7b70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a continue;..../*
7b80: 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 textual descrip
7b90: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 tion of the ciph
7ba0: 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f er */...if (SSL_
7bb0: 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 CIPHER_descripti
7bc0: 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f on(c, buf, sizeo
7bd0: 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 f(buf)) != NULL)
7be0: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 {... Tcl_App
7bf0: 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c endToObj(objPtr,
7c00: 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 buf, (Tcl_Size)
7c10: 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 strlen(buf));..
7c20: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 .} else {...
7c30: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 Tcl_AppendToObj(
7c40: 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e objPtr, "UNKNOWN
7c50: 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 \n", 8);...}..
7c60: 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f }..}..if (use_
7c70: 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 supported) {..
7c80: 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f sk_SSL_CIPHER_
7c90: 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 free(sk);..}.
7ca0: 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 }. SSL_free(
7cb0: 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 ssl);. SSL_CT
7cc0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 X_free(ctx);..
7cd0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
7ce0: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
7cf0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
7d00: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d50: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 ---. *. * Protoc
7d60: 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 olsObjCmd -- lis
7d70: 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 t available prot
7d80: 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 ocols. *. *.This
7d90: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
7da0: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 voked to process
7db0: 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f the "tls::proto
7dc0: 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a cols" command. *
7dd0: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 .to list availab
7de0: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a le protocols.. *
7df0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
7e00: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
7e10: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 esult list.. *.
7e20: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
7e30: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.none. *. *---
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e80: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
7e90: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 ProtocolsObjCmd(
7ea0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
7eb0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
7ec0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
7ed0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
7ee0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
7ef0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
7f00: 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c r;. (void) cl
7f10: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 ientData;.. d
7f20: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
7f30: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
7f40: 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 1) {..Tcl_Wro
7f50: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
7f60: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a , 1, objv, "");.
7f70: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7f80: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 R;. }.. ER
7f90: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
7fa0: 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
7fb0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
7fc0: 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 NULL);..#if OPE
7fd0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
7fe0: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 BER < 0x10100000
7ff0: 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f L && !defined(NO
8000: 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e _SSL2) && !defin
8010: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
8020: 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 L2). Tcl_List
8030: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
8040: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
8050: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
8060: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
8070: 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e SSL2], -1));.#en
8080: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
8090: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 (NO_SSL3) && !de
80a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
80b0: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
80c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
80d0: 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 L3_METHOD). T
80e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
80f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
8100: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
8110: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
8120: 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 ls[TLS_SSL3], -1
8130: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
8140: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
8150: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
8160: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 NSSL_NO_TLS1) &&
8170: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
8180: 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 L_NO_TLS1_METHOD
8190: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
81a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
81b0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
81c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
81d0: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
81e0: 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 S1], -1));.#endi
81f0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
8200: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
8210: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8220: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
8230: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8240: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_1_METHOD).
8250: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
8260: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
8270: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
8280: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
8290: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f tocols[TLS_TLS1_
82a0: 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 1], -1));.#endif
82b0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
82c0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
82d0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
82e0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
82f0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
8300: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 LS1_2_METHOD).
8310: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
8320: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
8330: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
8340: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
8350: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 ocols[TLS_TLS1_2
8360: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
8370: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
8380: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
8390: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
83a0: 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c LS1_3). Tcl_L
83b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
83c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
83d0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
83e0: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
83f0: 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 LS_TLS1_3], -1))
8400: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 ;.#endif.. Tc
8410: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
8420: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
8430: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
8440: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
8450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
8490: 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f *. * HandshakeO
84a0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 bjCmd --. *. *.T
84b0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 his command is u
84c0: 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 sed to verify wh
84d0: 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 ether the handsh
84e0: 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a ake is complete.
84f0: 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a *.or not.. *. *
8500: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
8510: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
8520: 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 lt. 1 means hand
8530: 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 shake complete,
8540: 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0 means pending.
8550: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
8560: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 cts:. *.May forc
8570: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f e SSL negotiatio
8580: 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e n to take place.
8590: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
85a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
85e0: 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 atic int Handsha
85f0: 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 keObjCmd(ClientD
8600: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
8610: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
8620: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
8630: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
8640: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
8650: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 hannel chan;
8660: 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e /* The chann
8670: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
8680: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 on. */. Stat
8690: 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 e *statePtr;
86a0: 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 /* client st
86b0: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b ate for ssl sock
86c0: 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 et */. const
86d0: 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e char *errStr = N
86e0: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 ULL;. int ret
86f0: 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 = 1;. int er
8700: 72 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 r = 0;. (void
8710: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
8720: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
8730: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
8740: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
8750: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
8760: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
8770: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
8780: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
8790: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
87a0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
87b0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
87c0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
87d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
87e0: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28 54 mObj(objv[1], (T
87f0: 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 cl_Size *) NULL)
8800: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 , NULL);. if
8810: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
8820: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
8830: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
8840: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
8850: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
8860: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
8870: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a most channel */.
8880: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
8890: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
88a0: 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f n);. if (Tcl_
88b0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
88c0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
88d0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 nelType()) {..Tc
88e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
88f0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
8900: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
8910: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
8920: 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 ),.. "\": not
8930: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
8940: 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 NULL);..Tcl_Set
8950: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
8960: 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 , "TLS", "HANDSH
8970: 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c AKE", "CHANNEL",
8980: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
8990: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
89a0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
89b0: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 }. stateP
89c0: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 tr = (State *)Tc
89d0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
89e0: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
89f0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
8a00: 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f lling Tls_WaitFo
8a10: 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 rConnect");.
8a20: 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f ret = Tls_WaitFo
8a30: 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 rConnect(statePt
8a40: 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 r, &err, 1);.
8a50: 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 dprintf("Tls_Wa
8a60: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 itForConnect ret
8a70: 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 urned: %i", ret)
8a80: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c ;.. if (ret <
8a90: 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 0 && ((statePtr
8aa0: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 ->flags & TLS_TC
8ab0: 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 L_ASYNC) && (err
8ac0: 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a == EAGAIN))) {.
8ad0: 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 .dprintf("Async
8ae0: 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 set and err = EA
8af0: 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 GAIN");..ret = 0
8b00: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
8b10: 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e (ret < 0) {..lon
8b20: 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 g result;..errSt
8b30: 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 r = statePtr->er
8b40: 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 r;..Tcl_ResetRes
8b50: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 ult(interp);..Tc
8b60: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b l_SetErrno(err);
8b70: 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c ...if (!errStr |
8b80: 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 | (*errStr == 0)
8b90: 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 ) {.. errStr
8ba0: 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 = Tcl_PosixError
8bb0: 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 (interp);..}...T
8bc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8bd0: 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 interp, "handsha
8be0: 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 ke failed: ", er
8bf0: 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e rStr, (char *) N
8c00: 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75 ULL);..if ((resu
8c10: 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 lt = SSL_get_ver
8c20: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 ify_result(state
8c30: 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 Ptr->ssl)) != X5
8c40: 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 09_V_OK) {..
8c50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
8c60: 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74 (interp, " due t
8c70: 6f 3a 20 22 2c 20 58 35 30 39 5f 76 65 72 69 66 o: ", X509_verif
8c80: 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 y_cert_error_str
8c90: 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 28 63 68 ing(result), (ch
8ca0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a ar *) NULL);..}.
8cb0: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
8cc0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
8cd0: 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 46 "HANDSHAKE", "F
8ce0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
8cf0: 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 NULL);..dprintf
8d00: 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f ("Returning TCL_
8d10: 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 ERROR with hands
8d20: 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 hake failed: %s"
8d30: 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 , errStr);..retu
8d40: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
8d50: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
8d60: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 (err != 0) {..
8d70: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 dprintf("Got a
8d80: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 n error with a c
8d90: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 ompleted handsha
8da0: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 ke: err = %i", e
8db0: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 rr);..}..ret = 1
8dc0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
8dd0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 intf("Returning
8de0: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 TCL_OK with data
8df0: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a \"%i\"", ret);.
8e00: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
8e10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
8e20: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 _NewIntObj(ret))
8e30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c ;. return(TCL
8e40: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d _OK);.}../*. *--
8e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e90: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 -. *. * ImportOb
8ea0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
8eb0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
8ec0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
8ed0: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d ss the "ssl" com
8ee0: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 mand. *. *.The s
8ef0: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 sl command pushe
8f00: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 s SSL over a (ne
8f10: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 wly connected) t
8f20: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 cp socket. *. *
8f30: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
8f40: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
8f50: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
8f60: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f fects:. *.May mo
8f70: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f dify the behavio
8f80: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e r of an IO chann
8f90: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d el.. *. *-------
8fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
8fe0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f .static int.Impo
8ff0: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 rtObjCmd(ClientD
9000: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
9010: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
9020: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
9030: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
9040: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
9050: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
9060: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
9070: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
9080: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
9090: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e tePtr;../* clien
90a0: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
90b0: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 socket */. SS
90c0: 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20 20 20 L_CTX *ctx.
90d0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 = NULL;. T
90e0: 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 20 cl_Obj *script.
90f0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
9100: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 Tcl_Obj *pass
9110: 77 6f 72 64 09 20 20 20 20 20 20 20 20 3d 20 4e word. = N
9120: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
9130: 20 2a 76 63 6d 64 09 20 20 20 20 20 20 20 20 3d *vcmd. =
9140: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 NULL;. Tcl_D
9150: 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e String upperChan
9160: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 nelTranslation,
9170: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
9180: 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e king, upperChann
9190: 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 elEncoding, uppe
91a0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b rChannelEOFChar;
91b0: 0a 20 20 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 . int idx;.
91c0: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a Tcl_Size len;.
91d0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09 20 int flags..
91e0: 20 20 20 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c = TLS_TCL
91f0: 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 _INIT;. int s
9200: 65 72 76 65 72 09 09 20 20 20 20 20 20 20 20 3d erver.. =
9210: 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 0;./* is connec
9220: 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 tion incoming or
9230: 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 outgoing? */.
9240: 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 char *keyfile.
9250: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
9260: 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 char *certfi
9270: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c le. = NUL
9280: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 L;. unsigned
9290: 63 68 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55 char *key .= NU
92a0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 LL;. Tcl_Size
92b0: 20 6b 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 key_len
92c0: 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 = 0;.
92d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
92e0: 2a 63 65 72 74 20 20 20 20 20 20 20 20 20 3d 20 *cert =
92f0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 NULL;. Tcl_Si
9300: 7a 65 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 ze cert_len
9310: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a = 0;.
9320: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 char *cipher
9330: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c s. = NULL
9340: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ;. char *ciph
9350: 65 72 73 75 69 74 65 73 09 20 20 20 20 20 20 20 ersuites.
9360: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
9370: 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20 r *CAfile.
9380: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 = NULL;. ch
9390: 61 72 20 2a 43 41 64 69 72 09 09 20 20 20 20 20 ar *CAdir..
93a0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 = NULL;. c
93b0: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20 har *DHparams.
93c0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
93d0: 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 char *model..
93e0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
93f0: 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e char *servern
9400: 61 6d 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ame. = NU
9410: 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 LL;./* hostname
9420: 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 for Server Name
9430: 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 Indication */.
9440: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
9450: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
9460: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 d = NULL;. Tc
9470: 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e l_Obj *alpn..= N
9480: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c ULL;. int ssl
9490: 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 2 = 0, ssl3 = 0;
94a0: 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 . int tls1 =
94b0: 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 1, tls1_1 = 1, t
94c0: 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f ls1_2 = 1, tls1_
94d0: 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 3 = 1;. int p
94e0: 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 roto = 0, level
94f0: 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 = -1;. int ve
9500: 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 rify = 0, requir
9510: 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d e = 0, request =
9520: 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 1, post_handsha
9530: 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 ke = 0;. (voi
9540: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a d) clientData;..
9550: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
9560: 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 led");..#if defi
9570: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 ned(NO_TLS1) ||
9580: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
9590: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 NO_TLS1). tls
95a0: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 1 = 0;.#endif.#i
95b0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
95c0: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_1) || defined(
95d0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
95e0: 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 1). tls1_1 =
95f0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
9600: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
9610: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
9620: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 SSL_NO_TLS1_2).
9630: 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 tls1_2 = 0;.#
9640: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
9650: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 d(NO_TLS1_3) ||
9660: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
9670: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 NO_TLS1_3). t
9680: 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 ls1_3 = 0;.#endi
9690: 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 f.. if (objc
96a0: 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e < 2) {..Tcl_Wron
96b0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
96c0: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
96d0: 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a el ?options?");.
96e0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
96f0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 R;. }.. ER
9700: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
9710: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
9720: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
9730: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
9740: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d gFromObj(objv[1]
9750: 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e , (Tcl_Size *) N
9760: 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 ULL), NULL);.
9770: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
9780: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
9790: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
97a0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
97b0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f /* Make sure to
97c0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
97d0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
97e0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
97f0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
9800: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 chan);.. for
9810: 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 (idx = 2; idx <
9820: 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 objc; idx++) {..
9830: 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f char *opt = Tcl_
9840: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
9850: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 28 54 63 6c (objv[idx], (Tcl
9860: 5f 53 69 7a 65 20 2a 29 4e 55 4c 4c 29 3b 0a 0a _Size *)NULL);..
9870: 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 .if (opt[0] != '
9880: 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a -').. break;.
9890: 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 ..OPTOBJ("-alpn"
98a0: 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 , alpn);..OPTSTR
98b0: 28 22 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 ("-cadir", CAdir
98c0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 );..OPTSTR("-caf
98d0: 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 ile", CAfile);..
98e0: 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c OPTBYTE("-cert",
98f0: 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 cert, cert_len)
9900: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 ;..OPTSTR("-cert
9910: 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 file", certfile)
9920: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 ;..OPTSTR("-ciph
9930: 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 er", ciphers);..
9940: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 OPTSTR("-ciphers
9950: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 ", ciphers);..OP
9960: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 TSTR("-ciphersui
9970: 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 tes", ciphersuit
9980: 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 es);..OPTOBJ("-c
9990: 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 ommand", script)
99a0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 ;..OPTSTR("-dhpa
99b0: 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 rams", DHparams)
99c0: 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 ;..OPTBYTE("-key
99d0: 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 ", key, key_len)
99e0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 ;..OPTSTR("-keyf
99f0: 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a ile", keyfile);.
9a00: 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 .OPTSTR("-model"
9a10: 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 , model);..OPTOB
9a20: 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 J("-password", p
9a30: 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f assword);..OPTBO
9a40: 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 OL("-post_handsh
9a50: 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 ake", post_hands
9a60: 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 hake);..OPTBOOL(
9a70: 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 "-request", requ
9a80: 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 est);..OPTBOOL("
9a90: 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 -require", requi
9aa0: 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 re);..OPTINT("-s
9ab0: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 ecurity_level",
9ac0: 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c level);..OPTBOOL
9ad0: 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 ("-server", serv
9ae0: 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 er);..OPTSTR("-s
9af0: 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 ervername", serv
9b00: 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 ername);..OPTSTR
9b10: 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 ("-session_id",
9b20: 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 session_id);..OP
9b30: 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 TBOOL("-ssl2", s
9b40: 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 sl2);..OPTBOOL("
9b50: 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 -ssl3", ssl3);..
9b60: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c OPTBOOL("-tls1",
9b70: 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c tls1);..OPTBOOL
9b80: 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 ("-tls1.1", tls1
9b90: 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d _1);..OPTBOOL("-
9ba0: 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 tls1.2", tls1_2)
9bb0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
9bc0: 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 1.3", tls1_3);..
9bd0: 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 OPTOBJ("-validat
9be0: 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 ecommand", vcmd)
9bf0: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 ;..OPTOBJ("-vcmd
9c00: 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 ", vcmd);...OPTB
9c10: 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 AD("option", "-a
9c20: 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 lpn, -cadir, -ca
9c30: 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 file, -cert, -ce
9c40: 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c rtfile, -cipher,
9c50: 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 -ciphersuites,
9c60: 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 -command, -dhpar
9c70: 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 ams, -key, -keyf
9c80: 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 ile, -model, -pa
9c90: 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 ssword, -post_ha
9ca0: 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 ndshake, -reques
9cb0: 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 t, -require, -se
9cc0: 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 2d 73 curity_level, -s
9cd0: 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 erver, -serverna
9ce0: 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c me, -session_id,
9cf0: 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d -ssl2, -ssl3, -
9d00: 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d tls1, -tls1.1, -
9d10: 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c tls1.2, -tls1.3,
9d20: 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d or -validatecom
9d30: 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e mand");...return
9d40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
9d50: 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 }. if (reques
9d60: 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53 53 t)..verify |= SS
9d70: 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f L_VERIFY_CLIENT_
9d80: 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 ONCE | SSL_VERIF
9d90: 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28 Y_PEER;. if (
9da0: 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69 request && requi
9db0: 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 re).verify |= SS
9dc0: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 L_VERIFY_FAIL_IF
9dd0: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 _NO_PEER_CERT;.
9de0: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 if (request &
9df0: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 & post_handshake
9e00: 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f ).verify |= SSL_
9e10: 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 VERIFY_POST_HAND
9e20: 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76 SHAKE;. if (v
9e30: 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65 72 erify == 0)..ver
9e40: 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 ify = SSL_VERIFY
9e50: 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 _NONE;.. prot
9e60: 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 o |= (ssl2 ? TLS
9e70: 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 _PROTO_SSL2 : 0)
9e80: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
9e90: 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f ssl3 ? TLS_PROTO
9ea0: 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 _SSL3 : 0);.
9eb0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f proto |= (tls1 ?
9ec0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 TLS_PROTO_TLS1
9ed0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
9ee0: 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 |= (tls1_1 ? TLS
9ef0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 _PROTO_TLS1_1 :
9f00: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
9f10: 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 (tls1_2 ? TLS_P
9f20: 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 ROTO_TLS1_2 : 0)
9f30: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
9f40: 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f tls1_3 ? TLS_PRO
9f50: 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a TO_TLS1_3 : 0);.
9f60: 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f . /* reset to
9f70: 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 NULL if blank s
9f80: 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a tring provided *
9f90: 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26 /. if (cert &
9fa0: 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20 & !*cert)..
9fb0: 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20 cert.
9fc0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
9fd0: 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20 key && !*key)..
9fe0: 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20 key.
9ff0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
a000: 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21 f (certfile && !
a010: 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20 *certfile)
a020: 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 certfile.= NU
a030: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66 LL;. if (keyf
a040: 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 ile && !*keyfile
a050: 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20 )..keyfile.
a060: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
a070: 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a f (ciphers && !*
a080: 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20 ciphers).
a090: 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 ciphers.
a0a0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
a0b0: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26 26 (ciphersuites &&
a0c0: 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 29 !*ciphersuites)
a0d0: 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20 20 ciphersuites
a0e0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
a0f0: 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66 (CAfile && !*CAf
a100: 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66 ile). CAf
a110: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ile. = NU
a120: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69 LL;. if (CAdi
a130: 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 20 20 r && !*CAdir).
a140: 20 20 20 20 20 20 43 41 64 69 72 09 20 20 20 20 CAdir.
a150: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a160: 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 if (DHparams &&
a170: 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20 !*DHparams).
a180: 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20 DHparams
a190: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 = NULL;..
a1a0: 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 /* new SSL stat
a1b0: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 e */. statePt
a1c0: 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 r..= (State *) c
a1d0: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 kalloc((unsigned
a1e0: 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 ) sizeof(State))
a1f0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 ;. memset(sta
a200: 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 tePtr, 0, sizeof
a210: 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 (State));.. s
a220: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d tatePtr->flags.=
a230: 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 flags;. stat
a240: 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 ePtr->interp.= i
a250: 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 nterp;. state
a260: 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 Ptr->vflags.= ve
a270: 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 rify;. stateP
a280: 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 tr->err.= "";..
a290: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 /* allocate s
a2a0: 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 cript */. if
a2b0: 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 (script) {..(voi
a2c0: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 d) Tcl_GetString
a2d0: 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 FromObj(script,
a2e0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 &len);..if (len)
a2f0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 {.. statePtr
a300: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 ->callback = scr
a310: 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e ipt;.. Tcl_In
a320: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
a330: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
a340: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
a350: 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f allocate passwo
a360: 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 rd */. if (pa
a370: 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 ssword) {..(void
a380: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
a390: 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c romObj(password,
a3a0: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e &len);..if (len
a3b0: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 ) {.. statePt
a3c0: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 r->password = pa
a3d0: 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c ssword;.. Tcl
a3e0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _IncrRefCount(st
a3f0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
a400: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
a410: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c /* allocate val
a420: 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f idate command */
a430: 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b . if (vcmd) {
a440: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 ..(void) Tcl_Get
a450: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 StringFromObj(vc
a460: 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 md, &len);..if (
a470: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 len) {.. stat
a480: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d ePtr->vcmd = vcm
a490: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 d;.. Tcl_Incr
a4a0: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
a4b0: 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 r->vcmd);..}.
a4c0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 }.. if (mode
a4d0: 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e l != NULL) {..in
a4e0: 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 t mode;../* Get
a4f0: 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 the "model" cont
a500: 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 ext */..chan = T
a510: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
a520: 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f terp, model, &mo
a530: 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d de);..if (chan =
a540: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
a550: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 NULL) {.. Tls
a560: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
a570: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
a580: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
a590: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b ..}.../*.. * Mak
a5a0: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
a5b0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
a5c0: 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 channel.. */..c
a5d0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
a5e0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 Channel(chan);..
a5f0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
a600: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
a610: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
a620: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
a630: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
a640: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
a650: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
a660: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
a670: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 ."\": not a TLS
a680: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
a690: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
a6a0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
a6b0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
a6c0: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 "CHANNEL", "INVA
a6d0: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LID", (char *) N
a6e0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
a6f0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
a700: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
a710: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
a720: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 }..ctx = ((State
a730: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
a740: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
a750: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d an))->ctx;. }
a760: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 else {..if ((ct
a770: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 x = CTX_Init(sta
a780: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 tePtr, server, p
a790: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 roto, keyfile, c
a7a0: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 ertfile, key, ce
a7b0: 72 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65 rt, (int) key_le
a7c0: 6e 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 63 65 n,.. (int) ce
a7d0: 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43 rt_len, CAdir, C
a7e0: 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 Afile, ciphers,
a7f0: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 ciphersuites, le
a800: 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 vel, DHparams))
a810: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 == NULL) {..
a820: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
a830: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
a840: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
a850: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
a860: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 statePtr->ctx
a870: 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 = ctx;.. /*.
a880: 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f * We need to
a890: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 make sure that
a8a0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b the channel work
a8b0: 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 s in binary (for
a8c0: 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 the. * encr
a8d0: 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 yption not to ge
a8e0: 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 t goofed up)..
a8f0: 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e * We only wan
a900: 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 t to adjust the
a910: 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 buffering in pre
a920: 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 -v2 channels, wh
a930: 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 ere. * each
a940: 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 channel in the s
a950: 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 tack maintained
a960: 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e its own buffers.
a970: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c . */. Tcl
a980: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
a990: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
a9a0: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f ation);. Tcl_
a9b0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
a9c0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
a9d0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 g);. Tcl_DStr
a9e0: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
a9f0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 annelEOFChar);.
aa00: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
aa10: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
aa20: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 Encoding);. T
aa30: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
aa40: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
aa50: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 , "-eofchar", &u
aa60: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
aa70: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ar);. Tcl_Get
aa80: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
aa90: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e terp, chan, "-en
aaa0: 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 coding", &upperC
aab0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b hannelEncoding);
aac0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
aad0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
aae0: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c , chan, "-transl
aaf0: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 ation", &upperCh
ab00: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
ab10: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
ab20: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
ab30: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 rp, chan, "-bloc
ab40: 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 king", &upperCha
ab50: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 nnelBlocking);.
ab60: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
ab70: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
ab80: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 chan, "-translat
ab90: 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b ion", "binary");
aba0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
abb0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
abc0: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 , chan, "-blocki
abd0: 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 ng", "true");.
abe0: 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 dprintf("Consu
abf0: 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c ming Tcl channel
ac00: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 %s", Tcl_GetCha
ac10: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b nnelName(chan));
ac20: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 . statePtr->s
ac30: 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 elf = Tcl_StackC
ac40: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
ac50: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
ac60: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 , (ClientData) s
ac70: 74 61 74 65 50 74 72 2c 0a 09 28 54 43 4c 5f 52 tatePtr,..(TCL_R
ac80: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 EADABLE | TCL_WR
ac90: 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a ITABLE), chan);.
aca0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 dprintf("Cre
acb0: 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d ated channel nam
acc0: 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 ed %s", Tcl_GetC
acd0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
ace0: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 Ptr->self));.
acf0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 if (statePtr->s
ad00: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e elf == (Tcl_Chan
ad10: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a nel) NULL) {../*
ad20: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 .. * No use of T
ad30: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 cl_EventuallyFre
ad40: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 e because no pos
ad50: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 sible Tcl_Preser
ad60: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 ve... */..Tls_Fr
ad70: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
ad80: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 ePtr);..return T
ad90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
ada0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
adb0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
adc0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
add0: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
ade0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
adf0: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
ae00: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 Translation));.
ae10: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
ae20: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
ae30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 statePtr->self,
ae40: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c "-encoding", Tcl
ae50: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
ae60: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
ae70: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 ing));. Tcl_S
ae80: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
ae90: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
aea0: 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 ->self, "-eofcha
aeb0: 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 r", Tcl_DStringV
aec0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
aed0: 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 elEOFChar));.
aee0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
aef0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 ption(interp, st
af00: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d atePtr->self, "-
af10: 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 blocking", Tcl_D
af20: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
af30: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
af40: 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 g));.. /*.
af50: 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 * SSL Initiali
af60: 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 zation. */.
af70: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c statePtr->ssl
af80: 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 = SSL_new(state
af90: 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 Ptr->ctx);. i
afa0: 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73 f (!statePtr->ss
afb0: 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 l) {../* SSL lib
afc0: 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 rary error */..T
afd0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
afe0: 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 interp, "couldn'
aff0: 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 t construct ssl
b000: 73 65 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54 5f session: ", GET_
b010: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
b020: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
b030: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
b040: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
b050: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e ", "IMPORT", "IN
b060: 49 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 IT", "FAILED", (
b070: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
b080: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
b090: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 ) statePtr);..re
b0a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
b0b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
b0c0: 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 t host server na
b0d0: 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 me */. if (se
b0e0: 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 rvername) {../*
b0f0: 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20 Sets the server
b100: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 name indication
b110: 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 (SNI) in ClientH
b120: 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a ello extension *
b130: 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 /../* Per RFC 60
b140: 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 66, hostname is
b150: 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 a ASCII encoded
b160: 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 string, though R
b170: 46 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46 FC 4366 says UTF
b180: 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c -8. */..if (!SSL
b190: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 _set_tlsext_host
b1a0: 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e _name(statePtr->
b1b0: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 ssl, servername)
b1c0: 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 && require) {..
b1d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
b1e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 sult(interp, "Se
b1f0: 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 t SNI extension
b200: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 failed: ", GET_E
b210: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
b220: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b230: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
b240: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
b250: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 , "IMPORT", "SNI
b260: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
b270: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b280: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
b290: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
b2a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
b2b0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 RROR;..}.../* Se
b2c0: 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 t hostname for p
b2d0: 65 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20 eer certificate
b2e0: 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63 hostname verific
b2f0: 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 ation in clients
b300: 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20 ... Don't use
b310: 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 SSL_set1_host si
b320: 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74 nce it has limit
b330: 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 ations. */..if (
b340: 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 !SSL_add1_host(s
b350: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 tatePtr->ssl, se
b360: 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 rvername)) {..
b370: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
b380: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 lt(interp, "Set
b390: 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 66 61 69 DNS hostname fai
b3a0: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f led: ", GET_ERR_
b3b0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
b3c0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b3d0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
b3e0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
b3f0: 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 IMPORT", "HOSTNA
b400: 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 ME", "FAILED", (
b410: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
b420: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
b430: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
b440: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
b450: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
b460: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 .. /* Resume
b470: 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 session id */.
b480: 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 if (session_id
b490: 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 && strlen(sessi
b4a0: 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 on_id) <= SSL_MA
b4b0: 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 X_SID_CTX_LENGTH
b4c0: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f ) {../* SSL_set_
b4d0: 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 session() */..if
b4e0: 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 (!SSL_SESSION_s
b4f0: 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 et1_id_context(S
b500: 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 SL_get_session(s
b510: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 tatePtr->ssl), s
b520: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 ession_id, (unsi
b530: 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e gned int) strlen
b540: 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b (session_id))) {
b550: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
b560: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b570: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66 Resume session f
b580: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 ailed: ", GET_ER
b590: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
b5a0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
b5b0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 Tcl_SetErrorCod
b5c0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
b5d0: 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 "IMPORT", "SESS
b5e0: 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 ION", "FAILED",
b5f0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
b600: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
b610: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
b620: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
b630: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 L_ERROR;..}.
b640: 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 }.. /* Enable
b650: 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 Application-Lay
b660: 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f er Protocol Nego
b670: 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 tiation. Example
b680: 73 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c s are: http/1.0,
b690: 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 ..http/1.1, h2,
b6a0: 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 h3, ftp, imap, p
b6b0: 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 op3, xmpp-client
b6c0: 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d , xmpp-server, m
b6d0: 71 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a qtt, irc, etc. *
b6e0: 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 /. if (alpn)
b6f0: 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 {../* Convert a
b700: 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 TCL list into a
b710: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e protocol-list in
b720: 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a wire-format */.
b730: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a .unsigned char *
b740: 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 protos, *p;..uns
b750: 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 igned int protos
b760: 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 _len = 0;..Tcl_S
b770: 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 ize cnt, i;..int
b780: 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c j;..Tcl_Obj **l
b790: 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c ist;...if (Tcl_L
b7a0: 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 istObjGetElement
b7b0: 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 s(interp, alpn,
b7c0: 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 &cnt, &list) !=
b7d0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 TCL_OK) {.. T
b7e0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
b7f0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
b800: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
b810: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 R;..}.../* Deter
b820: 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 mine the memory
b830: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 required for the
b840: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a protocol-list *
b850: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 /..for (i = 0; i
b860: 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 < cnt; i++) {..
b870: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e Tcl_GetStrin
b880: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d gFromObj(list[i]
b890: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 , &len);.. if
b8a0: 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 (len > 255) {..
b8b0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
b8c0: 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 t(interp, "ALPN
b8d0: 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 protocol names t
b8e0: 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 oo long", (char
b8f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f *) NULL);...Tcl_
b900: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
b910: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
b920: 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 ORT", "ALPN", "F
b930: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
b940: 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 NULL);...Tls_Fr
b950: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
b960: 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 ePtr);...return
b970: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
b980: 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 }.. protos_le
b990: 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c n += 1 + (int) l
b9a0: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c en;..}.../* Buil
b9b0: 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 d the complete p
b9c0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a rotocol-list */.
b9d0: 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f .protos = ckallo
b9e0: 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 c(protos_len);..
b9f0: 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 /* protocol-list
ba00: 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 s consist of 8-b
ba10: 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 it length-prefix
ba20: 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 ed, byte strings
ba30: 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c */..for (j = 0,
ba40: 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c p = protos; j <
ba50: 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 cnt; j++) {..
ba60: 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 char *str = Tc
ba70: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
ba80: 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e bj(list[j], &len
ba90: 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 );.. *p++ = (
baa0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 20 6c unsigned char) l
bab0: 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 en;.. memcpy(
bac0: 70 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 p, str, (size_t)
bad0: 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d len);.. p +=
bae0: 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 len;..}.../* SS
baf0: 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f L_set_alpn_proto
bb00: 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f s makes a copy o
bb10: 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c f the protocol-l
bb20: 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a ist */../* Note:
bb30: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 This functions
bb40: 72 65 76 65 72 73 65 73 20 74 68 65 20 72 65 74 reverses the ret
bb50: 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e urn value conven
bb60: 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c tion */..if (SSL
bb70: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 _set_alpn_protos
bb80: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
bb90: 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c protos, protos_l
bba0: 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f en)) {.. Tcl_
bbb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
bbc0: 65 72 70 2c 20 22 53 65 74 20 41 4c 50 4e 20 70 erp, "Set ALPN p
bbd0: 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a rotocols failed:
bbe0: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 ", GET_ERR_REAS
bbf0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
bc00: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
bc10: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
bc20: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
bc30: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 RT", "ALPN", "FA
bc40: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
bc50: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
bc60: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
bc70: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b atePtr);.. ck
bc80: 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 free(protos);..
bc90: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
bca0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f ROR;..}.../* Sto
bcb0: 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 re protocols lis
bcc0: 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e t */..statePtr->
bcd0: 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b protos = protos;
bce0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
bcf0: 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f os_len = protos_
bd00: 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 len;. } else
bd10: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f {..statePtr->pro
bd20: 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 tos = NULL;..sta
bd30: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 tePtr->protos_le
bd40: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 n = 0;. }..
bd50: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 /*. * SSL
bd60: 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a Callbacks. *
bd70: 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 /. SSL_set_ap
bd80: 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d p_data(statePtr-
bd90: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 >ssl, (void *)st
bda0: 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e atePtr);./* poin
bdb0: 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a t back to us */.
bdc0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 SSL_set_veri
bdd0: 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c fy(statePtr->ssl
bde0: 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 , verify, Verify
bdf0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 Callback);. S
be00: 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c SL_set_info_call
be10: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 back(statePtr->s
be20: 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b sl, InfoCallback
be30: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 );.. /* Callb
be40: 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e ack for observin
be50: 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 g protocol messa
be60: 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f ges */.#ifndef O
be70: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 PENSSL_NO_SSL_TR
be80: 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 ACE. /* void
be90: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f SSL_CTX_set_msg_
bea0: 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 callback_arg(sta
beb0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 tePtr->ctx, (voi
bec0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 d *)statePtr);.
bed0: 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f void SSL_CTX_
bee0: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
bef0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
bf00: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 MessageCallback)
bf10: 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 ; */. SSL_set
bf20: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 _msg_callback_ar
bf30: 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c g(statePtr->ssl,
bf40: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
bf50: 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f r);. SSL_set_
bf60: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 msg_callback(sta
bf70: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 tePtr->ssl, Mess
bf80: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 ageCallback);.#e
bf90: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 ndif.. /* Cre
bfa0: 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 ate Tcl_Channel
bfb0: 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 BIO Handler */.
bfc0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 statePtr->p_b
bfd0: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c io.= BIO_new_tcl
bfe0: 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e (statePtr, BIO_N
bff0: 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 OCLOSE);. sta
c000: 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f tePtr->bio.= BIO
c010: 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 _new(BIO_f_ssl()
c020: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 );.. if (serv
c030: 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 er) {../* Server
c040: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 callbacks */..S
c050: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 SL_CTX_set_tlsex
c060: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 t_servername_arg
c070: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c080: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
c090: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
c0a0: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d tlsext_servernam
c0b0: 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 e_callback(state
c0c0: 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c Ptr->ctx, SNICal
c0d0: 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 lback);..SSL_CTX
c0e0: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c _set_client_hell
c0f0: 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 o_cb(statePtr->c
c100: 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 tx, HelloCallbac
c110: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
c120: 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 Ptr);..if (state
c130: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e Ptr->protos != N
c140: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f ULL) {.. SSL_
c150: 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c CTX_set_alpn_sel
c160: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d ect_cb(statePtr-
c170: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 >ctx, ALPNCallba
c180: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
c190: 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 ePtr);.#ifdef US
c1a0: 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 E_NPN.. if (t
c1b0: 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c ls1_2 == 0 && tl
c1c0: 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 s1_3 == 0) {...S
c1d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f SL_CTX_set_next_
c1e0: 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 protos_advertise
c1f0: 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 d_cb(statePtr->c
c200: 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c tx, NPNCallback,
c210: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
c220: 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 r);.. }.#endi
c230: 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 f..}.../* Enable
c240: 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 server to send
c250: 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74 cert request aft
c260: 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c er handshake (TL
c270: 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 S 1.3 only) */..
c280: 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 /* A write opera
c290: 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 tion must take p
c2a0: 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 lace for the Cer
c2b0: 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74 tificate Request
c2c0: 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 to be.. sent
c2d0: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 to the client, t
c2e0: 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 his can be done
c2f0: 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 with SSL_do_hand
c300: 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 shake(). */..if
c310: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 (request && post
c320: 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c _handshake && tl
c330: 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c s1_3) {.. SSL
c340: 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 _verify_client_p
c350: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 ost_handshake(st
c360: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d atePtr->ssl);..}
c370: 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 .../* set automa
c380: 74 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 tic curve select
c390: 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f ion */..SSL_set_
c3a0: 65 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50 ecdh_auto(stateP
c3b0: 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f tr->ssl, 1);.../
c3c0: 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 * Set server mod
c3d0: 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e e */..statePtr->
c3e0: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c flags |= TLS_TCL
c3f0: 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 _SERVER;..SSL_se
c400: 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 t_accept_state(s
c410: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
c420: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 } else {../*
c430: 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 Client callbacks
c440: 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e */.#ifdef USE_N
c450: 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 PN..if (statePtr
c460: 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c ->protos != NULL
c470: 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 && tls1_2 == 0
c480: 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 && tls1_3 == 0)
c490: 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 {.. SSL_CTX_s
c4a0: 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 et_next_proto_se
c4b0: 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 lect_cb(statePtr
c4c0: 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 ->ctx, ALPNCallb
c4d0: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
c4e0: 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 tePtr);..}.#endi
c4f0: 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 f.../* Session c
c500: 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 aching */..SSL_C
c510: 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 TX_set_session_c
c520: 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 ache_mode(stateP
c530: 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 tr->ctx, SSL_SES
c540: 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c S_CACHE_CLIENT |
c550: 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
c560: 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 NO_INTERNAL_STOR
c570: 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 E);..SSL_CTX_ses
c580: 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 s_set_new_cb(sta
c590: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 tePtr->ctx, Sess
c5a0: 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 ionCallback);...
c5b0: 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 /* Enable post h
c5c0: 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 andshake Authent
c5d0: 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f ication extensio
c5e0: 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c n. TLS 1.3 only,
c5f0: 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a not http/2. */.
c600: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 .if (request &&
c610: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 post_handshake)
c620: 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 {.. SSL_set_p
c630: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 ost_handshake_au
c640: 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c th(statePtr->ssl
c650: 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 , 1);..}.../* Se
c660: 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f t client mode */
c670: 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 ..SSL_set_connec
c680: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 t_state(statePtr
c690: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 ->ssl);. }.
c6a0: 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 SSL_set_bio(st
c6b0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 atePtr->ssl, sta
c6c0: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 tePtr->p_bio, st
c6d0: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a atePtr->p_bio);.
c6e0: 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 BIO_set_ssl(
c6f0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 statePtr->bio, s
c700: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 tatePtr->ssl, BI
c710: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 O_NOCLOSE);..
c720: 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f /*. * End o
c730: 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 f SSL Init.
c740: 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 */. dprintf("
c750: 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 Returning %s", T
c760: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
c770: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
c780: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 ));. Tcl_SetR
c790: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 esult(interp, (c
c7a0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 har *) Tcl_GetCh
c7b0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
c7c0: 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 tr->self), TCL_V
c7d0: 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 OLATILE);.. r
c7e0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
c7f0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
c800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
c840: 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 UnimportObjCmd
c850: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
c860: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
c870: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 ed to remove the
c880: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
c890: 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 filter.. *. * R
c8a0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
c8b0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
c8c0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
c8d0: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 ects:. *.May mod
c8e0: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 ify the behavior
c8f0: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 of an IO channe
c900: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d l.. *. *--------
c910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
c950: 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 static int.Unimp
c960: 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 ortObjCmd(Client
c970: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
c980: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
c990: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
c9a0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
c9b0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
c9c0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f Channel chan;../
c9d0: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
c9e0: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 set a mode on.
c9f0: 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c */. (void) cl
ca00: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 ientData;.. d
ca10: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
ca20: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
ca30: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
ca40: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
ca50: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
ca60: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 nel");..return T
ca70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
ca80: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
ca90: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
caa0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
cab0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 (objv[1]), NULL)
cac0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
cad0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
cae0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
caf0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
cb00: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
cb10: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
cb20: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
cb30: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
cb40: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
cb50: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 nnel(chan);..
cb60: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
cb70: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
cb80: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
cb90: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e ()) {..Tcl_Appen
cba0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
cbb0: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
cbc0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
cbd0: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c Name(chan),..."\
cbe0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
cbf0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 nnel", NULL);..
cc00: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
cc10: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
cc20: 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 ", "UNIMPORT", "
cc30: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c CHANNEL", "INVAL
cc40: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ID", (char *) NU
cc50: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
cc60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
cc70: 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 if (Tcl_Unsta
cc80: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 ckChannel(interp
cc90: 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 , chan) == TCL_E
cca0: 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 RROR) {..return
ccb0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
ccc0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
ccd0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ccf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd20: 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 -. *. * CTX_Init
cd30: 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 -- construct a
cd40: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 SSL_CTX instance
cd50: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
cd60: 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 *.A valid SSL_C
cd70: 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e TX instance or N
cd80: 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ULL.. *. * Side
cd90: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 effects:. *.cons
cda0: 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 tructs SSL conte
cdb0: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d xt (CTX). *. *--
cdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce00: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c -. */.static SSL
ce10: 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 _CTX *.CTX_Init(
ce20: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c State *statePtr,
ce30: 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 int isServer, i
ce40: 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a nt proto, char *
ce50: 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 keyfile, char *c
ce60: 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 ertfile,. uns
ce70: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c igned char *key,
ce80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
ce90: 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 cert, int key_le
cea0: 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c n, int cert_len,
ceb0: 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 char *CAdir,.
cec0: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 char *CAfile,
ced0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 char *ciphers, c
cee0: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
cef0: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 s, int level, ch
cf00: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a ar *DHparams) {.
cf10: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
cf20: 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 interp = statePt
cf30: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 r->interp;. S
cf40: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 SL_CTX *ctx = NU
cf50: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 LL;. Tcl_DStr
cf60: 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f ing ds;. Tcl_
cf70: 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 DString ds1;.
cf80: 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 int off = 0;.
cf90: 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 int load_priva
cfa0: 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 te_key;. cons
cfb0: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 t SSL_METHOD *me
cfc0: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e thod;.. dprin
cfd0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
cfe0: 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b if (!proto) {
cff0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
d000: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 lt(interp, "no v
d010: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 alid protocol se
d020: 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a lected", (char *
d030: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
d040: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
d050: 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 /* create SSL
d060: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f context */.#if O
d070: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
d080: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 UMBER >= 0x10100
d090: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 000L || defined(
d0a0: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 NO_SSL2) || defi
d0b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
d0c0: 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 SL2). if (ENA
d0d0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
d0e0: 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 PROTO_SSL2)) {..
d0f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d100: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 (interp, "SSL2 p
d110: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
d120: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
d130: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
d140: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
d150: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
d160: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e O_SSL3) || defin
d170: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
d180: 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 L3). if (ENAB
d190: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
d1a0: 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 ROTO_SSL3)) {..T
d1b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d1c0: 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 interp, "SSL3 pr
d1d0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d1e0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
d1f0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d200: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
d210: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
d220: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 _TLS1) || define
d230: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d240: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 1). if (ENABL
d250: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d260: 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 OTO_TLS1)) {..Tc
d270: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d280: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 nterp, "TLS 1.0
d290: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
d2a0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
d2b0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
d2c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
d2d0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
d2e0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
d2f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d300: 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 _TLS1_1). if
d310: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
d320: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
d330: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
d340: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d350: 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c TLS 1.1 protocol
d360: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
d370: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d380: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
d390: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
d3a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
d3b0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
d3c0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
d3d0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
d3e0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
d3f0: 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 O_TLS1_2)) {..Tc
d400: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d410: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 nterp, "TLS 1.2
d420: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
d430: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
d440: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
d450: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
d460: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
d470: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
d480: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d490: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 _TLS1_3). if
d4a0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
d4b0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
d4c0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
d4d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d4e0: 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c TLS 1.3 protocol
d4f0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
d500: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d510: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
d520: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 }.#endif.
d530: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 if (proto == 0)
d540: 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 {../* Use full r
d550: 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 ange */..SSL_CTX
d560: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 _set_min_proto_v
d570: 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a ersion(ctx, 0);.
d580: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 .SSL_CTX_set_max
d590: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
d5a0: 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 tx, 0);. }..
d5b0: 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f switch (proto
d5c0: 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f ) {.#if OPENSSL_
d5d0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
d5e0: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 0x10100000L &&
d5f0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 !defined(NO_SSL2
d600: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d610: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 ENSSL_NO_SSL2).
d620: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
d630: 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 O_SSL2:..method
d640: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c = isServer ? SSL
d650: 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 v2_server_method
d660: 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e () : SSLv2_clien
d670: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
d680: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
d690: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
d6a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d6b0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 NSSL_NO_SSL3) &&
d6c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
d6d0: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 L_NO_SSL3_METHOD
d6e0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
d6f0: 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 ROTO_SSL3:..meth
d700: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
d710: 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 SSLv3_server_met
d720: 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c hod() : SSLv3_cl
d730: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
d740: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
d750: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
d760: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
d770: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
d780: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d790: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 NSSL_NO_TLS1_MET
d7a0: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
d7b0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d S_PROTO_TLS1:..m
d7c0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
d7d0: 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f ? TLSv1_server_
d7e0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 method() : TLSv1
d7f0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
d800: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
d810: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
d820: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
d830: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d840: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
d850: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d860: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 LS1_1_METHOD).
d870: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
d880: 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 _TLS1_1:..method
d890: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c = isServer ? TL
d8a0: 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 Sv1_1_server_met
d8b0: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f hod() : TLSv1_1_
d8c0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
d8d0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
d8e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
d8f0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
d900: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d910: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
d920: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d930: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_2_METHOD).
d940: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
d950: 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 TLS1_2:..method
d960: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 = isServer ? TLS
d970: 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 v1_2_server_meth
d980: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 od() : TLSv1_2_c
d990: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
d9a0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
d9b0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
d9c0: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
d9d0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d9e0: 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 S1_3). case T
d9f0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a LS_PROTO_TLS1_3:
da00: 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e ../* Use the gen
da10: 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 eric method and
da20: 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 constraint range
da30: 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 after context i
da40: 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 s created */..me
da50: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
da60: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 ? TLS_server_met
da70: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 hod() : TLS_clie
da80: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
da90: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
daa0: 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 default:../* Neg
dab0: 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61 otiate highest a
dac0: 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 vailable SSL/TLS
dad0: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 version */..met
dae0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
daf0: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 TLS_server_meth
db00: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e od() : TLS_clien
db10: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 t_method();.#if
db20: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
db30: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
db40: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 000L && !defined
db50: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 (NO_SSL2) && !de
db60: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
db70: 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 _SSL2)..off |= (
db80: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
db90: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 LS_PROTO_SSL2)
dba0: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
dbb0: 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a _SSLv2);.#endif.
dbc0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
dbd0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
dbe0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
dbf0: 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 3)..off |= (ENAB
dc00: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
dc10: 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 ROTO_SSL3) ? 0
dc20: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c : SSL_OP_NO_SSL
dc30: 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 v3);.#endif.#if
dc40: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
dc50: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
dc60: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 ENSSL_NO_TLS1)..
dc70: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
dc80: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
dc90: 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 _TLS1) ? 0 : S
dca0: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b SL_OP_NO_TLSv1);
dcb0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
dcc0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
dcd0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
dce0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 SSL_NO_TLS1_1)..
dcf0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
dd00: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
dd10: 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 _TLS1_1) ? 0 : S
dd20: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 SL_OP_NO_TLSv1_1
dd30: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
dd40: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
dd50: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
dd60: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
dd70: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
dd80: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
dd90: 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a TO_TLS1_2) ? 0 :
dda0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
ddb0: 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 _2);.#endif.#if
ddc0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
ddd0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
dde0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
ddf0: 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 3)..off |= (ENAB
de00: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
de10: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 ROTO_TLS1_3) ? 0
de20: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
de30: 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 v1_3);.#endif..b
de40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
de50: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 ERR_clear_error
de60: 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 ();.. ctx = S
de70: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f SL_CTX_new(metho
de80: 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 d);. if (!ctx
de90: 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c ) {..return(NULL
dea0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
deb0: 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c (getenv(SSLKEYL
dec0: 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f OGFILE)) {..SSL_
ded0: 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 CTX_set_keylog_c
dee0: 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 allback(ctx, Key
def0: 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 LogCallback);.
df00: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 }..#if !define
df10: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 d(NO_TLS1_3) &&
df20: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
df30: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
df40: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 if (proto == TLS
df50: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b _PROTO_TLS1_3) {
df60: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 ..SSL_CTX_set_mi
df70: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 n_proto_version(
df80: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 ctx, TLS1_3_VERS
df90: 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ION);..SSL_CTX_s
dfa0: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 et_max_proto_ver
dfb0: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 sion(ctx, TLS1_3
dfc0: 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d _VERSION);. }
dfd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
dfe0: 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c Force cipher sel
dff0: 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 ection order by
e000: 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 server */. if
e010: 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 (!isServer) {..
e020: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
e030: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f ons(ctx, SSL_OP_
e040: 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 CIPHER_SERVER_PR
e050: 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d EFERENCE);. }
e060: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
e070: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
e080: 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f x10100000L. O
e090: 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 penSSL_add_all_a
e0a0: 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 lgorithms(); /*
e0b0: 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 6e 64 Load ciphers and
e0c0: 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 digests */.#end
e0d0: 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f if.. SSL_CTX_
e0e0: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 set_app_data(ctx
e0f0: 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 , (void*)interp)
e100: 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 ;./* remember th
e110: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f e interpreter */
e120: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
e130: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 _options(ctx, SS
e140: 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c L_OP_ALL);./* al
e150: 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 l SSL bug workar
e160: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c ounds */. SSL
e170: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
e180: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f (ctx, SSL_OP_NO_
e190: 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a COMPRESSION);./*
e1a0: 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 disable compres
e1b0: 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 sion even if sup
e1c0: 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 ported */. SS
e1d0: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e L_CTX_set_option
e1e0: 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a s(ctx, off);../*
e1f0: 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f disable protoco
e200: 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 l versions */.#i
e210: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
e220: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
e230: 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 01000L. SSL_C
e240: 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c TX_set_mode(ctx,
e250: 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 SSL_MODE_AUTO_R
e260: 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 ETRY);./* handle
e270: 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 new handshakes
e280: 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f in background. O
e290: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20 n by default in
e2a0: 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a OpenSSL 1.1.1. *
e2b0: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c /.#endif. SSL
e2c0: 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 _CTX_sess_set_ca
e2d0: 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 che_size(ctx, 12
e2e0: 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 8);.. /* Set
e2f0: 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 user defined cip
e300: 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 hers, cipher sui
e310: 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 tes, and securit
e320: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 y level */. i
e330: 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e f ((ciphers != N
e340: 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 ULL) && !SSL_CTX
e350: 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 _set_cipher_list
e360: 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 (ctx, ciphers))
e370: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
e380: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 ult(interp, "Set
e390: 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a ciphers failed:
e3a0: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 No valid cipher
e3b0: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c s", (char *) NUL
e3c0: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
e3d0: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
e3e0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
e3f0: 69 66 20 28 28 63 69 70 68 65 72 73 75 69 74 65 if ((ciphersuite
e400: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 s != NULL) && !S
e410: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 SL_CTX_set_ciphe
e420: 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 rsuites(ctx, cip
e430: 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 hersuites)) {..T
e440: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e450: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 interp, "Set cip
e460: 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 her suites faile
e470: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 d: No valid ciph
e480: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ers", (char *) N
e490: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
e4a0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
e4b0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 n NULL;. }..
e4c0: 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 /* Set securi
e4d0: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 ty level */.
e4e0: 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 if (level > -1 &
e4f0: 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 & level < 6) {..
e500: 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 /* SSL_set_secur
e510: 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 ity_level */..SS
e520: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 L_CTX_set_securi
e530: 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 ty_level(ctx, le
e540: 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 vel);. }..
e550: 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c /* set some cal
e560: 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 lbacks */. SS
e570: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c L_CTX_set_defaul
e580: 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c t_passwd_cb(ctx,
e590: 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 PasswordCallbac
e5a0: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f k);. SSL_CTX_
e5b0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 set_default_pass
e5c0: 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 wd_cb_userdata(c
e5d0: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 tx, (void *)stat
e5e0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 ePtr);.. /* r
e5f0: 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c ead a Diffie-Hel
e600: 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 lman parameters
e610: 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 file, or use the
e620: 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f built-in one */
e630: 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f .#ifdef OPENSSL_
e640: 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 NO_DH. if (DH
e650: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 params != NULL)
e660: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
e670: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 ult(interp, "DH
e680: 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 parameter suppor
e690: 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 t not available"
e6a0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
e6b0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
e6c0: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ctx);..return NU
e6d0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a LL;. }.#else.
e6e0: 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 {..DH* dh;..
e6f0: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 if (DHparams !=
e700: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f NULL) {.. BIO
e710: 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f *bio;.. Tcl_
e720: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
e730: 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f ;.. bio = BIO
e740: 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 _new_file(F2N(DH
e750: 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 params, &ds), "r
e760: 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 ");.. if (!bi
e770: 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 o) {...Tcl_DStri
e780: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 ngFree(&ds);...T
e790: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e7a0: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e interp, "Could n
e7b0: 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d ot find DH param
e7c0: 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 eters file", (ch
e7d0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
e7e0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
e7f0: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
e800: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 .. }... dh
e810: 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f = PEM_read_bio_
e820: 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 DHparams(bio, NU
e830: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b LL, NULL, NULL);
e840: 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 .. BIO_free(b
e850: 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 io);.. Tcl_DS
e860: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
e870: 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a . if (!dh) {.
e880: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
e890: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c lt(interp, "Coul
e8a0: 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 d not read DH pa
e8b0: 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 rameters from fi
e8c0: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 le", (char *) NU
e8d0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
e8e0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
e8f0: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a rn NULL;.. }.
e900: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
e910: 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 _tmp_dh(ctx, dh)
e920: 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28 64 ;.. DH_free(d
e930: 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 h);...} else {..
e940: 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20 /* Use well
e950: 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74 known DH paramet
e960: 65 72 73 20 74 68 61 74 20 68 61 76 65 20 62 75 ers that have bu
e970: 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69 ilt-in support i
e980: 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 n OpenSSL */..
e990: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 if (!SSL_CTX_s
e9a0: 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 et_dh_auto(ctx,
e9b0: 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 1)) {...Tcl_Appe
e9c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
e9d0: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62 "Could not enab
e9e0: 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20 le set DH auto:
e9f0: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ", GET_ERR_REASO
ea00: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
ea10: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
ea20: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
ea30: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a rn NULL;.. }.
ea40: 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a .}. }.#endif.
ea50: 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 . /* set our
ea60: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 certificate */.
ea70: 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f load_private_
ea80: 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 key = 0;. if
ea90: 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c (certfile != NUL
eaa0: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 L) {..load_priva
eab0: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 te_key = 1;...Tc
eac0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 l_DStringInit(&d
ead0: 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 s);...if (SSL_CT
eae0: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 X_use_certificat
eaf0: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 e_file(ctx, F2N(
eb00: 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 certfile, &ds),
eb10: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
eb20: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) <= 0) {.. T
eb30: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
eb40: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 ds);.. Tcl_Ap
eb50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
eb60: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
eb70: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 t certificate fi
eb80: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 le ", certfile,
eb90: 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f ": ",...GET_ERR_
eba0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
ebb0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
ebc0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
ebd0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
ebe0: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 LL;..}. } els
ebf0: 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 e if (cert != NU
ec00: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 LL) {..load_priv
ec10: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 ate_key = 1;..if
ec20: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 (SSL_CTX_use_ce
ec30: 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 rtificate_ASN1(c
ec40: 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 tx, cert_len, ce
ec50: 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 rt) <= 0) {..
ec60: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
ec70: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f (&ds);.. Tcl_
ec80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
ec90: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
eca0: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a set certificate:
ecb0: 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 ",...GET_ERR_RE
ecc0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
ecd0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
ece0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
ecf0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
ed00: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
ed10: 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 {..certfile = (c
ed20: 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 har*)X509_get_de
ed30: 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 fault_cert_file(
ed40: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 );...if (SSL_CTX
ed50: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
ed60: 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 _file(ctx, certf
ed70: 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ile, SSL_FILETYP
ed80: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 E_PEM) <= 0) {.#
ed90: 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 if 0.. Tcl_DS
eda0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
edb0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
edc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
edd0: 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 nable to use def
ede0: 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 ault certificate
edf0: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c file ", certfil
ee00: 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 e, ": ",...GET_E
ee10: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
ee20: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
ee30: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
ee40: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
ee50: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d NULL;.#endif..}
ee60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 . }.. /* s
ee70: 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b et our private k
ee80: 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f ey */. if (lo
ee90: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 ad_private_key)
eea0: 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d {..if (keyfile =
eeb0: 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d = NULL && key ==
eec0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 NULL) {.. ke
eed0: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 yfile = certfile
eee0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 ;..}...if (keyfi
eef0: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 le != NULL) {..
ef00: 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 /* get the pr
ef10: 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 ivate key associ
ef20: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 ated with this c
ef30: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 ertificate */..
ef40: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d if (keyfile =
ef50: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 = NULL) {...keyf
ef60: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a ile = certfile;.
ef70: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
ef80: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 (SSL_CTX_use_Pri
ef90: 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 vateKey_file(ctx
efa0: 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 , F2N(keyfile, &
efb0: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ds), SSL_FILETYP
efc0: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 E_PEM) <= 0) {..
efd0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
efe0: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 (&ds);.../* flus
eff0: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 h the passphrase
f000: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 which might be
f010: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 left in the resu
f020: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 lt */...Tcl_SetR
f030: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 esult(interp, NU
f040: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b LL, TCL_STATIC);
f050: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
f060: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
f070: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 ble to set publi
f080: 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 c key file ", ke
f090: 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20 yfile, " ",...
f0a0: 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e GET_ERR_REASON
f0b0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
f0c0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
f0d0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
f0e0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 n NULL;.. }..
f0f0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
f100: 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c ree(&ds);...} el
f110: 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 se if (key != NU
f120: 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 LL) {.. if (S
f130: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 SL_CTX_use_Priva
f140: 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 teKey_ASN1(EVP_P
f150: 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 KEY_RSA, ctx, ke
f160: 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 y,key_len) <= 0)
f170: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 {...Tcl_DString
f180: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 Free(&ds);.../*
f190: 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 flush the passph
f1a0: 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 rase which might
f1b0: 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 be left in the
f1c0: 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f result */...Tcl_
f1d0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
f1e0: 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 , NULL, TCL_STAT
f1f0: 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e IC);...Tcl_Appen
f200: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f210: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 "unable to set p
f220: 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 ublic key: ", GE
f230: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
f240: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
f250: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
f260: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
f270: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f LL;.. }..}../
f280: 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 * Now we know th
f290: 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 at a key and cer
f2a0: 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 t have been set
f2b0: 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 against.. * the
f2c0: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 SSL context */..
f2d0: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 if (!SSL_CTX_che
f2e0: 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 ck_private_key(c
f2f0: 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f tx)) {.. Tcl_
f300: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f310: 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 erp, "private ke
f320: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 y does not match
f330: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
f340: 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 public key",...
f350: 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e . (char *) N
f360: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
f370: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
f380: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
f390: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
f3a0: 20 53 65 74 20 76 65 72 69 66 69 63 61 74 69 6f Set verificatio
f3b0: 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c n CAs */. Tcl
f3c0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
f3d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
f3e0: 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 ngInit(&ds1);.
f3f0: 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e /* There is on
f400: 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 e default direct
f410: 6f 72 79 2c 20 6f 6e 65 20 64 65 66 61 75 6c 74 ory, one default
f420: 20 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 65 20 64 file, and one d
f430: 65 66 61 75 6c 74 20 73 74 6f 72 65 2e 0a 09 54 efault store...T
f440: 68 65 20 64 65 66 61 75 6c 74 20 43 41 20 63 65 he default CA ce
f450: 72 74 69 66 69 63 61 74 65 73 20 64 69 72 65 63 rtificates direc
f460: 74 6f 72 79 20 28 61 6e 64 20 64 65 66 61 75 6c tory (and defaul
f470: 74 20 73 74 6f 72 65 29 20 69 73 20 69 6e 20 74 t store) is in t
f480: 68 65 20 4f 70 65 6e 53 53 4c 0a 09 63 65 72 74 he OpenSSL..cert
f490: 73 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20 s directory. It
f4a0: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 can be overridde
f4b0: 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 n by the SSL_CER
f4c0: 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54 T_DIR env var. T
f4d0: 68 65 0a 09 64 65 66 61 75 6c 74 20 43 41 20 63 he..default CA c
f4e0: 65 72 74 69 66 69 63 61 74 65 73 20 66 69 6c 65 ertificates file
f4f0: 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74 2e is called cert.
f500: 70 65 6d 20 69 6e 20 74 68 65 20 64 65 66 61 75 pem in the defau
f510: 6c 74 20 4f 70 65 6e 53 53 4c 0a 09 64 69 72 65 lt OpenSSL..dire
f520: 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 62 65 ctory. It can be
f530: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 overridden by t
f540: 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 he SSL_CERT_FILE
f550: 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 09 2f 2a env var. */../*
f560: 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65 74 int SSL_CTX_set
f570: 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f _default_verify_
f580: 64 69 72 28 53 53 4c 5f 43 54 58 20 2a 63 74 78 dir(SSL_CTX *ctx
f590: 29 20 61 6e 64 20 69 6e 74 20 53 53 4c 5f 43 54 ) and int SSL_CT
f5a0: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 X_set_default_ve
f5b0: 72 69 66 79 5f 66 69 6c 65 28 53 53 4c 5f 43 54 rify_file(SSL_CT
f5c0: 58 20 2a 63 74 78 29 20 2a 2f 0a 20 20 20 20 69 X *ctx) */. i
f5d0: 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 f (!SSL_CTX_load
f5e0: 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e _verify_location
f5f0: 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c s(ctx, F2N(CAfil
f600: 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 64 e, &ds), F2N(CAd
f610: 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 ir, &ds1)) ||..!
f620: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
f630: 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 ult_verify_paths
f640: 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 (ctx)) {.#if 0..
f650: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
f660: 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 &ds);..Tcl_DStri
f670: 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f ngFree(&ds1);../
f680: 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c * Don't currentl
f690: 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20 66 y care if this f
f6a0: 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 ails */..Tcl_App
f6b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
f6c0: 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76 , "SSL default v
f6d0: 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c 20 erify paths: ",
f6e0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
f6f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
f700: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
f710: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ctx);..return NU
f720: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d LL;.#endif. }
f730: 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f .. /* https:/
f740: 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 /sourceforge.net
f750: 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 /p/tls/bugs/57/
f760: 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f */. /* XXX:TO
f770: 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 DO: Let the user
f780: 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 supply values h
f790: 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 ere instead of s
f7a0: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 omething that ex
f7b0: 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 ists on the file
f7c0: 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 system */. if
f7d0: 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c (CAfile != NULL
f7e0: 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 ) {..STACK_OF(X5
f7f0: 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 09_NAME) *certNa
f800: 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 mes = SSL_load_c
f810: 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 lient_CA_file(F2
f820: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b N(CAfile, &ds));
f830: 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 ..if (certNames
f840: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
f850: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 SSL_CTX_set_clie
f860: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 nt_CA_list(ctx,
f870: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 certNames);..}.
f880: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
f890: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
f8a0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
f8b0: 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 ree(&ds1);. r
f8c0: 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f eturn ctx;.}.../
f8d0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
f8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f910: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 -------. *. * St
f920: 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 atusObjCmd -- re
f930: 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 turn certificate
f940: 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 for connected p
f950: 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c eer.. *. * Resul
f960: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
f970: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
f980: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
f990: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
f9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f9e0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
f9f0: 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 nt.StatusObjCmd(
fa00: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
fa10: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
fa20: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
fa30: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
fa40: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
fa50: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
fa60: 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 r;. X509 *pee
fa70: 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a r;. Tcl_Obj *
fa80: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f objPtr;. Tcl_
fa90: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 Channel chan;.
faa0: 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e char *channelN
fab0: 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 ame, *ciphers;.
fac0: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 int mode;.
fad0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
fae0: 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 char *proto;.
faf0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 unsigned int le
fb00: 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 n;. int nid,
fb10: 72 65 73 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 res;. (void)
fb20: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
fb30: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
fb40: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
fb50: 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 c < 2 || objc >
fb60: 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 3 || (objc == 3
fb70: 26 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 && !strcmp(Tcl_G
fb80: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d etString(objv[1]
fb90: 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b ), "-local"))) {
fba0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
fbb0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
fbc0: 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 jv, "?-local? ch
fbd0: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
fbe0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
fbf0: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 }.. /* Get ch
fc00: 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 annel Id */.
fc10: 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 channelName = Tc
fc20: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
fc30: 62 6a 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d bj(objv[(objc ==
fc40: 20 32 20 3f 20 31 20 3a 20 32 29 5d 2c 20 28 54 2 ? 1 : 2)], (T
fc50: 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 cl_Size *) NULL)
fc60: 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c ;. chan = Tcl
fc70: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
fc80: 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c rp, channelName,
fc90: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 &mode);. if
fca0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
fcb0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
fcc0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
fcd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
fce0: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
fcf0: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
fd00: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
fd10: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
fd20: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
fd30: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 );. if (Tcl_G
fd40: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
fd50: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
fd60: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
fd70: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
fd80: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
fd90: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
fda0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
fdb0: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 ,..."\": not a T
fdc0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
fdd0: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f L);..Tcl_SetErro
fde0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
fdf0: 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 LS", "STATUS", "
fe00: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c CHANNEL", "INVAL
fe10: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ID", (char *) NU
fe20: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
fe30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
fe40: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 statePtr = (St
fe50: 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 ate *) Tcl_GetCh
fe60: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
fe70: 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a a(chan);.. /*
fe80: 20 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65 Get certificate
fe90: 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c for peer or sel
fea0: 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a f */. if (obj
feb0: 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 c == 2) {..peer
fec0: 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 = SSL_get_peer_c
fed0: 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 ertificate(state
fee0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
fef0: 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 else {..peer =
ff00: 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 SSL_get_certific
ff10: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ate(statePtr->ss
ff20: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a l);. }. /*
ff30: 20 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66 Get X509 certif
ff40: 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 icate info */.
ff50: 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f if (peer) {..o
ff60: 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 bjPtr = Tls_NewX
ff70: 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 509Obj(interp, p
ff80: 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 eer);..if (objc
ff90: 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30 == 2) {.. X50
ffa0: 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20 9_free(peer);..
ffb0: 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a peer = NULL;.
ffc0: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a .}. } else {.
ffd0: 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 .objPtr = Tcl_Ne
ffe0: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
fff0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
10000 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 Peer name */.
10010 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
10020 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 terp, objPtr, "p
10030 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 eername", SSL_ge
10040 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74 t0_peername(stat
10050 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b ePtr->ssl), -1);
10060 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 . LAPPEND_INT
10070 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10080 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 "sbits", SSL_ge
10090 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 t_cipher_bits(st
100a0 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c atePtr->ssl, NUL
100b0 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 L));.. cipher
100c0 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 s = (char*)SSL_g
100d0 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 et_cipher(stateP
100e0 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 tr->ssl);. LA
100f0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
10100 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 , objPtr, "ciphe
10110 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29 r", ciphers, -1)
10120 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 ;.. /* Verify
10130 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66 the X509 certif
10140 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20 icate presented
10150 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 by the peer */.
10160 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
10170 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10180 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 verifyResult",..
10190 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 X509_verify_cert
101a0 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 _error_string(SS
101b0 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 L_get_verify_res
101c0 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ult(statePtr->ss
101d0 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f l)), -1);.. /
101e0 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f * Verify mode */
101f0 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f . mode = SSL_
10200 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 get_verify_mode(
10210 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
10220 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20 if (mode &&
10230 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 SSL_VERIFY_NONE)
10240 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 {..LAPPEND_STR(
10250 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10260 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e "verifyMode", "n
10270 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d one", -1);. }
10280 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a else {..Tcl_Obj
10290 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 *listObjPtr = T
102a0 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
102b0 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 NULL);..if (mod
102c0 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f e && SSL_VERIFY_
102d0 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c PEER) {.. Tcl
102e0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
102f0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 ement(interp, li
10300 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 stObjPtr, Tcl_Ne
10310 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 wStringObj("peer
10320 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
10330 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 (mode && SSL_VER
10340 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 IFY_FAIL_IF_NO_P
10350 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 EER_CERT) {..
10360 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
10370 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10380 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 , listObjPtr, Tc
10390 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
103a0 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 fail if no peer
103b0 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a cert", -1));..}.
103c0 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c .if (mode && SSL
103d0 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f _VERIFY_CLIENT_O
103e0 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f NCE) {.. Tcl_
103f0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10400 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
10410 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
10420 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e StringObj("clien
10430 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 t once", -1));..
10440 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 }..if (mode && S
10450 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 SL_VERIFY_POST_H
10460 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 ANDSHAKE) {..
10470 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
10480 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10490 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 , listObjPtr, Tc
104a0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
104b0 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c post handshake",
104c0 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 -1));..}..LAPPE
104d0 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f ND_OBJ(interp, o
104e0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f bjPtr, "verifyMo
104f0 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 de", listObjPtr)
10500 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 . }.. /* V
10510 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68 erify mode depth
10520 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f */. LAPPEND_
10530 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
10540 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68 tr, "verifyDepth
10550 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 ", SSL_get_verif
10560 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72 y_depth(statePtr
10570 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a ->ssl));.. /*
10580 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 Report the sele
10590 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 cted protocol as
105a0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 a result of the
105b0 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a negotiation */.
105c0 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 SSL_get0_alp
105d0 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 n_selected(state
105e0 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f Ptr->ssl, &proto
105f0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 , &len);. LAP
10600 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
10610 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c objPtr, "alpn",
10620 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 (char *)proto,
10630 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b (Tcl_Size) len);
10640 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
10650 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10660 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c "protocol", SSL
10670 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 _get_version(sta
10680 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 tePtr->ssl), -1)
10690 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 ;.. /* Valid
106a0 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e for non-RSA sign
106b0 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e ature and TLS 1.
106c0 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 3 */. if (obj
106d0 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d c == 2) {..res =
106e0 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 SSL_get_peer_si
106f0 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 gnature_nid(stat
10700 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 ePtr->ssl, &nid)
10710 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
10720 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 res = SSL_get_si
10730 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 gnature_nid(stat
10740 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 ePtr->ssl, &nid)
10750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
10760 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d !res) {nid = 0;}
10770 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
10780 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10790 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 "signatureHashA
107a0 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e lgorithm", OBJ_n
107b0 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b id2ln(nid), -1);
107c0 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d .. if (objc =
107d0 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 2) {..res = SS
107e0 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 L_get_peer_signa
107f0 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 ture_type_nid(st
10800 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
10810 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b d);. } else {
10820 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
10830 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e signature_type_n
10840 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c id(statePtr->ssl
10850 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 , &nid);. }.
10860 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 if (!res) {ni
10870 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 d = 0;}. LAPP
10880 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10890 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 objPtr, "signatu
108a0 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 reType", OBJ_nid
108b0 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 2ln(nid), -1);..
108c0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
108d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
108e0 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
108f0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
10900 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
10910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10940 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e -----. *. * Conn
10950 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 ectionInfoObjCmd
10960 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 -- return conne
10970 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 ction info from
10980 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 OpenSSL.. *. * R
10990 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 esults:. *.A lis
109a0 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 t of connection
109b0 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d info. *. *-----
109c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
109d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
109e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
109f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
10a00 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 */..static int C
10a10 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a onnectionInfoObj
10a20 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
10a30 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
10a40 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
10a50 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
10a60 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
10a70 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
10a80 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
10a90 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
10aa0 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 mode on */.
10ab0 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
10ac0 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 ../* client stat
10ad0 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 e for ssl socket
10ae0 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
10af0 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 *objPtr, *listPt
10b00 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c r;. const SSL
10b10 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 *ssl;. const
10b20 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 SSL_CIPHER *cip
10b30 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 her;. const S
10b40 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 SL_SESSION *sess
10b50 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 ion;. const E
10b60 56 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28 VP_MD *md;. (
10b70 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
10b80 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
10b90 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
10ba0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
10bb0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
10bc0 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 nel");..return(T
10bd0 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
10be0 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
10bf0 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
10c00 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
10c10 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d gFromObj(objv[1]
10c20 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 , (Tcl_Size *)NU
10c30 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 LL), NULL);.
10c40 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
10c50 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
10c60 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 {..return(TCL_ER
10c70 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ROR);. }..
10c80 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f /* Make sure to
10c90 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
10ca0 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
10cb0 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
10cc0 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
10cd0 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 chan);. if (T
10ce0 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
10cf0 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
10d00 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
10d10 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
10d20 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
10d30 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
10d40 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
10d50 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 han),.. "\":
10d60 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
10d70 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f l", NULL);..Tcl_
10d80 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
10d90 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e erp, "TLS", "CON
10da0 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e NECTION", "CHANN
10db0 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 EL", "INVALID",
10dc0 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
10dd0 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
10de0 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f R);. }.. o
10df0 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
10e00 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
10e10 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 .. /* Connect
10e20 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ion info */.
10e30 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
10e40 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e e *)Tcl_GetChann
10e50 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 elInstanceData(c
10e60 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 han);. ssl =
10e70 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 statePtr->ssl;.
10e80 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 if (ssl != NU
10e90 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 LL) {../* connec
10ea0 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c tion state */..L
10eb0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
10ec0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 p, objPtr, "stat
10ed0 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 e", SSL_state_st
10ee0 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 ring_long(ssl),
10ef0 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e -1);.../* Get SN
10f00 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76 I requested serv
10f10 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 er name */..LAPP
10f20 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10f30 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e objPtr, "servern
10f40 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 ame", SSL_get_se
10f50 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c rvername(ssl, TL
10f60 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f SEXT_NAMETYPE_ho
10f70 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a st_name), -1);..
10f80 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c ./* Get protocol
10f90 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
10fa0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10fb0 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c "protocol", SSL
10fc0 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c _get_version(ssl
10fd0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e ), -1);.../* Ren
10fe0 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 egotiation allow
10ff0 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 ed */..LAPPEND_B
11000 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
11010 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69 tr, "renegotiati
11020 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c on_allowed", SSL
11030 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 _get_secure_rene
11040 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 gotiation_suppor
11050 74 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 t(ssl));.../* Ge
11060 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c t security level
11070 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 */..LAPPEND_INT
11080 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11090 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c "security_level
110a0 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 ", SSL_get_secur
110b0 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b ity_level(ssl));
110c0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e .../* Session in
110d0 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 fo */..LAPPEND_B
110e0 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
110f0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 tr, "session_reu
11100 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f sed", SSL_sessio
11110 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b 0a n_reused(ssl));.
11120 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69 ../* Is server i
11130 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f nfo */..LAPPEND_
11140 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
11150 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 22 Ptr, "is_server"
11160 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 , SSL_is_server(
11170 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 ssl));.../* Is D
11180 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f TLS */..LAPPEND_
11190 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
111a0 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 Ptr, "is_dtls",
111b0 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 SSL_is_dtls(ssl)
111c0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
111d0 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a Cipher info */.
111e0 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c cipher = SSL
111f0 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 _get_current_cip
11200 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 her(ssl);. if
11210 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c (cipher != NULL
11220 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 ) {..char buf[BU
11230 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e FSIZ] = {0};..in
11240 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 t bits, alg_bits
11250 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e 61 ;.../* Cipher na
11260 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 me */..LAPPEND_S
11270 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11280 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 4c r, "cipher", SSL
11290 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 _CIPHER_get_name
112a0 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a (cipher), -1);..
112b0 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 ./* RFC name of
112c0 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 cipher */..LAPPE
112d0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
112e0 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 64 bjPtr, "standard
112f0 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48 _name", SSL_CIPH
11300 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 ER_standard_name
11310 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a (cipher), -1);..
11320 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 ./* OpenSSL name
11330 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c of cipher */..L
11340 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11350 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e p, objPtr, "open
11360 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 ssl_name", OPENS
11370 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 53 SL_cipher_name(S
11380 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 SL_CIPHER_standa
11390 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 29 rd_name(cipher))
113a0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 , -1);.../* numb
113b0 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 74 er of secret bit
113c0 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 65 s used for ciphe
113d0 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c r */..bits = SSL
113e0 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 _CIPHER_get_bits
113f0 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 (cipher, &alg_bi
11400 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e ts);..LAPPEND_IN
11410 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
11420 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c , "secret_bits",
11430 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 bits);..LAPPEND
11440 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
11450 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f Ptr, "algorithm_
11460 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 29 bits", alg_bits)
11470 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 ;../* alg_bits i
11480 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 s actual key sec
11490 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 ret bits. If use
114a0 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 bits and secret
114b0 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 (algorithm) bit
114c0 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68 s differ,.. th
114d0 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 e rest of the bi
114e0 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e ts are fixed, i.
114f0 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 e. for limited e
11500 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 xport ciphers (b
11510 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f its < 56) */.../
11520 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 63 * Indicates whic
11530 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 h SSL/TLS protoc
11540 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 74 ol version first
11550 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 70 defined the cip
11560 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
11570 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11580 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e tr, "min_version
11590 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ", SSL_CIPHER_ge
115a0 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 t_version(cipher
115b0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 ), -1);.../* Cip
115c0 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 her NID */..LAPP
115d0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
115e0 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e objPtr, "cipherN
115f0 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a ID", (char *)OBJ
11600 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 _nid2ln(SSL_CIPH
11610 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 ER_get_cipher_ni
11620 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b d(cipher)), -1);
11630 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
11640 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 terp, objPtr, "d
11650 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72 igestNID", (char
11660 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 *)OBJ_nid2ln(SS
11670 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67 L_CIPHER_get_dig
11680 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29 est_nid(cipher))
11690 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f , -1);..LAPPEND_
116a0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
116b0 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65 tr, "keyExchange
116c0 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 NID", (char *)OB
116d0 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 J_nid2ln(SSL_CIP
116e0 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 HER_get_kx_nid(c
116f0 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c ipher)), -1);..L
11700 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11710 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 p, objPtr, "auth
11720 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 enticationNID",
11730 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 (char *)OBJ_nid2
11740 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ln(SSL_CIPHER_ge
11750 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65 t_auth_nid(ciphe
11760 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d r)), -1);.../* m
11770 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 essage authentic
11780 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 ation code - Cip
11790 68 65 72 20 69 73 20 41 45 41 44 20 28 65 2e 67 her is AEAD (e.g
117a0 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32 . GCM or ChaCha2
117b0 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 0/Poly1305) or n
117c0 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e ot */../* Authen
117d0 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 69 ticated Encrypti
117e0 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 74 on with associat
117f0 65 64 20 64 61 74 61 20 28 41 45 41 44 29 20 63 ed data (AEAD) c
11800 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 heck */..LAPPEND
11810 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
11820 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73 jPtr, "cipher_is
11830 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 _aead", SSL_CIPH
11840 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65 ER_is_aead(ciphe
11850 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 74 r));.../* Digest
11860 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 65 used during the
11870 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61 SSL/TLS handsha
11880 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 ke when using th
11890 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 e cipher. */..md
118a0 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 = SSL_CIPHER_ge
118b0 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 t_handshake_dige
118c0 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 50 st(cipher);..LAP
118d0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
118e0 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 68 objPtr, "handsh
118f0 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63 68 ake_digest", (ch
11900 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 ar *)EVP_MD_name
11910 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 (md), -1);.../*
11920 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 Get OpenSSL-spec
11930 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e ific ID, not IAN
11940 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 A ID */..LAPPEND
11950 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
11960 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 22 Ptr, "cipher_id"
11970 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 , (int) SSL_CIPH
11980 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 ER_get_id(cipher
11990 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 ));.../* Two-byt
119a0 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 65 e ID used in the
119b0 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 TLS protocol of
119c0 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 65 the given ciphe
119d0 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e r */..LAPPEND_IN
119e0 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
119f0 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c , "protocol_id",
11a00 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 (int) SSL_CIPHE
11a10 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 R_get_protocol_i
11a20 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a d(cipher));.../*
11a30 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 Textual descrip
11a40 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 tion of the ciph
11a50 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 er */..if (SSL_C
11a60 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f IPHER_descriptio
11a70 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 n(cipher, buf, s
11a80 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e izeof(buf)) != N
11a90 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 ULL) {.. LAPP
11aa0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11ab0 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 70 objPtr, "descrip
11ac0 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b tion", buf, -1);
11ad0 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
11ae0 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a * Session info *
11af0 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 /. session =
11b00 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_get_session(
11b10 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65 ssl);. if (se
11b20 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b ssion != NULL) {
11b30 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
11b40 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 char *ticket;..
11b50 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e size_t len2;..un
11b60 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b signed int ulen;
11b70 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
11b80 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
11b90 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 63 68 61 72 d, *proto;..char
11ba0 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f buffer[SSL_MAX_
11bb0 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 MASTER_KEY_LENGT
11bc0 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 H];.../* Report
11bd0 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f the selected pro
11be0 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c tocol as a resul
11bf0 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 t of the ALPN ne
11c00 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 gotiation */..SS
11c10 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 L_SESSION_get0_a
11c20 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 lpn_selected(ses
11c30 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c sion, &proto, &l
11c40 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 en2);..LAPPEND_S
11c50 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11c60 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 r, "alpn", (char
11c70 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f *) proto, (Tcl_
11c80 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f Size) len2);.../
11c90 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c * Report the sel
11ca0 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
11cb0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 s a result of th
11cc0 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f e NPN negotiatio
11cd0 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f n */.#ifdef USE_
11ce0 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 NPN..SSL_get0_ne
11cf0 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 xt_proto_negotia
11d00 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c ted(ssl, &proto,
11d10 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e &ulen);..LAPPEN
11d20 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11d30 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 jPtr, "npn", (ch
11d40 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 ar *) proto, (Tc
11d50 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 l_Size) ulen);.#
11d60 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d endif.../* Resum
11d70 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a able session */.
11d80 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
11d90 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 terp, objPtr, "r
11da0 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 esumable", SSL_S
11db0 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 ESSION_is_resuma
11dc0 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a ble(session));..
11dd0 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 ./* Session star
11de0 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 t time (seconds
11df0 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a since epoch) */.
11e00 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e .LAPPEND_LONG(in
11e10 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
11e20 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f tart_time", SSL_
11e30 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 SESSION_get_time
11e40 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a (session));.../*
11e50 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d Timeout value -
11e60 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d SSL_CTX_get_tim
11e70 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 eout (in seconds
11e80 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f ) */..LAPPEND_LO
11e90 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NG(interp, objPt
11ea0 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 r, "timeout", SS
11eb0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
11ec0 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b meout(session));
11ed0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 .../* Session id
11ee0 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 - TLSv1.2 and b
11ef0 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 elow only */..se
11f00 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 ssion_id = SSL_S
11f10 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 ESSION_get_id(se
11f20 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 ssion, &ulen);..
11f30 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 LAPPEND_BARRAY(i
11f40 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11f50 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 session_id", ses
11f60 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 sion_id, (Tcl_Si
11f70 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 ze) ulen);.../*
11f80 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 Session context
11f90 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d */..session_id =
11fa0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
11fb0 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 0_id_context(ses
11fc0 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c sion, &ulen);..L
11fd0 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e APPEND_BARRAY(in
11fe0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
11ff0 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c ession_context",
12000 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 session_id, (Tc
12010 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a l_Size) ulen);..
12020 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b ./* Session tick
12030 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 et - client only
12040 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e */..SSL_SESSION
12050 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 _get0_ticket(ses
12060 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 sion, &ticket, &
12070 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f len2);..LAPPEND_
12080 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f BARRAY(interp, o
12090 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f bjPtr, "session_
120a0 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c ticket", ticket,
120b0 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
120c0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
120d0 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 ticket lifetime
120e0 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 hint (in seconds
120f0 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f ) */..LAPPEND_LO
12100 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NG(interp, objPt
12110 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 r, "lifetime", S
12120 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 SL_SESSION_get_t
12130 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 icket_lifetime_h
12140 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a int(session));..
12150 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 ./* Ticket app d
12160 61 74 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 ata */..SSL_SESS
12170 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f ION_get0_ticket_
12180 61 70 70 64 61 74 61 28 73 65 73 73 69 6f 6e 2c appdata(session,
12190 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 &ticket, &len2)
121a0 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 ;..LAPPEND_BARRA
121b0 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 Y(interp, objPtr
121c0 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 , "ticket_app_da
121d0 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 ta", ticket, (Tc
121e0 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a l_Size) len2);..
121f0 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b ./* Get master k
12200 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 ey */..len2 = SS
12210 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 L_SESSION_get_ma
12220 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e ster_key(session
12230 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 , buffer, SSL_MA
12240 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e X_MASTER_KEY_LEN
12250 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 GTH);..LAPPEND_B
12260 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 ARRAY(interp, ob
12270 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 jPtr, "master_ke
12280 79 22 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c y", buffer, (Tcl
12290 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 _Size) len2);...
122a0 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 /* Compression i
122b0 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 d */..unsigned i
122c0 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 nt id = SSL_SESS
122d0 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 ION_get_compress
122e0 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c _id(session);..L
122f0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
12300 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 p, objPtr, "comp
12310 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 ression_id", id
12320 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 == 1 ? "zlib" :
12330 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 "none", -1);.
12340 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 }.. /* Compr
12350 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 ession info */.
12360 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 if (ssl != NU
12370 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 LL) {.#ifdef HAV
12380 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f E_SSL_COMPRESSIO
12390 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 N..const COMP_ME
123a0 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 THOD *comp, *exp
123b0 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 n;..comp = SSL_g
123c0 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 et_current_compr
123d0 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 ession(ssl);..ex
123e0 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 pn = SSL_get_cur
123f0 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 rent_expansion(s
12400 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 sl);...LAPPEND_S
12410 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12420 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 r, "compression"
12430 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d , comp ? SSL_COM
12440 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 P_get_name(comp)
12450 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a : "none", -1);.
12460 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
12470 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 erp, objPtr, "ex
12480 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f pansion", expn ?
12490 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 SSL_COMP_get_na
124a0 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 me(expn) : "none
124b0 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c ", -1);.#else..L
124c0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
124d0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 p, objPtr, "comp
124e0 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 ression", "none"
124f0 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f , -1);..LAPPEND_
12500 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12510 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c tr, "expansion",
12520 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 "none", -1);.#e
12530 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ndif. }..
12540 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a /* Server info *
12550 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f /. {..long mo
12560 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 de = SSL_CTX_get
12570 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d _session_cache_m
12580 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ode(statePtr->ct
12590 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a x);..char *msg;.
125a0 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c ..if (mode & SSL
125b0 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 _SESS_CACHE_OFF)
125c0 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f {.. msg = "o
125d0 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 ff";..} else if
125e0 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 (mode & SSL_SESS
125f0 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b _CACHE_CLIENT) {
12600 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 .. msg = "cli
12610 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 ent";..} else if
12620 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
12630 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 S_CACHE_SERVER)
12640 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 {.. msg = "se
12650 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 rver";..} else i
12660 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 f (mode & SSL_SE
12670 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b SS_CACHE_BOTH) {
12680 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 .. msg = "bot
12690 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 h";..} else {..
126a0 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 msg = "unknow
126b0 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f n";..}..LAPPEND_
126c0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
126d0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 tr, "session_cac
126e0 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d he_mode", msg, -
126f0 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 1);. }.. /
12700 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 * CA List */.
12710 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 /* IF not a ser
12720 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c ver, same as SSL
12730 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 _get0_peer_CA_li
12740 73 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 st. If server sa
12750 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 me as SSL_CTX_ge
12760 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 t_client_CA_list
12770 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 */. listPtr
12780 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
12790 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 (0, NULL);. S
127a0 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d TACK_OF(X509_NAM
127b0 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 E) *ca_list;.
127c0 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 if ((ca_list =
127d0 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 SSL_get_client_C
127e0 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 A_list(ssl)) !=
127f0 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 NULL) {..char bu
12800 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 ffer[BUFSIZ];..f
12810 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 or (int i = 0; i
12820 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f < sk_X509_NAME_
12830 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b num(ca_list); i+
12840 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e +) {.. X509_N
12850 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 AME *name = sk_X
12860 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 509_NAME_value(c
12870 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 a_list, i);..
12880 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 if (name) {...X
12890 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 509_NAME_oneline
128a0 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 (name, buffer, B
128b0 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 UFSIZ);...Tcl_Li
128c0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
128d0 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 nt(interp, listP
128e0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
128f0 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 gObj(buffer, -1)
12900 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 );.. }..}.
12910 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f }. LAPPEND_O
12920 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 BJ(interp, objPt
12930 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 r, "caList", lis
12940 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 tPtr);. LAPPE
12950 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
12960 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f bjPtr, "caListCo
12970 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 unt", sk_X509_NA
12980 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 ME_num(ca_list))
12990 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 ;.. Tcl_SetOb
129a0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
129b0 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
129c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
129d0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
129e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a10 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 --------. *. * V
12a20 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 ersionObjCmd --
12a30 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 return version s
12a40 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 tring from OpenS
12a50 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 SL.. *. * Result
12a60 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
12a70 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
12a80 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
12a90 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
12aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ae0 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
12af0 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 t.VersionObjCmd(
12b00 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
12b10 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
12b20 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
12b30 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
12b40 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
12b50 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
12b60 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c r;. (void) cl
12b70 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 28 76 ientData;. (v
12b80 6f 69 64 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28 oid) objc;. (
12b90 76 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20 void) objv;..
12ba0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
12bb0 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 ");.. objPtr
12bc0 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f = Tcl_NewStringO
12bd0 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 bj(OPENSSL_VERSI
12be0 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 ON_TEXT, -1);.
12bf0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
12c00 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
12c10 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
12c20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 TCL_OK;.}.../*.
12c30 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
12c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c70 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f ----. *. * MiscO
12c80 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f bjCmd -- misc co
12c90 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 mmands. *. * Res
12ca0 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
12cb0 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
12cc0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
12cd0 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
12ce0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
12cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d20 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
12d30 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 int.MiscObjCmd(
12d40 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
12d50 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
12d60 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
12d70 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
12d80 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
12d90 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 static const c
12da0 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d har *commands []
12db0 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 = { "req", "str
12dc0 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 req", NULL };.
12dd0 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b enum command {
12de0 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 C_REQ, C_STRREQ
12df0 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 , C_DUMMY };.
12e00 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 Tcl_Size cmd;.
12e10 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 int isStr;.
12e20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 char buffer[16
12e30 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 384];. (void)
12e40 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 clientData;..
12e50 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
12e60 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
12e70 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 jc < 2) {..Tcl_W
12e80 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
12e90 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 rp, 1, objv, "su
12ea0 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 bcommand ?args?"
12eb0 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
12ec0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
12ed0 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
12ee0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
12ef0 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 objv[1], command
12f00 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c s, "command", 0,
12f10 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b &cmd) != TCL_OK
12f20 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
12f30 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
12f40 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
12f50 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 r();.. isStr
12f60 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 = (cmd == C_STRR
12f70 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 EQ);. switch
12f80 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 ((enum command)
12f90 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 cmd) {..case C_R
12fa0 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 EQ:..case C_STRR
12fb0 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 EQ: {.. EVP_P
12fc0 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a KEY *pkey=NULL;.
12fd0 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d . X509 *cert=
12fe0 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f NULL;.. X509_
12ff0 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b NAME *name=NULL;
13000 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a .. Tcl_Obj **
13010 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f listv;.. Tcl_
13020 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 20 Size listc;..
13030 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 49 int i;... BI
13040 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 O *out=NULL;...
13050 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c char *k_C="",
13060 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 *k_ST="",*k_L=""
13070 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 ,*k_O="",*k_OU="
13080 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d ",*k_CN="",*k_Em
13090 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 ail="";.. cha
130a0 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 r *keyout,*pemou
130b0 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 t,*str;.. int
130c0 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d keysize,serial=
130d0 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 0,days=365;..#if
130e0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
130f0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
13100 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 0000L.. BIGNU
13110 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 M *bne = NULL;..
13120 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e RSA *rsa = N
13130 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ULL;.#else..
13140 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 EVP_PKEY_CTX *ct
13150 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 x = NULL;.#endif
13160 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 ... if ((objc
13170 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 <5) || (objc>6))
13180 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 {...Tcl_WrongNu
13190 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c mArgs(interp, 2,
131a0 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 objv, "keysize
131b0 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 keyfile certfile
131c0 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 ?info?");...ret
131d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
131e0 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 }... if (
131f0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 Tcl_GetIntFromOb
13200 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 j(interp, objv[2
13210 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 ], &keysize) !=
13220 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 TCL_OK) {...retu
13230 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
13240 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 }.. keyout
13250 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f =Tcl_GetString(o
13260 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 bjv[3]);.. pe
13270 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 mout=Tcl_GetStri
13280 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 ng(objv[4]);..
13290 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 if (isStr) {..
132a0 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 .Tcl_SetVar(inte
132b0 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b rp,keyout,"",0);
132c0 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e ...Tcl_SetVar(in
132d0 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 terp,pemout,"",0
132e0 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 );.. }...
132f0 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 if (objc>=6) {..
13300 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a .if (Tcl_ListObj
13310 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 GetElements(inte
13320 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 rp, objv[5], &li
13330 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 stc, &listv) !=
13340 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 TCL_OK) {...
13350 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
13360 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 ;...}....if ((li
13370 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 stc%2) != 0) {..
13380 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
13390 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 lt(interp,"Infor
133a0 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 mation list must
133b0 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 have even numbe
133c0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c r of arguments",
133d0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 NULL);... ret
133e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
133f0 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 .}...for (i=0; i
13400 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a <listc; i+=2) {.
13410 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 .. str=Tcl_Ge
13420 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d tString(listv[i]
13430 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 );... if (str
13440 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d cmp(str,"days")=
13450 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c =0) {....if (Tcl
13460 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 _GetIntFromObj(i
13470 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d nterp,listv[i+1]
13480 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 ,&days)!=TCL_OK)
13490 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 .... return T
134a0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 CL_ERROR;...
134b0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
134c0 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d p(str,"serial")=
134d0 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c =0) {....if (Tcl
134e0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 _GetIntFromObj(i
134f0 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d nterp,listv[i+1]
13500 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f ,&serial)!=TCL_O
13510 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e K).... return
13520 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 TCL_ERROR;...
13530 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
13540 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 cmp(str,"C")==0)
13550 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 {....k_C=Tcl_Ge
13560 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
13570 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
13580 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
13590 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 ,"ST")==0) {....
135a0 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 k_ST=Tcl_GetStri
135b0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
135c0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
135d0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 (strcmp(str,"L")
135e0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 ==0) {....k_L=Tc
135f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
13600 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
13610 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
13620 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a (str,"O")==0) {.
13630 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 ...k_O=Tcl_GetSt
13640 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
13650 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
13660 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f f (strcmp(str,"O
13670 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f U")==0) {....k_O
13680 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 U=Tcl_GetString(
13690 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
136a0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
136b0 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d rcmp(str,"CN")==
136c0 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 0) {....k_CN=Tcl
136d0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
136e0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
136f0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
13700 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 str,"Email")==0)
13710 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 {....k_Email=Tc
13720 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
13730 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
13740 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 else {....Tcl_S
13750 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
13760 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 "Unknown paramet
13770 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 er",NULL);....re
13780 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13790 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 .. }...}..
137a0 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f }..#if OPENSSL_
137b0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
137c0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 0x30000000L..
137d0 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 bne = BN_new()
137e0 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 ;.. rsa = RSA
137f0 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 _new();.. pke
13800 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 y = EVP_PKEY_new
13810 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 ();.. if (bne
13820 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 == NULL || rsa
13830 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 == NULL || pkey
13840 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 == NULL || !BN_s
13850 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f et_word(bne,RSA_
13860 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 F4) ||...!RSA_ge
13870 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 nerate_key_ex(rs
13880 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c a, keysize, bne,
13890 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 NULL) || !EVP_P
138a0 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 KEY_assign_RSA(p
138b0 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 key, rsa)) {...E
138c0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 VP_PKEY_free(pke
138d0 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 y);.../* RSA_fre
138e0 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 e(rsa); freed by
138f0 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a EVP_PKEY_free *
13900 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 /...BN_free(bne)
13910 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 ;.#else.. pke
13920 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 y = EVP_RSA_gen(
13930 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b (unsigned int) k
13940 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 eysize);.. ct
13950 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 x = EVP_PKEY_CTX
13960 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b _new(pkey,NULL);
13970 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d .. if (pkey =
13980 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d = NULL || ctx ==
13990 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b NULL || !EVP_PK
139a0 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 EY_keygen_init(c
139b0 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b tx) ||...!EVP_PK
139c0 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b EY_CTX_set_rsa_k
139d0 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 eygen_bits(ctx,
139e0 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 keysize) || !EVP
139f0 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 _PKEY_keygen(ctx
13a00 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 , &pkey)) {...EV
13a10 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 P_PKEY_free(pkey
13a20 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 );...EVP_PKEY_CT
13a30 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e X_free(ctx);.#en
13a40 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 dif...Tcl_SetRes
13a50 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f ult(interp,"Erro
13a60 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 r generating pri
13a70 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b vate key",NULL);
13a80 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
13a90 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 ROR;.. } else
13aa0 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 {...if (isStr)
13ab0 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f {... out=BIO_
13ac0 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 new(BIO_s_mem())
13ad0 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 ;... PEM_writ
13ae0 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 e_bio_PrivateKey
13af0 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e (out,pkey,NULL,N
13b00 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 ULL,0,NULL,NULL)
13b10 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 ;... i=BIO_re
13b20 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 ad(out,buffer,si
13b30 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b zeof(buffer)-1);
13b40 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f ... i=(i<0) ?
13b50 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 0 : i;... bu
13b60 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 ffer[i]='\0';...
13b70 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 Tcl_SetVar(i
13b80 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 nterp,keyout,buf
13b90 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 fer,0);... BI
13ba0 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 O_flush(out);...
13bb0 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 BIO_free(out
13bc0 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
13bd0 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
13be0 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 BIO_s_file());..
13bf0 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 . BIO_write_f
13c00 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f ilename(out,keyo
13c10 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ut);... PEM_w
13c20 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 rite_bio_Private
13c30 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c Key(out,pkey,NUL
13c40 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 L,NULL,0,NULL,NU
13c50 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 LL);... /* PE
13c60 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 M_write_bio_RSAP
13c70 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 rivateKey(out, r
13c80 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 sa, NULL, NULL,
13c90 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 0, NULL, NULL);
13ca0 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 */... BIO_fre
13cb0 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d e_all(out);.. .}
13cc0 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 ....if ((cert=X5
13cd0 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 09_new())==NULL)
13ce0 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 {... Tcl_Set
13cf0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 Result(interp,"E
13d00 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 rror generating
13d10 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75 certificate requ
13d20 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 est",NULL);...
13d30 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 EVP_PKEY_free(
13d40 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 pkey);.#if OPENS
13d50 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
13d60 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
13d70 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e .. BN_free(bn
13d80 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 e);.#endif...
13d90 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f return(TCL_ERRO
13da0 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f R);...}....X509_
13db0 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 set_version(cert
13dc0 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 ,2);...ASN1_INTE
13dd0 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 GER_set(X509_get
13de0 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 _serialNumber(ce
13df0 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 rt),serial);...X
13e00 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 509_gmtime_adj(X
13e10 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 509_getm_notBefo
13e20 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 re(cert),0);...X
13e30 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 509_gmtime_adj(X
13e40 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 509_getm_notAfte
13e50 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 r(cert),(long)60
13e60 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 *60*24*days);...
13e70 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 X509_set_pubkey(
13e80 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e cert,pkey);....n
13e90 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 ame=X509_get_sub
13ea0 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b ject_name(cert);
13eb0 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ....X509_NAME_ad
13ec0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
13ed0 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e ame,"C", MBSTRIN
13ee0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
13ef0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
13f00 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a _C, -1, -1, 0);.
13f10 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
13f20 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
13f30 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 e,"ST", MBSTRING
13f40 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
13f50 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
13f60 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a ST, -1, -1, 0);.
13f70 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
13f80 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
13f90 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f e,"L", MBSTRING_
13fa0 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
13fb0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c gned char *) k_L
13fc0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
13fd0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
13fe0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
13ff0 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 "O", MBSTRING_AS
14000 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
14010 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 ed char *) k_O,
14020 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
14030 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
14040 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f y_by_txt(name,"O
14050 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 U", MBSTRING_ASC
14060 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
14070 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 d char *) k_OU,
14080 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
14090 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
140a0 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 y_by_txt(name,"C
140b0 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 N", MBSTRING_ASC
140c0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
140d0 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 d char *) k_CN,
140e0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
140f0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
14100 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 y_by_txt(name,"E
14110 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f mail", MBSTRING_
14120 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
14130 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 gned char *) k_E
14140 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 mail, -1, -1, 0)
14150 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 ;....X509_set_su
14160 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c bject_name(cert,
14170 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 name);....if (!X
14180 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 509_sign(cert,pk
14190 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 ey,EVP_sha256())
141a0 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 ) {... X509_f
141b0 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 ree(cert);...
141c0 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 EVP_PKEY_free(p
141d0 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 key);.#if OPENSS
141e0 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
141f0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
14200 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 . BN_free(bne
14210 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 );.#endif...
14220 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
14230 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e terp,"Error sign
14240 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22 ing certificate"
14250 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 ,NULL);... re
14260 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
14270 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 ..}....if (isStr
14280 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 ) {... out=BI
14290 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 O_new(BIO_s_mem(
142a0 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 ));... PEM_wr
142b0 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 ite_bio_X509(out
142c0 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d ,cert);... i=
142d0 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 BIO_read(out,buf
142e0 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 fer,sizeof(buffe
142f0 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 r)-1);... i=(
14300 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 i<0) ? 0 : i;...
14310 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c buffer[i]='\
14320 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 0';... Tcl_Se
14330 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f tVar(interp,pemo
14340 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 ut,buffer,0);...
14350 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 BIO_flush(ou
14360 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 t);... BIO_fr
14370 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 ee(out);...} els
14380 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 e {... out=BI
14390 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 O_new(BIO_s_file
143a0 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 ());... BIO_w
143b0 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 rite_filename(ou
143c0 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 t,pemout);...
143d0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 PEM_write_bio_X
143e0 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 509(out,cert);..
143f0 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c . BIO_free_al
14400 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 l(out);...}....X
14410 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 509_free(cert);.
14420 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 ..EVP_PKEY_free(
14430 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 pkey);.#if OPENS
14440 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
14450 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
14460 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a ..BN_free(bne);.
14470 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d #endif.. }..}
14480 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 ..break;. def
14490 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 ault:..break;.
144a0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }. return T
144b0 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a CL_OK;.}.../****
144c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
144d0 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 /./* Init
144e0 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a */./******
144f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
14500 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
14510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14540 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
14550 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 Tls_Free --. *.
14560 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
14570 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 cleans up when
14580 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 a SSL socket bas
14590 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 ed channel. *.is
145a0 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 closed and its
145b0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 reference count
145c0 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a falls below 1. *
145d0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
145e0 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 none. *. * Side
145f0 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 effects:. *.Free
14600 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a s all the state.
14610 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
14620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14650 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
14660 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 d.Tls_Free(char
14670 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 *blockPtr) {.
14680 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
14690 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 = (State *)bloc
146a0 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e kPtr;.. dprin
146b0 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
146c0 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 Tls_Clean(sta
146d0 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 tePtr);. ckfr
146e0 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a ee(blockPtr);.}.
146f0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
14700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
14740 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a Tls_Clean --. *
14750 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
14760 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 re cleans up whe
14770 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 n a SSL socket b
14780 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 ased channel. *.
14790 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 is closed and it
147a0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e s reference coun
147b0 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e t falls below 1.
147c0 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a This should. *
147d0 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 .be called synch
147e0 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 ronously by the
147f0 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 CloseProc, not i
14800 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 n the. *.Eventua
14810 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b llyFree callback
14820 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
14830 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.none. *. * S
14840 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
14850 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 Frees all the st
14860 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ate. *. *-------
14870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
148a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
148b0 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 .void Tls_Clean(
148c0 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 State *statePtr)
148d0 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 {. dprintf("
148e0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f Called");.. /
148f0 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 *. * we're a
14900 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 ssuming here tha
14910 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 t we're single-t
14920 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a hreaded. */.
14930 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
14940 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f ->timer != (Tcl_
14950 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c TimerToken) NULL
14960 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 ) {..Tcl_DeleteT
14970 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 imerHandler(stat
14980 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 ePtr->timer);..s
14990 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
149a0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
149b0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
149c0 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 protos) {..ckfre
149d0 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 e(statePtr->prot
149e0 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e os);..statePtr->
149f0 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 protos = NULL;.
14a00 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
14a10 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f tePtr->bio) {../
14a20 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c * This will call
14a30 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 SSL_shutdown. B
14a40 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 ug 1414045 */..d
14a50 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 printf("BIO_free
14a60 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 _all(%p)", state
14a70 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f Ptr->bio);..BIO_
14a80 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 free_all(statePt
14a90 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 r->bio);..stateP
14aa0 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a tr->bio = NULL;.
14ab0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
14ac0 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 atePtr->ssl) {..
14ad0 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 dprintf("SSL_fre
14ae0 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 e(%p)", statePtr
14af0 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 ->ssl);..SSL_fre
14b00 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
14b10 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ;..statePtr->ssl
14b20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
14b30 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
14b40 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 >ctx) {..SSL_CTX
14b50 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e _free(statePtr->
14b60 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ctx);..statePtr-
14b70 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 >ctx = NULL;.
14b80 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
14b90 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b Ptr->callback) {
14ba0 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 ..Tcl_DecrRefCou
14bb0 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c nt(statePtr->cal
14bc0 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 lback);..statePt
14bd0 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 r->callback = NU
14be0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
14bf0 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 (statePtr->pass
14c00 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 word) {..Tcl_Dec
14c10 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
14c20 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 tr->password);..
14c30 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
14c40 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d rd = NULL;. }
14c50 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
14c60 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f r->vcmd) {..Tcl_
14c70 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 DecrRefCount(sta
14c80 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 tePtr->vcmd);..s
14c90 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 tatePtr->vcmd =
14ca0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
14cb0 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e dprintf("Return
14cc0 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 23 69 66 20 54 ing");.}...#if T
14cd0 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
14ce0 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e > 8.#define MIN
14cf0 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 _VERSION "9.0".#
14d00 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e else.#define MIN
14d10 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 _VERSION "8.5".#
14d20 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d endif../*. *----
14d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
14d70 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d *. * Tls_Init -
14d80 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 -. *. *.This is
14d90 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 a package initia
14da0 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 lization procedu
14db0 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c re, which is cal
14dc0 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 led. *.by Tcl wh
14dd0 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 en this package
14de0 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 is to be added t
14df0 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 o an interpreter
14e00 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
14e10 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 Ssl configured
14e20 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 and loaded. *.
14e30 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
14e40 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 *. create the s
14e50 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 sl command, init
14e60 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 ialize ssl conte
14e70 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d xt. *. *--------
14e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
14ec0 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c DLLEXPORT int Tl
14ed0 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 s_Init(Tcl_Inter
14ee0 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 p *interp) {.
14ef0 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 const char tlsT
14f00 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d clInitScript[] =
14f10 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 {.#include "tls
14f20 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 .tcl.h"..0x00.
14f30 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 };.. dprint
14f40 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 f("Called");..#i
14f50 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 fdef USE_TCL_STU
14f60 42 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 BS. if (Tcl_I
14f70 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c nitStubs(interp,
14f80 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 MIN_VERSION, 0)
14f90 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
14fa0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
14fb0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 }.#endif.
14fc0 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 if (Tcl_PkgRequi
14fd0 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 re(interp, "Tcl"
14fe0 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 , MIN_VERSION, 0
14ff0 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 ) == NULL) {..re
15000 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
15010 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 }.. if (T
15020 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 lsLibInit(0) !=
15030 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 TCL_OK) {..Tcl_A
15040 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
15050 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 rp, "could not i
15060 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 nitialize SSL li
15070 62 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 brary", (char *)
15080 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
15090 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
150a0 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 .. Tcl_Create
150b0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
150c0 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 p, "tls::ciphers
150d0 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 ", CiphersObjCmd
150e0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e , (ClientData) N
150f0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ULL, (Tcl_CmdDel
15100 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
15110 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
15120 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
15130 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 p, "tls::connect
15140 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e ion", Connection
15150 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 InfoObjCmd, (Cli
15160 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 entData) NULL, (
15170 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
15180 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
15190 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
151a0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
151b0 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 s::handshake", H
151c0 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 andshakeObjCmd,
151d0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c (ClientData) NUL
151e0 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 L, (Tcl_CmdDelet
151f0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
15200 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
15210 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
15220 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 "tls::import",
15230 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 ImportObjCmd, (C
15240 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c lientData) NULL,
15250 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
15260 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
15270 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
15280 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
15290 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 tls::unimport",
152a0 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 UnimportObjCmd,
152b0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c (ClientData) NUL
152c0 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 L, (Tcl_CmdDelet
152d0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
152e0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
152f0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
15300 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 "tls::status",
15310 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 StatusObjCmd, (C
15320 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c lientData) NULL,
15330 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
15340 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
15350 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
15360 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
15370 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 tls::version", V
15380 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 ersionObjCmd, (C
15390 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c lientData) NULL,
153a0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
153b0 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
153c0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
153d0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
153e0 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 tls::misc", Misc
153f0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
15400 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f ata) NULL, (Tcl_
15410 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
15420 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
15430 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
15440 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 (interp, "tls::p
15450 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f rotocols", Proto
15460 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 colsObjCmd, (Cli
15470 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 entData) NULL, (
15480 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
15490 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 c *) NULL);..
154a0 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 if (interp) {..
154b0 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c Tcl_Eval(interp,
154c0 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 tlsTclInitScrip
154d0 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 t);. }.. r
154e0 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f eturn Tcl_PkgPro
154f0 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43 vide(interp, PAC
15500 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 KAGE_NAME, PACKA
15510 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a GE_VERSION);.}..
15520 2f 2a 0a 20 2a 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 2d ----------------
15540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a -----------*. *.
15560 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 *.Tls_SafeInit
15570 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d --. *. *.-------
15580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
155a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 ---------*. *.St
155b0 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 andard procedure
155c0 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f required by 'lo
155d0 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 ad'.. *.Initiali
155e0 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 zes this extensi
155f0 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e on for a safe in
15600 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d terpreter.. *.--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
15640 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 *. *.Side effec
15650 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 ts:. *..As of 'T
15660 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 ls_Init'. *. *.R
15670 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 esult:. *..A sta
15680 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 ndard Tcl error
15690 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d code.. *. *-----
156a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
156b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
156c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
156d0 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 -*. */.DLLEXPORT
156e0 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 int Tls_SafeIni
156f0 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e t(Tcl_Interp *in
15700 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 terp) {. dpri
15710 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 ntf("Called");.
15720 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e return(Tls_In
15730 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a it(interp));.}..
15740 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
15750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a -----------*. *.
15780 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d *.TlsLibInit --
15790 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *.---------
157a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157c0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 -------*. *.Init
157d0 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 ializes SSL libr
157e0 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 ary once per app
157f0 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d lication. *.----
15800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
15830 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 . *.Side effects
15840 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 :. *..initialize
15850 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a s SSL library. *
15860 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 . *.Result:. *..
15870 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d none. *. *------
15880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158b0 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 *. */.static int
158c0 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 TlsLibInit(int
158d0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a uninitialize) {.
158e0 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 static int i
158f0 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a nitialized = 0;.
15900 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d int status =
15910 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 TCL_OK;.#if def
15920 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
15930 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
15940 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 (TCL_THREADS).
15950 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 size_t num_loc
15960 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 ks;.#endif..
15970 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 if (uninitialize
15980 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61 ) {..if (!initia
15990 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70 lized) {.. dp
159a0 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 rintf("Asked to
159b0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 uninitialize, bu
159c0 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 t we are not ini
159d0 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 tialized");...
159e0 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 return(TCL_OK)
159f0 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 ;..}...dprintf("
15a00 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 Asked to uniniti
15a10 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 alize");..#if de
15a20 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
15a30 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
15a40 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 d(TCL_THREADS)..
15a50 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 Tcl_MutexLock(&i
15a60 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c nit_mx);...if (l
15a70 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65 ocks) {.. fre
15a80 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c e(locks);.. l
15a90 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 ocks = NULL;..
15aa0 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 locksCount = 0
15ab0 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 ;..}.#endif..ini
15ac0 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 tialized = 0;..#
15ad0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
15ae0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
15af0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
15b00 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e DS)..Tcl_MutexUn
15b10 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a lock(&init_mx);.
15b20 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 #endif...return(
15b30 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a TCL_OK);. }..
15b40 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 if (initiali
15b50 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 zed) {..dprintf(
15b60 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 "Called, but usi
15b70 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 22 ng cached value"
15b80 29 3b 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 );..return(statu
15b90 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 s);. }.. d
15ba0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
15bb0 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
15bc0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
15bd0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
15be0 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f HREADS). Tcl_
15bf0 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f MutexLock(&init_
15c00 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 mx);.#endif.
15c10 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b initialized = 1;
15c20 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
15c30 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
15c40 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
15c50 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c READS). num_l
15c60 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f ocks = 1;. lo
15c70 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 cksCount = (int)
15c80 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 num_locks;.
15c90 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 locks = malloc(s
15ca0 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 izeof(*locks) *
15cb0 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 num_locks);.
15cc0 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c memset(locks, 0,
15cd0 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 sizeof(*locks)
15ce0 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 * num_locks);.#e
15cf0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 ndif.. /* Ini
15d00 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 tialize BOTH lib
15d10 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 crypto and libss
15d20 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 l. */. OPENSS
15d30 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 L_init_ssl(OPENS
15d40 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c SL_INIT_LOAD_SSL
15d50 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 _STRINGS | OPENS
15d60 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 SL_INIT_LOAD_CRY
15d70 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f PTO_STRINGS..| O
15d80 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f PENSSL_INIT_ADD_
15d90 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 ALL_CIPHERS | OP
15da0 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 ENSSL_INIT_ADD_A
15db0 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c LL_DIGESTS, NULL
15dc0 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f );.. BIO_new_
15dd0 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 tcl(NULL, 0);..#
15de0 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 if 0. /*.
15df0 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d * XXX:TODO: Rem
15e00 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e ove this code an
15e10 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 d replace it wit
15e20 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a h a check. *
15e30 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 for enough entr
15e40 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 opy and do not t
15e50 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 ry to create our
15e60 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 own. * terr
15e70 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 ible entropy.
15e80 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 */. /*.
15e90 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 * Seed the rand
15ea0 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 om number genera
15eb0 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c tor in the SSL l
15ec0 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 ibrary,. * u
15ed0 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c sing the do/whil
15ee0 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 e construct beca
15ef0 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e use of the bug n
15f00 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 ote in the.
15f10 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 * OpenSSL FAQ at
15f20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e http://www.open
15f30 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f ssl.org/support/
15f40 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 faq.html#USER1.
15f50 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 *. * The
15f60 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f crux of the pro
15f70 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c blem is that Sol
15f80 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 aris 7 does not
15f90 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 have a. * /d
15fa0 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 ev/random or /de
15fb0 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 v/urandom device
15fc0 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 so it cannot ga
15fd0 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 ther enough.
15fe0 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 * entropy from
15ff0 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 the RAND_seed()
16000 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c when TLS initial
16010 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 izes and refuses
16020 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 . * to go fu
16030 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 rther. Earlier v
16040 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 ersions of OpenS
16050 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 SL carried on re
16060 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a gardless.. *
16070 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 /. srand((uns
16080 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 igned int) time(
16090 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 (time_t *) NULL)
160a0 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 );. do {..for
160b0 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b (i = 0; i < 16;
160c0 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 i++) {.. rnd
160d0 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 _seed[i] = 1 + (
160e0 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 char) (255.0 * r
160f0 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b and()/(RAND_MAX+
16100 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 1.0));..}..RAND_
16110 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 seed(rnd_seed, s
16120 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 izeof(rnd_seed))
16130 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 ;. } while (R
16140 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 AND_status() !=
16150 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 1);.#endif..#if
16160 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
16170 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
16180 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
16190 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 ..Tcl_MutexUnloc
161a0 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e k(&init_mx);.#en
161b0 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 dif.. return(
161c0 73 74 61 74 75 73 29 3b 0a 7d 0a status);.}.