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 4e 55 4c 4c 20 3a 20 5c 0a char *)NULL : \.
04b0: 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 ..Tcl_TranslateF
04c0: 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 ileName(interp,
04d0: 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a 0a (key), (dsp)))..
04e0: 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a static SSL_CTX *
04f0: 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a CTX_Init(State *
0500: 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 statePtr, int is
0510: 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 Server, int prot
0520: 6f 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 09 o, char *key,...
0530: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 20 char *certfile,
0540: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
0550: 65 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e 65 ey_asn1, unsigne
0560: 64 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73 6e d char *cert_asn
0570: 31 2c 0a 09 09 69 6e 74 20 6b 65 79 5f 61 73 6e 1,...int key_asn
0580: 31 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 1_len, int cert_
0590: 61 73 6e 31 5f 6c 65 6e 2c 20 63 68 61 72 20 2a asn1_len, char *
05a0: 43 41 70 61 74 68 2c 20 63 68 61 72 20 2a 43 41 CApath, 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 76 6f 69 64 20 2a 29 20 69 serve((void *) i
0b70: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f nterp);. Tcl_
0b80: 50 72 65 73 65 72 76 65 28 28 76 6f 69 64 20 2a Preserve((void *
0b90: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 ) statePtr);..
0ba0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
0bb0: 63 6b 20 77 69 74 68 20 73 75 63 63 65 73 73 20 ck with success
0bc0: 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75 72 6e for ok or return
0bd0: 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c 20 66 value 1, fail f
0be0: 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65 74 75 or error or retu
0bf0: 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a 20 20 rn value 0 */.
0c00: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c Tcl_ResetResul
0c10: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 63 t(interp);. c
0c20: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 ode = Tcl_EvalOb
0c30: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 jEx(interp, cmdP
0c40: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f tr, TCL_EVAL_GLO
0c50: 42 41 4c 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 BAL);. dprint
0c60: 66 28 22 45 76 61 6c 43 61 6c 6c 62 61 63 6b 3a f("EvalCallback:
0c70: 20 25 64 22 2c 20 63 6f 64 65 29 3b 0a 20 20 20 %d", code);.
0c80: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c if (code == TCL
0c90: 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 43 68 65 63 6b _OK) {../* Check
0ca0: 20 72 65 73 75 6c 74 20 66 6f 72 20 72 65 74 75 result for retu
0cb0: 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 54 63 6c rn value */..Tcl
0cc0: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 20 3d 20 54 _Obj *result = T
0cd0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
0ce0: 69 6e 74 65 72 70 29 3b 0a 09 69 66 20 28 72 65 interp);..if (re
0cf0: 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 sult == NULL ||
0d00: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 Tcl_GetIntFromOb
0d10: 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 j(interp, result
0d20: 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c 5f 4f 4b , &ok) != TCL_OK
0d30: 29 20 7b 0a 09 20 20 20 20 6f 6b 20 3d 20 31 3b ) {.. ok = 1;
0d40: 0a 09 7d 0a 09 64 70 72 69 6e 74 66 28 22 52 65 ..}..dprintf("Re
0d50: 73 75 6c 74 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a sult: %d", ok);.
0d60: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a } else {../*
0d70: 20 45 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 Error - reject
0d80: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
0d90: 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 54 63 6c */..dprintf("Tcl
0da0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
0db0: 22 29 3b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ");.#if (TCL_MAJ
0dc0: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
0dd0: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
0de0: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
0df0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
0e00: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
0e10: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
0e20: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
0e30: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 code);.#endif.
0e40: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 52 65 }.. Tcl_Re
0e50: 6c 65 61 73 65 28 28 76 6f 69 64 20 2a 29 20 73 lease((void *) s
0e60: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 tatePtr);. Tc
0e70: 6c 5f 52 65 6c 65 61 73 65 28 28 76 6f 69 64 20 l_Release((void
0e80: 2a 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 *) interp);.
0e90: 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f return ok;.}.../
0ea0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
0eb0: 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 49 6e -------. *. * In
0ef0: 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a foCallback --. *
0f00: 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c . *.Monitors SSL
0f10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 connection proc
0f20: 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ess. *. * Result
0f30: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
0f40: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
0f50: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
0f60: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
0f70: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0f80: 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
0fc0: 63 20 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 c void.InfoCallb
0fd0: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
0fe0: 73 6c 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 sl, int where, i
0ff0: 6e 74 20 72 65 74 29 0a 7b 0a 20 20 20 20 53 74 nt ret).{. St
1000: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
1010: 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f (State*)SSL_get_
1020: 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 app_data((SSL *)
1030: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e ssl);. Tcl_In
1040: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
1050: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
1060: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
1070: 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 dPtr;. const
1080: 63 68 61 72 20 2a 6d 61 6a 6f 72 2c 20 2a 6d 69 char *major, *mi
1090: 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 nor;.. dprint
10a0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
10b0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
10c0: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c callback == (Tcl
10d0: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 _Obj*)NULL)..ret
10e0: 75 72 6e 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 urn;.. if (wh
10f0: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e ere & SSL_CB_HAN
1100: 44 53 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a DSHAKE_START) {.
1110: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 .major = "handsh
1120: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 ake";..minor = "
1130: 73 74 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c start";. } el
1140: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
1150: 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f SL_CB_HANDSHAKE_
1160: 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d DONE) {..major =
1170: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d "handshake";..m
1180: 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 inor = "done";.
1190: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
11a0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
11b0: 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20 ALERT)..major =
11c0: 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69 "alert";..else i
11d0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 f (where & SSL_S
11e0: 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 T_CONNECT).major
11f0: 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 = "connect";..e
1200: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 lse if (where &
1210: 53 53 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09 SSL_ST_ACCEPT)..
1220: 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22 major = "accept"
1230: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f ;..else.....majo
1240: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a r = "unknown";..
1250: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c .if (where & SSL
1260: 5f 43 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72 _CB_READ)..minor
1270: 20 3d 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65 = "read";..else
1280: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c if (where & SSL
1290: 5f 43 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f _CB_WRITE)..mino
12a0: 72 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c r = "write";..el
12b0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
12c0: 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e SL_CB_LOOP)..min
12d0: 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c or = "loop";..el
12e0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
12f0: 53 4c 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e SL_CB_EXIT)..min
1300: 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c or = "exit";..el
1310: 73 65 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22 se.....minor = "
1320: 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a unknown";. }.
1330: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
1340: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
1350: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 6d 61 ith fn, chan, ma
1360: 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 6d 65 73 73 jor, minor, mess
1370: 61 67 65 2c 20 61 6e 64 20 74 79 70 65 20 61 72 age, and type ar
1380: 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 gs */. cmdPtr
1390: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
13a0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
13b0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c llback);. Tcl
13c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
13d0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
13e0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
13f0: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d ingObj("info", -
1400: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
1410: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1420: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
1430: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
1440: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
1450: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
1460: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
1470: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1480: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1490: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
14a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
14b0: 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20 major, -1));.
14c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
14d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
14e0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
14f0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72 wStringObj(minor
1500: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20 , -1));.. if
1510: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1520: 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69 ALERT) {..Tcl_Li
1530: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1540: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1550: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
1560: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 tringObj(SSL_ale
1570: 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c rt_desc_string_l
1580: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a ong(ret), -1));.
1590: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
15a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
15b0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
15c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
15d0: 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 SSL_alert_type_s
15e0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c tring_long(ret),
15f0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 -1));. } els
1600: 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a e {..Tcl_ListObj
1610: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1620: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
1630: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
1640: 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 Obj(SSL_state_st
1650: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 ring_long(ssl),
1660: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
1670: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1680: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1690: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
16a0: 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 ("info", -1));.
16b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 }.. /* Eva
16c0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
16d0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
16e0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
16f0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
1700: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
1710: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
1720: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
1730: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a ount(cmdPtr);.}.
1740: 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
1790: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b MessageCallback
17a0: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f --. *. *.Monito
17b0: 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 rs SSL protocol
17c0: 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52 messages. *. * R
17d0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
17e0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
17f0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
1800: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
1810: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d). *. *--------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
1860: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f #ifndef OPENSSL_
1870: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 61 NO_SSL_TRACE.sta
1880: 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 65 tic void.Message
1890: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 69 Callback(int wri
18a0: 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 6f te_p, int versio
18b0: 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f 74 n, int content_t
18c0: 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 ype, const void
18d0: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 6e *buf, size_t len
18e0: 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 64 , SSL *ssl, void
18f0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
1900: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
1910: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 State*)arg;.
1920: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
1930: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
1940: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
1950: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
1960: 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 65 char *ver, *type
1970: 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a ;. BIO *bio;.
1980: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b char buffer[
1990: 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 66 15000];. buff
19a0: 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 er[0] = 0;..
19b0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
19c0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
19d0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
19e0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
19f0: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 )..return;..
1a00: 73 77 69 74 63 68 28 76 65 72 73 69 6f 6e 29 20 switch(version)
1a10: 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e {.#if !defined(N
1a20: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
1a30: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
1a40: 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20 53 53 SL3). case SS
1a50: 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 L3_VERSION:..ver
1a60: 20 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62 72 65 = "SSLv3";..bre
1a70: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 ak;.#endif. c
1a80: 61 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e ase TLS1_VERSION
1a90: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 22 :..ver = "TLSv1"
1aa0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1ab0: 73 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f se TLS1_1_VERSIO
1ac0: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 N:..ver = "TLSv1
1ad0: 2e 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 .1";..break;.
1ae0: 20 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 case TLS1_2_VER
1af0: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c SION:..ver = "TL
1b00: 53 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a Sv1.2";..break;.
1b10: 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33 5f case TLS1_3_
1b20: 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 VERSION:..ver =
1b30: 22 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 "TLSv1.3";..brea
1b40: 6b 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 09 k;. case 0:..
1b50: 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 ver = "none";..b
1b60: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c reak;. defaul
1b70: 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f t:..ver = "unkno
1b80: 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 wn";..break;.
1b90: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 }.. switch (
1ba0: 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a content_type) {.
1bb0: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 case SSL3_RT
1bc0: 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d _HEADER:..type =
1bd0: 20 22 48 65 61 64 65 72 22 3b 0a 09 62 72 65 61 "Header";..brea
1be0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 k;. case SSL3
1bf0: 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e _RT_INNER_CONTEN
1c00: 54 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 T_TYPE:..type =
1c10: 22 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 "Inner Content T
1c20: 79 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 ype";..break;.
1c30: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 case SSL3_RT_C
1c40: 48 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 HANGE_CIPHER_SPE
1c50: 43 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e C:..type = "Chan
1c60: 67 65 20 43 69 70 68 65 72 22 3b 0a 09 62 72 65 ge Cipher";..bre
1c70: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c ak;. case SSL
1c80: 33 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 3_RT_ALERT:..typ
1c90: 65 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 e = "Alert";..br
1ca0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 eak;. case SS
1cb0: 4c 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a L3_RT_HANDSHAKE:
1cc0: 0a 09 74 79 70 65 20 3d 20 22 48 61 6e 64 73 68 ..type = "Handsh
1cd0: 61 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 ake";..break;.
1ce0: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 case SSL3_RT_A
1cf0: 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a PPLICATION_DATA:
1d00: 0a 09 74 79 70 65 20 3d 20 22 41 70 70 20 44 61 ..type = "App Da
1d10: 74 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 ta";..break;.#if
1d20: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
1d30: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
1d40: 30 30 30 30 4c 0a 20 20 20 20 63 61 73 65 20 44 0000L. case D
1d50: 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 TLS1_RT_HEARTBEA
1d60: 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 T:..type = "Hear
1d70: 74 62 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a tbeat";..break;.
1d80: 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 #endif. defau
1d90: 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b lt:..type = "unk
1da0: 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 nown";. }..
1db0: 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 /* Needs compi
1dc0: 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 le time option "
1dd0: 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 enable-ssl-trace
1de0: 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 ". */. if ((b
1df0: 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f io = BIO_new(BIO
1e00: 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 _s_mem())) != NU
1e10: 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 LL) {..int n;..S
1e20: 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f 70 SL_trace(write_p
1e30: 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 , version, conte
1e40: 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 nt_type, buf, le
1e50: 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 n, ssl, (void *)
1e60: 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 bio);..n = BIO_r
1e70: 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c ead(bio, buffer,
1e80: 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f BIO_pending(bio
1e90: 29 20 3c 20 31 35 30 30 30 20 3f 20 42 49 4f 5f ) < 15000 ? BIO_
1ea0: 70 65 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 pending(bio) : 1
1eb0: 34 39 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 4999);..n = (n<0
1ec0: 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 ) ? 0 : n;..buff
1ed0: 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 er[n] = 0;..(voi
1ee0: 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 d)BIO_flush(bio)
1ef0: 3b 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 ;..BIO_free(bio)
1f00: 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 ;. }.. /* C
1f10: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
1f20: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 eval with fn, c
1f30: 68 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 han, direction,
1f40: 76 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20 61 version, type, a
1f50: 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73 20 nd message args
1f60: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
1f70: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
1f80: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
1f90: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
1fa0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1fb0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1fc0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
1fd0: 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 2d Obj("message", -
1fe0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
1ff0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2000: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2010: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
2020: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
2030: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
2040: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
2050: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
2060: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2070: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2080: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2090: 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 22 write_p ? "Sent"
20a0: 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 2d : "Received", -
20b0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
20c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
20d0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
20e0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
20f0: 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 20 bj(ver, -1));.
2100: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2110: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2120: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2130: 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 65 ewStringObj(type
2140: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
2150: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2160: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
2170: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
2180: 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 ngObj(buffer, -1
2190: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c ));.. /* Eval
21a0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
21b0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
21c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
21d0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 );. EvalCallb
21e0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
21f0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 ePtr, cmdPtr);.
2200: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
2210: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 unt(cmdPtr);.}.#
2220: 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d endif.../*. *---
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 2d 2d 2d 2d 2d ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2270: 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c . *. * VerifyCal
2280: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d lback --. *. *.M
2290: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 74 onitors SSL cert
22a0: 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 ificate validati
22b0: 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 64 on process. Used
22c0: 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 0a to control the.
22d0: 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 6e *.behavior when
22e0: 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 5f the SSL_VERIFY_
22f0: 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 74 PEER flag is set
2300: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 . This is called
2310: 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 63 . *.whenever a c
2320: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 6e ertificate is in
2330: 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 64 spected or decid
2340: 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c 6c ed invalid. Call
2350: 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 63 ed for. *.each c
2360: 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 68 ertificate in th
2370: 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 2a e cert chain.. *
2380: 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 63 . * Checks:. *.c
2390: 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69 6e ertificate chain
23a0: 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61 72 is checked star
23b0: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64 65 ting with the de
23c0: 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c 65 epest nesting le
23d0: 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72 6f vel. *. (the ro
23e0: 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74 ot CA certificat
23f0: 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75 70 e) and worked up
2400: 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65 72 ward to the peer
2410: 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e 0a 's certificate..
2420: 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72 65 *.All signature
2430: 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75 72 s are valid, cur
2440: 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69 74 rent time is wit
2450: 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c 61 hin first and la
2460: 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d 65 st validity time
2470: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74 20 .. *.Check that
2480: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
2490: 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68 65 is issued by the
24a0: 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69 63 issuer certific
24b0: 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09 43 ate issuer.. *.C
24c0: 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61 74 heck the revocat
24d0: 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20 65 ion status for e
24e0: 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65 2e ach certificate.
24f0: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76 61 . *.Check the va
2500: 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67 69 lidity of the gi
2510: 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65 20 ven CRL and the
2520: 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e 20 cert revocation
2530: 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63 6b status.. *.Check
2540: 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f 66 the policies of
2550: 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66 69 all the certifi
2560: 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67 73 cates. *. * Args
2570: 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f 6b . *.preverify_ok
2580: 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 68 indicates wheth
2590: 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63 61 er the certifica
25a0: 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 te verification
25b0: 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e 6f passed (1) or no
25c0: 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73 75 t (0). *. * Resu
25d0: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 lts:. *.A callba
25e0: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 ck bound to the
25f0: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72 socket may retur
2600: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 n one of:. *.
2610: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 0...- the certi
2620: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 ficate is deemed
2630: 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20 76 invalid, send v
2640: 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09 09 erification. *..
2650: 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65 72 .. failure aler
2660: 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20 74 t to peer, and t
2670: 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68 61 erminate handsha
2680: 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09 2d ke.. *. 1...-
2690: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
26a0: 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69 64 is deemed valid
26b0: 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 , continue with
26c0: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 handshake.. *.
26d0: 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09 2d empty string.-
26e0: 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 65 no change to ce
26f0: 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 rtificate valida
2700: 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 tion. *. * Side
2710: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 effects:. *.The
2720: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 err field of the
2730: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 currently opera
2740: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 tive State is se
2750: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 t. *. to a stri
2760: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 ng describing th
2770: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f e SSL negotiatio
2780: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e n failure reason
2790: 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
27e0: 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79 43 atic int.VerifyC
27f0: 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 allback(int ok,
2800: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a X509_STORE_CTX *
2810: 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f ctx) {. Tcl_O
2820: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
2830: 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 53 SSL *ssl..= (S
2840: 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43 SL*)X509_STORE_C
2850: 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63 TX_get_ex_data(c
2860: 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64 tx, SSL_get_ex_d
2870: 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43 ata_X509_STORE_C
2880: 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58 TX_idx());. X
2890: 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35 509 *cert..= X5
28a0: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
28b0: 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74 _current_cert(ct
28c0: 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 x);. State *s
28d0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 tatePtr.= (State
28e0: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
28f0: 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c ta(ssl);. Tcl
2900: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
2910: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
2920: 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70 74 rp;. int dept
2930: 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f h..= X509_STORE_
2940: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65 CTX_get_error_de
2950: 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69 6e pth(ctx);. in
2960: 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53 54 t err..= X509_ST
2970: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f ORE_CTX_get_erro
2980: 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70 72 r(ctx);.. dpr
2990: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
29a0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 dprintf("Ver
29b0: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22 ifyCallback: %d"
29c0: 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28 , ok);.. if (
29d0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
29e0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
29f0: 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f 6b 20 76 ) {../* Use ok v
2a00: 61 6c 75 65 20 69 66 20 76 65 72 69 66 69 63 61 alue if verifica
2a10: 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 tion is required
2a20: 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74 */..if (statePt
2a30: 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c 5f r->vflags & SSL_
2a40: 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e VERIFY_FAIL_IF_N
2a50: 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 O_PEER_CERT) {..
2a60: 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 return ok;..
2a70: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 } else {.. re
2a80: 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d turn 1;..}. }
2a90: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 3d else if (cert =
2aa0: 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d = NULL || ssl ==
2ab0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
2ac0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 0;. }.. d
2ad0: 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61 printf("VerifyCa
2ae0: 6c 6c 62 61 63 6b 3a 20 65 76 61 6c 20 63 61 6c llback: eval cal
2af0: 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20 20 2f 2a lback");.. /*
2b00: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 Create command
2b10: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c to eval with fn,
2b20: 20 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 chan, depth, ce
2b30: 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 rt info list, st
2b40: 61 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 atus, and error
2b50: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 args */. cmdP
2b60: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
2b70: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
2b80: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
2b90: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2ba0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2bb0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
2bc0: 67 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d gObj("verify", -
2bd0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
2be0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2bf0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2c00: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 ,..Tcl_NewString
2c10: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
2c20: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
2c30: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 >self), -1));.
2c40: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2c50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2c60: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2c70: 65 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 ewIntObj(depth))
2c80: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
2c90: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2ca0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2cb0: 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e ls_NewX509Obj(in
2cc0: 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 terp, cert));.
2cd0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2ce0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2cf0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2d00: 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 ewIntObj(ok));.
2d10: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2d20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2d30: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c rp, cmdPtr,..Tcl
2d40: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 _NewStringObj((c
2d50: 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 har*)X509_verify
2d60: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 _cert_error_stri
2d70: 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a ng(err), -1));..
2d80: 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 /* Prevent I
2d90: 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 /O while callbac
2da0: 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 k is in progress
2db0: 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 */. /* state
2dc0: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c Ptr->flags |= TL
2dd0: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 S_TCL_CALLBACK;
2de0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 */.. /* Eval
2df0: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
2e00: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
2e10: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
2e20: 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 ;. ok = EvalC
2e30: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
2e40: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
2e50: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
2e60: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
2e70: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 .. dprintf("V
2e80: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 63 erifyCallback: c
2e90: 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20 3d 20 ommand result =
2ea0: 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 2f %d", ok);.. /
2eb0: 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 * statePtr->flag
2ec0: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 s &= ~(TLS_TCL_C
2ed0: 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 ALLBACK); */.
2ee0: 20 72 65 74 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 return(ok);./*
2ef0: 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 76 By default, leav
2f00: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75 e verification u
2f10: 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c nchanged. */.}..
2f20: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 ---------. *. *
2f70: 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a Tls_Error --. *.
2f80: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
2f90: 6b 20 77 69 74 68 20 6c 69 73 74 20 6f 66 20 65 k with list of e
2fa0: 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 rrors.. *. * Sid
2fb0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 e effects:. *.Th
2fc0: 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 e err field of t
2fd0: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 he currently ope
2fe0: 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 rative State is
2ff0: 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 set. *. to a st
3000: 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 ring describing
3010: 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 the SSL negotiat
3020: 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 ion failure reas
3030: 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d on. *. *--------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
3080: 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 void.Tls_Error(S
3090: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
30a0: 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 char *msg) {.
30b0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
30c0: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
30d0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
30e0: 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 Obj *cmdPtr, *li
30f0: 73 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 67 stPtr;. unsig
3100: 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 ned long err;.
3110: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 statePtr->err
3120: 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72 69 = msg;.. dpri
3130: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
3140: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
3150: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
3160: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 cl_Obj*)NULL)..r
3170: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 eturn;.. /* C
3180: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
3190: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 eval with fn, c
31a0: 68 61 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67 65 han, and message
31b0: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 args */. cmd
31c0: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
31d0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
31e0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 >callback);.
31f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
3200: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
3210: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
3220: 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 StringObj("error
3230: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
3240: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3250: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3260: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
3270: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
3280: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
3290: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
32a0: 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d 73 -1));. if (ms
32b0: 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 g != NULL) {..Tc
32c0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
32d0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
32e0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
32f0: 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 ringObj(msg, -1)
3300: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 );.. } else i
3310: 66 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47 65 f ((msg = Tcl_Ge
3320: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 tStringFromObj(T
3330: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
3340: 69 6e 74 65 72 70 29 2c 20 28 54 63 6c 5f 53 69 interp), (Tcl_Si
3350: 7a 65 20 2a 29 20 4e 55 4c 4c 29 29 20 21 3d 20 ze *) NULL)) !=
3360: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 NULL) {..Tcl_Lis
3370: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3380: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3390: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
33a0: 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 bj(msg, -1));..
33b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73 } else {..lis
33c0: 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 tPtr = Tcl_NewLi
33d0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
33e0: 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 45 .while ((err = E
33f0: 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 20 RR_get_error())
3400: 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c != 0) {.. Tcl
3410: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3420: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 ement(interp, li
3430: 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 stPtr, Tcl_NewSt
3440: 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 73 ringObj(ERR_reas
3450: 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 on_error_string(
3460: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 err), -1));..}..
3470: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
3480: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
3490: 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 72 cmdPtr, listPtr
34a0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
34b0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 Eval callback c
34c0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 ommand */. Tc
34d0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
34e0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c mdPtr);. Eval
34f0: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c Callback(interp,
3500: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 statePtr, cmdPt
3510: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 r);. Tcl_Decr
3520: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
3530: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
3580: 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 *. * KeyLogCallb
3590: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 ack --. *. *.Wri
35a0: 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 20 te received key
35b0: 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65 data to log file
35c0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
35d0: 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ects:. *.none. *
35e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3600: 2d 2d 2d 2d 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 0a 20 2a 2f 0a 76 6f 69 64 20 ------. */.void
3630: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 KeyLogCallback(c
3640: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 onst SSL *ssl, c
3650: 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 onst char *line)
3660: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 {. char *str
3670: 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 = getenv(SSLKEY
3680: 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 LOGFILE);. FI
3690: 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72 LE *fd;.. dpr
36a0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
36b0: 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a . if (str) {.
36c0: 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c .fd = fopen(str,
36d0: 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 "a");..fprintf(
36e0: 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 fd, "%s\n",line)
36f0: 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 ;..fclose(fd);.
3700: 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d }.}.../*. *--
3710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3750: 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 -. *. * Password
3760: 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a Callback --. *.
3770: 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 *.Called when a
3780: 20 70 61 73 73 77 6f 72 64 20 66 6f 72 20 61 20 password for a
3790: 70 72 69 76 61 74 65 20 6b 65 79 20 6c 6f 61 64 private key load
37a0: 69 6e 67 2f 73 74 6f 72 69 6e 67 20 61 20 50 45 ing/storing a PE
37b0: 4d 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74 65 M. *.certificate
37c0: 20 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e with encryption
37d0: 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b . Evals callback
37e0: 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75 script and retu
37f0: 72 6e 73 0a 20 2a 09 74 68 65 20 72 65 73 75 6c rns. *.the resul
3800: 74 20 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 t as the passwor
3810: 64 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e d string in buf.
3820: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
3830: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
3840: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
3850: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
3860: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
3870: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 Returns:. *.Pas
3880: 73 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 sword size in by
3890: 74 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e tes or -1 for an
38a0: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d error.. *. *---
38b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38f0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
3900: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b PasswordCallback
3910: 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 (char *buf, int
3920: 73 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 size, int rwflag
3930: 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b , void *udata) {
3940: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
3950: 65 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 ePtr.= (State *)
3960: 20 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f udata;. Tcl_
3970: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d Interp *interp.=
3980: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
3990: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
39a0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 cmdPtr;. int
39b0: 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e code;.. dprin
39c0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
39d0: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c /* If no call
39e0: 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c back, use defaul
39f0: 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 t callback */.
3a00: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
3a10: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c password == NULL
3a20: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 ) {..if (Tcl_Eva
3a30: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 lEx(interp, "tls
3a40: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c ::password", -1,
3a50: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
3a60: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) == TCL_OK) {..
3a70: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 char *ret =
3a80: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
3a90: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 StringResult(int
3aa0: 65 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 erp);.. strnc
3ab0: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 py(buf, ret, (si
3ac0: 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 ze_t) size);..
3ad0: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 return (int)st
3ae0: 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c rlen(ret);..} el
3af0: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e se {.. return
3b00: 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 -1;..}. }..
3b10: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
3b20: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 mand to eval wit
3b30: 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c 20 61 6e h fn, rwflag, an
3b40: 64 20 73 69 7a 65 20 61 72 67 73 20 2a 2f 0a 20 d size args */.
3b50: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
3b60: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
3b70: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
3b80: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3b90: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3ba0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3bb0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3bc0: 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 "password", -1))
3bd0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3be0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3bf0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3c00: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 cl_NewIntObj(rwf
3c10: 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c lag));. Tcl_L
3c20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3c30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3c40: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
3c50: 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 j(size));.. T
3c60: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 76 6f 69 cl_Preserve((voi
3c70: 64 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 d *) interp);.
3c80: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
3c90: 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 void *) statePtr
3ca0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 );.. /* Eval
3cb0: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
3cc0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
3cd0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
3ce0: 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c ;. code = Tcl
3cf0: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 _EvalObjEx(inter
3d00: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 p, cmdPtr, TCL_E
3d10: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 VAL_GLOBAL);.
3d20: 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c if (code != TCL
3d30: 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f _OK) {.#if (TCL_
3d40: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d MAJOR_VERSION ==
3d50: 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 8) && (TCL_MINO
3d60: 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 R_VERSION < 6)..
3d70: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 Tcl_BackgroundEr
3d80: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c ror(interp);.#el
3d90: 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 se..Tcl_Backgrou
3da0: 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 ndException(inte
3db0: 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 rp, code);.#endi
3dc0: 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f f. }. Tcl_
3dd0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
3de0: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 Ptr);.. Tcl_R
3df0: 65 6c 65 61 73 65 28 28 76 6f 69 64 20 2a 29 20 elease((void *)
3e00: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
3e10: 2f 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c /* If successful
3e20: 2c 20 70 61 73 73 20 62 61 63 6b 20 70 61 73 73 , pass back pass
3e30: 77 6f 72 64 20 73 74 72 69 6e 67 20 61 6e 64 20 word string and
3e40: 74 72 75 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 truncate if too
3e50: 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 long */. if (
3e60: 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 code == TCL_OK)
3e70: 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b {..Tcl_Size len;
3e80: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 ..char *ret = (c
3e90: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 har *) Tcl_GetSt
3ea0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f ringFromObj(Tcl_
3eb0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 GetObjResult(int
3ec0: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 erp), &len);..if
3ed0: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a (len > (Tcl_Siz
3ee0: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 e) size-1) {..
3ef0: 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a len = (Tcl_Siz
3f00: 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 e) size-1;..}..s
3f10: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c trncpy(buf, ret,
3f20: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a (size_t) len);.
3f30: 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 .buf[len] = '\0'
3f40: 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 ;..Tcl_Release((
3f50: 76 6f 69 64 20 2a 29 20 69 6e 74 65 72 70 29 3b void *) interp);
3f60: 0a 09 72 65 74 75 72 6e 28 28 69 6e 74 29 20 6c ..return((int) l
3f70: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 en);. }. T
3f80: 63 6c 5f 52 65 6c 65 61 73 65 28 28 76 6f 69 64 cl_Release((void
3f90: 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 *) interp);.
3fa0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a return -1;.}...
3fb0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 --------. *. * S
4000: 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 ession Callback
4010: 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 for Clients --.
4020: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e *. *.Called when
4030: 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 69 a new session i
4040: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 s added to the c
4050: 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33 ache. In TLS 1.3
4060: 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20 . *.this may be
4070: 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c received multipl
4080: 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 68 e times after th
4090: 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72 e handshake. For
40a0: 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73 . *.earlier vers
40b0: 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 ions, this will
40c0: 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 69 be received duri
40d0: 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 ng the handshake
40e0: 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 65 .. *.This is the
40f0: 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20 74 preferred way t
4100: 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 6d o obtain a resum
4110: 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a able session.. *
4120: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
4130: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
4140: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
4150: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
4160: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 efined). *. * Re
4170: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30 turn codes:. *.0
4180: 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 73 = error where s
4190: 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69 ession will be i
41a0: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f 76 mmediately remov
41b0: 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 ed from the inte
41c0: 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31 rnal cache.. *.1
41d0: 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 65 = success where
41e0: 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 73 app retains ses
41f0: 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20 sion in session
4200: 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 20 cache, and must
4210: 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e call SSL_SESSION
4220: 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f 6e _free() when don
4230: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
4240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
4280: 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 69 static int.Sessi
4290: 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a onCallback(SSL *
42a0: 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e ssl, SSL_SESSION
42b0: 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 20 *session) {.
42c0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
42d0: 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 = (State*)SSL_g
42e0: 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c et_app_data((SSL
42f0: 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c *)ssl);. Tcl
4300: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
4310: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
4320: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
4330: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e *cmdPtr;. con
4340: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
4350: 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 6f *ticket;. co
4360: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4370: 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 20 r *session_id;.
4380: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a size_t len2;.
4390: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
43a0: 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 ulen;.. dpri
43b0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
43c0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
43d0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
43e0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
43f0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4400: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
4410: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d else if (ssl ==
4420: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
4430: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
4440: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
4450: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
4460: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 and to eval with
4470: 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 73 69 fn, chan, sessi
4480: 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e 20 74 on id, session t
4490: 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 65 74 icket, and lifet
44a0: 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 ime args */.
44b0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
44c0: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
44d0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 tr->callback);.
44e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
44f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4500: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
4510: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 NewStringObj("se
4520: 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 ssion", -1));.
4530: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
4540: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
4550: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
4560: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
4570: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
4580: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
4590: 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 lf), -1));..
45a0: 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f /* Session id */
45b0: 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 . session_id
45c0: 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
45d0: 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 t_id(session, &u
45e0: 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 len);. Tcl_Li
45f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4600: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4610: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 r, Tcl_NewByteAr
4620: 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 rayObj(session_i
4630: 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c d, (Tcl_Size) ul
4640: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 en));.. /* Se
4650: 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a ssion ticket */.
4660: 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f SSL_SESSION_
4670: 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 get0_ticket(sess
4680: 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
4690: 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 en2);. Tcl_Li
46a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
46b0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
46c0: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 r, Tcl_NewByteAr
46d0: 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 rayObj(ticket, (
46e0: 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 29 Tcl_Size) len2))
46f0: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 ;.. /* Lifeti
4700: 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 me - number of s
4710: 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 econds */. Tc
4720: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4730: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4740: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c mdPtr,..Tcl_NewL
4750: 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 ongObj((long) SS
4760: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
4770: 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 cket_lifetime_hi
4780: 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a nt(session)));..
4790: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
47a0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
47b0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
47c0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
47d0: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 EvalCallback(i
47e0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
47f0: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 cmdPtr);. Tc
4800: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
4810: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 mdPtr);. retu
4820: 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d rn 0;.}.../*. *-
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4870: 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 --. *. * ALPN Ca
4880: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 llback for Serve
4890: 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 rs and NPN Callb
48a0: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 ack for Clients
48b0: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d --. *. *.Perform
48c0: 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f protocol (http/
48d0: 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 1.1, h2, h3, etc
48e0: 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 .) selection for
48f0: 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 the. *.incoming
4900: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c connection. Cal
4910: 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 led after Hello
4920: 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c 62 and server callb
4930: 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 acks.. *.Where '
4940: 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 64 out' is selected
4950: 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 protocol and 'i
4960: 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 20 61 n' is the peer a
4970: 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e 0a dvertised list..
4980: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
4990: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
49a0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
49b0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
49c0: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
49d0: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
49e0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
49f0: 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f OK: ALPN protoco
4a00: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 l selected. The
4a10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
4a20: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
4a30: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 EXT_ERR_ALERT_FA
4a40: 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e TAL: There was n
4a50: 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 o overlap betwee
4a60: 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 n the client's.
4a70: 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c *. supplied l
4a80: 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 76 ist and the serv
4a90: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e er configuration
4aa0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
4ab0: 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 will be aborted
4ac0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
4ad0: 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 ERR_NOACK: ALPN
4ae0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c protocol not sel
4af0: 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 ected, e.g., bec
4b00: 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 ause no ALPN. *.
4b10: 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 protocols ar
4b20: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 e configured for
4b30: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e this connection
4b40: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
4b50: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 continues.. *.
4b60: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
4b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ba0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
4bb0: 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b int.ALPNCallback
4bc0: 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 (SSL *ssl, const
4bd0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
4be0: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 *out, unsigned c
4bf0: 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f har *outlen,..co
4c00: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4c10: 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 r *in, unsigned
4c20: 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 int inlen, void
4c30: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 *arg) {. Stat
4c40: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
4c50: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 tate*)arg;. T
4c60: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
4c70: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
4c80: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
4c90: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
4ca0: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 nt code, res;..
4cb0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
4cc0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
4cd0: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 sl == NULL || ar
4ce0: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 g == NULL) {..re
4cf0: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
4d00: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
4d10: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 .. /* Select
4d20: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 protocol */.
4d30: 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e if (SSL_select_n
4d40: 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 67 ext_proto((unsig
4d50: 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 74 ned char **) out
4d60: 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 , outlen, stateP
4d70: 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 tr->protos, stat
4d80: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e ePtr->protos_len
4d90: 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d ,..in, inlen) ==
4da0: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 OPENSSL_NPN_NEG
4db0: 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d OTIATED) {../* M
4dc0: 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 atch found */..r
4dd0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
4de0: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c ERR_OK;. } el
4df0: 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c se {../* OPENSSL
4e00: 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 _NPN_NO_OVERLAP
4e10: 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f = No overlap, so
4e20: 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 use first item
4e30: 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 from client prot
4e40: 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 ocol list */..re
4e50: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
4e60: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
4e70: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
4e80: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f r->vcmd == (Tcl_
4e90: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 Obj*)NULL) {..re
4ea0: 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a turn res;. }.
4eb0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
4ec0: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
4ed0: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 ith fn, chan, de
4ee0: 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c pth, cert info l
4ef0: 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 ist, status, and
4f00: 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 error args */.
4f10: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
4f20: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
4f30: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 tePtr->vcmd);.
4f40: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
4f50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
4f60: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
4f70: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 ewStringObj("alp
4f80: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 n", -1));. Tc
4f90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4fa0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4fb0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
4fc0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
4fd0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
4fe0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
4ff0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
5000: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5010: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5020: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
5030: 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 72 gObj((const char
5040: 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a *) *out, -1));.
5050: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
5060: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5070: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
5080: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 _NewBooleanObj(r
5090: 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54 es == SSL_TLSEXT
50a0: 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20 _ERR_OK));..
50b0: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
50c0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
50d0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
50e0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 (cmdPtr);. if
50f0: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 ((code = EvalCa
5100: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 llback(interp, s
5110: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 tatePtr, cmdPtr)
5120: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 ) > 1) {..res =
5130: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
5140: 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 OACK;. } else
5150: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
5160: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
5170: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
5180: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
5190: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
51a0: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20 LERT_FATAL;.
51b0: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 }. Tcl_DecrRe
51c0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
51d0: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a return res;.
51e0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
5230: 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f * Advertise Pro
5240: 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20 tocols Callback
5250: 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f for Next Protoco
5260: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e l Negotiation (N
5270: 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c PN) in ServerHel
5280: 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c lo --. *. *.call
5290: 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65 ed when a TLS se
52a0: 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73 rver needs a lis
52b0: 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70 t of supported p
52c0: 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78 rotocols for Nex
52d0: 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 t. *.Protocol Ne
52e0: 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a gotiation.. *. *
52f0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
5300: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
5310: 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 ects:. *. * Retu
5320: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c rn codes:. *.SSL
5330: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 _TLSEXT_ERR_OK:
5340: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c NPN protocol sel
5350: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 ected. The conne
5360: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
5370: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
5380: 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 RR_NOACK: NPN pr
5390: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 otocol not selec
53a0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
53b0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
53c0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5400: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 -------. */.#ifd
5410: 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69 ef USE_NPN.stati
5420: 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 c int.NPNCallbac
5430: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
5440: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 , const unsigned
5450: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 char **out, uns
5460: 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65 igned int *outle
5470: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a n, void *arg) {.
5480: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
5490: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
54a0: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 g;.. dprintf(
54b0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
54c0: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 if (ssl == NULL
54d0: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 || arg == NULL)
54e0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
54f0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
5500: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
5510: 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 t protocols list
5520: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
5530: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
5540: 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 NULL) {..*out =
5550: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
5560: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61 ;..*outlen = sta
5570: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 tePtr->protos_le
5580: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a n;. } else {.
5590: 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a .*out = NULL;..*
55a0: 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74 outlen = 0;..ret
55b0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
55c0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
55d0: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 return SSL_T
55e0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a LSEXT_ERR_OK;.}.
55f0: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d #endif.../*. *--
5600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5640: 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c -. *. * SNI Call
5650: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 back for Servers
5660: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 --. *. *.Perfor
5670: 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e m server-side SN
5680: 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 I hostname selec
5690: 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69 tion after recei
56a0: 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69 ving SNI extensi
56b0: 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20 on. *.in Client
56c0: 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66 Hello. Called af
56d0: 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 ter hello callba
56e0: 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c ck but before AL
56f0: 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a PN callback.. *.
5700: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
5710: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
5720: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
5730: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
5740: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
5750: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
5760: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a L_TLSEXT_ERR_OK:
5770: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 SNI hostname is
5780: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 accepted. The c
5790: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
57a0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ues.. *.SSL_TLSE
57b0: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 XT_ERR_ALERT_FAT
57c0: 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 AL: SNI hostname
57d0: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 is not accepted
57e0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
57f0: 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 . *. is abort
5800: 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 ed. Default for
5810: 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f alert is SSL_AD_
5820: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d UNRECOGNIZED_NAM
5830: 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 E.. *.SSL_TLSEXT
5840: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 _ERR_ALERT_WARNI
5850: 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 NG: SNI hostname
5860: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 is not accepted
5870: 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a , warning alert.
5880: 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 *. sent (not
5890: 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c supported in TL
58a0: 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e Sv1.3). The conn
58b0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
58c0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
58d0: 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 ERR_NOACK: SNI h
58e0: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 ostname is not a
58f0: 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 ccepted and not
5900: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a acknowledged,. *
5910: 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 . e.g. if SNI
5920: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f has not been co
5930: 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f nfigured. The co
5940: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
5950: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d es.. *. *-------
5960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
59a0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 .static int.SNIC
59b0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
59c0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
59d0: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
59e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
59f0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
5a00: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
5a10: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
5a20: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
5a30: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
5a40: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
5a50: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 , res;. const
5a60: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
5a70: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 e = NULL;.. d
5a80: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
5a90: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d ;.. if (ssl =
5aa0: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d = NULL || arg ==
5ab0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
5ac0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5ad0: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
5ae0: 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 /* Only works
5af0: 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 for TLS 1.2 and
5b00: 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 earlier */. s
5b10: 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f ervername = SSL_
5b20: 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 get_servername(s
5b30: 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 sl, TLSEXT_NAMET
5b40: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a YPE_host_name);.
5b50: 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e if (!servern
5b60: 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d ame || servernam
5b70: 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a e[0] == '\0') {.
5b80: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
5b90: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
5ba0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 }.. if (sta
5bb0: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 tePtr->vcmd == (
5bc0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b Tcl_Obj*)NULL) {
5bd0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
5be0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
5bf0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 }.. /* Create
5c00: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c command to eval
5c10: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 with fn, chan,
5c20: 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 and server name
5c30: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 args */. cmdP
5c40: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
5c50: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
5c60: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
5c70: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5c80: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5c90: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
5ca0: 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 gObj("sni", -1))
5cb0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
5cc0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5cd0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
5ce0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
5cf0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
5d00: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
5d10: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
5d20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5d30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5d40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
5d50: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 NewStringObj(ser
5d60: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a vername , -1));.
5d70: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
5d80: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
5d90: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
5da0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
5db0: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 if ((code = E
5dc0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
5dd0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
5de0: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 dPtr)) > 1) {..r
5df0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
5e00: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e ERR_ALERT_WARNIN
5e10: 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c G;..*alert = SSL
5e20: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 _AD_UNRECOGNIZED
5e30: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 _NAME; /* Not su
5e40: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 pported by TLS 1
5e50: 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 .3 */. } else
5e60: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
5e70: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
5e80: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
5e90: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
5ea0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5eb0: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c LERT_FATAL;..*al
5ec0: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 ert = SSL_AD_UNR
5ed0: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 ECOGNIZED_NAME;
5ee0: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 /* Not supported
5ef0: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 by TLS 1.3 */.
5f00: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
5f10: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
5f20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 );. return re
5f30: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d s;.}.../*. *----
5f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
5f80: 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c *. * ClientHell
5f90: 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c o Handshake Call
5fa0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 back for Servers
5fb0: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 --. *. *.Used b
5fc0: 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d y server to exam
5fd0: 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e ine the server n
5fe0: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 ame indication (
5ff0: 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 SNI) extension.
6000: 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 *.provided by th
6010: 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 e client in orde
6020: 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 r to select an a
6030: 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 ppropriate certi
6040: 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 ficate to. *.pre
6050: 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f sent, and make o
6060: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 ther configurati
6070: 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 on adjustments r
6080: 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 elevant to that
6090: 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 server. *.name a
60a0: 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 nd its configura
60b0: 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 tion. This inclu
60c0: 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 des swapping out
60d0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a the associated.
60e0: 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 *.SSL_CTX point
60f0: 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 er, modifying th
6100: 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 e server's list
6110: 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 of permitted TLS
6120: 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 versions,. *.ch
6130: 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 anging the serve
6140: 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 r's cipher list
6150: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 in response to t
6160: 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 he client's ciph
6170: 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a er list, etc.. *
6180: 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 .Called before S
6190: 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c NI and ALPN call
61a0: 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 backs.. *. * Res
61b0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
61c0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
61d0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
61e0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
61f0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
6200: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 des:. *.SSL_CLIE
6210: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 NT_HELLO_RETRY:
6220: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 suspend the hand
6230: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 shake, and the h
6240: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f andshake functio
6250: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d n will return im
6260: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c mediately. *.SSL
6270: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6280: 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 ROR: failure, te
6290: 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 rminate connecti
62a0: 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f on. Set alert to
62b0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 error code.. *.
62c0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
62d0: 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 _SUCCESS: succes
62e0: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d s. *. *---------
62f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
6330: 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 tatic int.HelloC
6340: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c allback(SSL *ssl
6350: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f , int *alert, vo
6360: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
6370: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
6380: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
6390: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
63a0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
63b0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
63c0: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
63d0: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
63e0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
63f0: 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 *servername;.
6400: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
6410: 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a char *p;. siz
6420: 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 e_t len, remaini
6430: 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 ng;.. dprintf
6440: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
6450: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
6460: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a cmd == (Tcl_Obj*
6470: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
6480: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6490: 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d O_SUCCESS;. }
64a0: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d else if (ssl ==
64b0: 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 (const SSL *)NU
64c0: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f LL || arg == (vo
64d0: 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 id *)NULL) {..re
64e0: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
64f0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
6500: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e }.. /* Get n
6510: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 ames */. if (
6520: 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c !SSL_client_hell
6530: 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 o_get0_ext(ssl,
6540: 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 TLSEXT_TYPE_serv
6550: 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 er_name, &p, &re
6560: 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 maining) || rema
6570: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a ining <= 2) {..*
6580: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 alert = SSL_R_SS
6590: 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 LV3_ALERT_ILLEGA
65a0: 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 L_PARAMETER;..re
65b0: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
65c0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
65d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 }.. /* Extra
65e0: 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 ct the length of
65f0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 the supplied li
6600: 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a st of names. */.
6610: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b len = (*(p++
6620: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e ) << 8);. len
6630: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 += *(p++);.
6640: 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 if (len + 2 != r
6650: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c emaining) {..*al
6660: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 ert = SSL_R_SSLV
6670: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 3_ALERT_ILLEGAL_
6680: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 PARAMETER;..retu
6690: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
66a0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
66b0: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d . remaining =
66c0: 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 len;.. /* Th
66d0: 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 e list in practi
66e0: 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 ce only has a si
66f0: 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f ngle element, so
6700: 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 we only conside
6710: 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e r the first one.
6720: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 */. if (rema
6730: 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 ining == 0 || *p
6740: 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d ++ != TLSEXT_NAM
6750: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 ETYPE_host_name)
6760: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
6770: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
6780: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
6790: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
67a0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
67b0: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
67c0: 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f ng--;.. /* No
67d0: 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 w we can finally
67e0: 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 pull out the by
67f0: 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 te array with th
6800: 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d e actual hostnam
6810: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 e. */. if (re
6820: 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a maining <= 2) {.
6830: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f .*alert = SSL_R_
6840: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 TLSV1_ALERT_INTE
6850: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 RNAL_ERROR;..ret
6860: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
6870: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
6880: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 }. len = (*(p
6890: 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c ++) << 8);. l
68a0: 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 en += *(p++);.
68b0: 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 if (len + 2 >
68c0: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 remaining) {..*a
68d0: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 lert = SSL_R_TLS
68e0: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 V1_ALERT_INTERNA
68f0: 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e L_ERROR;..return
6900: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6910: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 O_ERROR;. }.
6920: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c remaining = l
6930: 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 en;. serverna
6940: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 me = (const char
6950: 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 *)p;.. /* Cr
6960: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
6970: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 eval with fn, ch
6980: 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e an, and server n
6990: 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 ame args */.
69a0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
69b0: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
69c0: 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 tr->vcmd);. T
69d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
69e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
69f0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
6a00: 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 tringObj("hello"
6a10: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
6a20: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
6a30: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
6a40: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
6a50: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
6a60: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
6a70: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
6a80: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
6a90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
6aa0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
6ab0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
6ac0: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 bj(servername, (
6ad0: 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 3b Tcl_Size) len));
6ae0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
6af0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
6b00: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
6b10: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
6b20: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 if ((code =
6b30: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
6b40: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
6b50: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 mdPtr)) > 1) {..
6b60: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 res = SSL_CLIENT
6b70: 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a _HELLO_RETRY;..*
6b80: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c alert = SSL_R_TL
6b90: 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 SV1_ALERT_USER_C
6ba0: 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 ANCELLED;. }
6bb0: 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d else if (code ==
6bc0: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 1) {..res = SSL
6bd0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 _CLIENT_HELLO_SU
6be0: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 CCESS;. } els
6bf0: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 e {..res = SSL_C
6c00: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6c10: 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c R;..*alert = SSL
6c20: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
6c30: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 NTERNAL_ERROR;.
6c40: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
6c50: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
6c60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 );. return re
6c70: 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a s;.}.../********
6c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a ************/./*
6c90: 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 Commands
6ca0: 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./**********
6cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a **********/../*.
6cc0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
6cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d00: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 -----. *. * Ciph
6d10: 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 ersObjCmd -- lis
6d20: 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 t available ciph
6d30: 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 ers. *. *.This p
6d40: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
6d50: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 ked to process t
6d60: 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 he "tls::ciphers
6d70: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 " command. *.to
6d80: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 list available c
6d90: 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70 iphers, based up
6da0: 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 on protocol sele
6db0: 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 cted.. *. * Resu
6dc0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
6dd0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 rd Tcl result li
6de0: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 st.. *. * Side e
6df0: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 ffects:. *.const
6e00: 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f ructs and destro
6e10: 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 ys SSL context (
6e20: 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d CTX). *. *------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
6e70: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 /.static const c
6e80: 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d har *protocols[]
6e90: 20 3d 20 7b 0a 20 20 20 20 22 73 73 6c 32 22 2c = {. "ssl2",
6ea0: 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c "ssl3", "tls1",
6eb0: 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 "tls1.1", "tls1
6ec0: 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e .2", "tls1.3", N
6ed0: 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 ULL.};.enum prot
6ee0: 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 ocol {. TLS_S
6ef0: 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 SL2, TLS_SSL3, T
6f00: 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 LS_TLS1, TLS_TLS
6f10: 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 1_1, TLS_TLS1_2,
6f20: 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 TLS_TLS1_3, TLS
6f30: 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 _NONE.};..static
6f40: 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 int.CiphersObjC
6f50: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 md(. TCL_UNUS
6f60: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 ED(void *),.
6f70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
6f80: 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 rp,. int objc
6f90: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 ,. Tcl_Obj.*c
6fa0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 onst objv[]).{.
6fb0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
6fc0: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 tr = NULL;. S
6fd0: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 SL_CTX *ctx = NU
6fe0: 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c LL;. SSL *ssl
6ff0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 = NULL;. STA
7000: 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 CK_OF(SSL_CIPHER
7010: 29 20 2a 73 6b 3b 0a 20 20 20 20 63 6f 6e 73 74 ) *sk;. const
7020: 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 20 20 63 char *cp;. c
7030: 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b har buf[BUFSIZ];
7040: 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 . int index,
7050: 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 verbose = 0, use
7060: 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a _supported = 0;.
7070: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 const SSL_ME
7080: 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 THOD *method;..
7090: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
70a0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 ed");.. if ((
70b0: 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62 objc < 2) || (ob
70c0: 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f jc > 4)) {..Tcl_
70d0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
70e0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 erp, 1, objv, "p
70f0: 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 rotocol ?verbose
7100: 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b ? ?supported?");
7110: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7120: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
7130: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 (Tcl_GetIndexFr
7140: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
7150: 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 jv[1], protocols
7160: 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c , "protocol", 0,
7170: 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f &index) != TCL_
7180: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
7190: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
71a0: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 32 if ((objc > 2
71b0: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c ) && Tcl_GetBool
71c0: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 eanFromObj(inter
71d0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72 p, objv[2], &ver
71e0: 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 bose) != TCL_OK)
71f0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
7200: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
7210: 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 26 if ((objc > 3) &
7220: 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e & Tcl_GetBoolean
7230: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
7240: 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75 objv[3], &use_su
7250: 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c 5f pported) != TCL_
7260: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
7270: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
7280: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
7290: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 74 ror();.. swit
72a0: 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 ch ((enum protoc
72b0: 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 20 20 20 20 ol)index) {.
72c0: 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 09 case TLS_SSL2:..
72d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
72e0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
72f0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
7300: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
7310: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e rted", (char *)N
7320: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
7330: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 63 61 73 L_ERROR;. cas
7340: 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 e TLS_SSL3:.#if
7350: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
7360: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7370: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 SSL_NO_SSL3) ||
7380: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7390: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a NO_SSL3_METHOD).
73a0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
73b0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
73c0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
73d0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
73e0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
73f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7400: 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64 20 ;.#else..method
7410: 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 = SSLv3_method()
7420: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
7430: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 case TLS_TLS
7440: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 1:.#if defined(N
7450: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e O_TLS1) || defin
7460: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7470: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f S1) || defined(O
7480: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d PENSSL_NO_TLS1_M
7490: 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 ETHOD)..Tcl_Appe
74a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
74b0: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 protocols[index
74c0: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e ], ": protocol n
74d0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
74e0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
74f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7500: 0a 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d .#else..method =
7510: 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b TLSv1_method();
7520: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 break;.#endif.
7530: 20 20 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 case TLS_TLS1
7540: 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _1:.#if defined(
7550: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
7560: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7570: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
7580: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
7590: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 54 LS1_1_METHOD)..T
75a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
75b0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
75c0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
75d0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
75e0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 ted", (char *)NU
75f0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
7600: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 6d _ERROR;.#else..m
7610: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f ethod = TLSv1_1_
7620: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b method(); break;
7630: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 .#endif. case
7640: 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 TLS_TLS1_2:.#if
7650: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
7660: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
7670: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
7680: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
7690: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d NSSL_NO_TLS1_2_M
76a0: 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 ETHOD)..Tcl_Appe
76b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
76c0: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 protocols[index
76d0: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e ], ": protocol n
76e0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
76f0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
7700: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7710: 0a 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d .#else..method =
7720: 20 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 TLSv1_2_method(
7730: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
7740: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 54 4c . case TLS_TL
7750: 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 S1_3:.#if define
7760: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 d(NO_TLS1_3) ||
7770: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7780: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 54 63 6c 5f NO_TLS1_3)..Tcl_
7790: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
77a0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
77b0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
77c0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
77d0: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
77e0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
77f0: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 68 ROR;.#else..meth
7800: 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 od = TLS_method(
7810: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
7820: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f min_proto_versio
7830: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
7840: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 RSION);..SSL_CTX
7850: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 _set_max_proto_v
7860: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
7870: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 62 72 _3_VERSION);..br
7880: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
7890: 64 65 66 61 75 6c 74 3a 0a 09 6d 65 74 68 6f 64 default:..method
78a0: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b = TLS_method();
78b0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a ..break;. }..
78c0: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 ctx = SSL_CT
78d0: 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 X_new(method);.
78e0: 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 if (ctx == NU
78f0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
7900: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
7910: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
7920: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
7930: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7940: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 OR;. }.. s
7950: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 sl = SSL_new(ctx
7960: 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d );. if (ssl =
7970: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 = NULL) {..Tcl_A
7980: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7990: 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 rp, GET_ERR_REAS
79a0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 ON(), (char *)NU
79b0: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 LL);..SSL_CTX_fr
79c0: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e ee(ctx);..return
79d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
79e0: 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 }.. /* Use li
79f0: 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 st and order as
7a00: 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e would be sent in
7a10: 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f a ClientHello o
7a20: 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 r all available
7a30: 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 ciphers */. i
7a40: 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 f (use_supported
7a50: 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 ) {..sk = SSL_ge
7a60: 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 t1_supported_cip
7a70: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d hers(ssl);. }
7a80: 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 else {..sk = SS
7a90: 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 L_get_ciphers(ss
7aa0: 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 l);. }.. i
7ab0: 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b f (sk != NULL) {
7ac0: 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 ..if (!verbose)
7ad0: 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 {.. objPtr =
7ae0: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
7af0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f , NULL);.. fo
7b00: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 r (int i = 0; i
7b10: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f < sk_SSL_CIPHER_
7b20: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a num(sk); i++) {.
7b30: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 ..const SSL_CIPH
7b40: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 ER *c = sk_SSL_C
7b50: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 IPHER_value(sk,
7b60: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e i);...if (c == N
7b70: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a ULL) continue;..
7b80: 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65 ../* cipher name
7b90: 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 or (NONE) */...
7ba0: 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f cp = SSL_CIPHER_
7bb0: 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69 get_name(c);...i
7bc0: 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 f (cp == NULL) b
7bd0: 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 reak;...Tcl_List
7be0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
7bf0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
7c00: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
7c10: 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 j(cp, -1));..
7c20: 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 }...} else {..
7c30: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
7c40: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c NewStringObj("",
7c50: 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 0);.. for (in
7c60: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f t i = 0; i < sk_
7c70: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 SSL_CIPHER_num(s
7c80: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e k); i++) {...con
7c90: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 st SSL_CIPHER *c
7ca0: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 = sk_SSL_CIPHER
7cb0: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 _value(sk, i);..
7cc0: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 .if (c == NULL)
7cd0: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 continue;..../*
7ce0: 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 textual descript
7cf0: 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 ion of the ciphe
7d00: 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 r */...if (SSL_C
7d10: 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f IPHER_descriptio
7d20: 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 n(c, buf, sizeof
7d30: 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 (buf)) != NULL)
7d40: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {... Tcl_Appe
7d50: 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 ndToObj(objPtr,
7d60: 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 buf, (Tcl_Size)
7d70: 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 strlen(buf));...
7d80: 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 } else {... T
7d90: 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f cl_AppendToObj(o
7da0: 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c bjPtr, "UNKNOWN\
7db0: 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 n", 8);...}..
7dc0: 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 }..}..if (use_s
7dd0: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 upported) {..
7de0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 sk_SSL_CIPHER_f
7df0: 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 ree(sk);..}.
7e00: 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 }. SSL_free(s
7e10: 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 sl);. SSL_CTX
7e20: 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 _free(ctx);..
7e30: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
7e40: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
7e50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
7e60: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7eb0: 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f --. *. * Protoco
7ec0: 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 lsObjCmd -- list
7ed0: 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f available proto
7ee0: 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 cols. *. *.This
7ef0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
7f00: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
7f10: 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 the "tls::protoc
7f20: 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 ols" command. *.
7f30: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c to list availabl
7f40: 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a e protocols.. *.
7f50: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
7f60: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
7f70: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a sult list.. *. *
7f80: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
7f90: 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d *.none. *. *----
7fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7fe0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a */..static int.
7ff0: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 ProtocolsObjCmd(
8000: 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 . TCL_UNUSED(
8010: 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c void *),. Tcl
8020: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
8030: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 . int objc,.
8040: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 Tcl_Obj *cons
8050: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
8060: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
8070: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
8080: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
8090: 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 (objc != 1) {..
80a0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
80b0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
80c0: 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 , "");..return T
80d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
80e0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
80f0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a rror();.. obj
8100: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
8110: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a tObj(0, NULL);..
8120: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
8130: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
8140: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
8150: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
8160: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d PENSSL_NO_SSL3_M
8170: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c ETHOD). Tcl_L
8180: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
8190: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
81a0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
81b0: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
81c0: 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a LS_SSL3], -1));.
81d0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
81e0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 ned(NO_TLS1) &&
81f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
8200: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 _NO_TLS1) && !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 4d 45 54 48 4f 44 29 0a 20 20 _TLS1_METHOD).
8230: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
8240: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
8250: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
8260: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
8270: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c ocols[TLS_TLS1],
8280: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 -1));.#endif.#i
8290: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
82a0: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
82b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
82c0: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
82d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
82e0: 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 _1_METHOD). T
82f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
8300: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
8310: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
8320: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
8330: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 ls[TLS_TLS1_1],
8340: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 -1));.#endif.#if
8350: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
8360: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
8370: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
8380: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
8390: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
83a0: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 2_METHOD). Tc
83b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
83c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
83d0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
83e0: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
83f0: 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d s[TLS_TLS1_2], -
8400: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
8410: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
8420: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
8430: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
8440: 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 3). Tcl_ListO
8450: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
8460: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
8470: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
8480: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 (protocols[TLS_T
8490: 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 LS1_3], -1));.#e
84a0: 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 ndif.. Tcl_Se
84b0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
84c0: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
84d0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
84e0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
84f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
8530: 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d * HandshakeObjCm
8540: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 d --. *. *.This
8550: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 command is used
8560: 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 68 65 to verify whethe
8570: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 r the handshake
8580: 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f is complete. *.o
8590: 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 r not.. *. * Res
85a0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
85b0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 ard Tcl result.
85c0: 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 1 means handshak
85d0: 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 e complete, 0 me
85e0: 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a ans pending.. *.
85f0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
8600: 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 . *.May force SS
8610: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f L negotiation to
8620: 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a take place.. *.
8630: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
8640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8670: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
8680: 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f c int HandshakeO
8690: 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 bjCmd(. TCL_U
86a0: 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 NUSED(void *),.
86b0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
86c0: 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f nterp,. int o
86d0: 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a bjc,. Tcl_Obj
86e0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a *const objv[]).
86f0: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
8700: 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f l chan; /
8710: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
8720: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 set a mode on.
8730: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 */. State *st
8740: 61 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f atePtr; /
8750: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
8760: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
8770: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
8780: 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a *errStr = NULL;.
8790: 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b int ret = 1;
87a0: 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 . int err = 0
87b0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
87c0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
87d0: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
87e0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
87f0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
8800: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
8810: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
8820: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 );. }.. ER
8830: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
8840: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
8850: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
8860: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
8870: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c g(objv[1]), NULL
8880: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 );. if (chan
8890: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
88a0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
88b0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
88c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
88d0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
88e0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
88f0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
8900: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
8910: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 hannel(chan);.
8920: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 if (Tcl_GetCha
8930: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 nnelType(chan) !
8940: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 = Tls_ChannelTyp
8950: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 e()) {..Tcl_Appe
8960: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
8970: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
8980: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
8990: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 lName(chan),..."
89a0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
89b0: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 annel", (char *)
89c0: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 NULL);..Tcl_SetE
89d0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
89e0: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 "TLS", "HANDSHA
89f0: 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 KE", "CHANNEL",
8a00: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 "INVALID", (char
8a10: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *)NULL);..retur
8a20: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
8a30: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 }. statePtr
8a40: 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f = (State *)Tcl_
8a50: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
8a60: 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 ceData(chan);..
8a70: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
8a80: 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 ing Tls_WaitForC
8a90: 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 onnect");. re
8aa0: 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 t = Tls_WaitForC
8ab0: 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c onnect(statePtr,
8ac0: 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 &err, 1);. d
8ad0: 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 printf("Tls_Wait
8ae0: 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 ForConnect retur
8af0: 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a ned: %i", ret);.
8b00: 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 . if (ret < 0
8b10: 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e && ((statePtr->
8b20: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
8b30: 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d ASYNC) && (err =
8b40: 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 = EAGAIN))) {..d
8b50: 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 printf("Async se
8b60: 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 t and err = EAGA
8b70: 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a IN");..ret = 0;.
8b80: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 } else if (r
8b90: 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 et < 0) {..long
8ba0: 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 result;..errStr
8bb0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b = statePtr->err;
8bc0: 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c ..Tcl_ResetResul
8bd0: 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f t(interp);..Tcl_
8be0: 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a SetErrno(err);..
8bf0: 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 .if (!errStr ||
8c00: 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 (*errStr == 0))
8c10: 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 {.. errStr =
8c20: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 Tcl_PosixError(i
8c30: 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c nterp);..}...Tcl
8c40: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
8c50: 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 terp, "handshake
8c60: 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 failed: ", errS
8c70: 74 72 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c tr, (char *)NULL
8c80: 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 );..if ((result
8c90: 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 = SSL_get_verify
8ca0: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 _result(statePtr
8cb0: 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f ->ssl)) != X509_
8cc0: 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c V_OK) {.. Tcl
8cd0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
8ce0: 74 65 72 70 2c 20 22 20 64 75 65 20 74 6f 20 5c terp, " due to \
8cf0: 22 22 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f "", X509_verify_
8d00: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e cert_error_strin
8d10: 67 28 72 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c g(result), "\"",
8d20: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
8d30: 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 .}..Tcl_SetError
8d40: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
8d50: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c S", "HANDSHAKE",
8d60: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
8d70: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e *)NULL);..dprin
8d80: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 tf("Returning TC
8d90: 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e L_ERROR with han
8da0: 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 dshake failed: %
8db0: 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 s", errStr);..re
8dc0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
8dd0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 . } else {..i
8de0: 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 f (err != 0) {..
8df0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 dprintf("Got
8e00: 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 an error with a
8e10: 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 completed hands
8e20: 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c hake: err = %i",
8e30: 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d err);..}..ret =
8e40: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 1;. }.. d
8e50: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
8e60: 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 g TCL_OK with da
8e70: 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 ta \"%i\"", ret)
8e80: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a ;. Tcl_SetObj
8e90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
8ea0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 cl_NewIntObj(ret
8eb0: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 ));. return(T
8ec0: 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a CL_OK);.}../*. *
8ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f10: 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 ---. *. * Import
8f20: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
8f30: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
8f40: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
8f50: 63 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 cess the "ssl" c
8f60: 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 ommand. *. *.The
8f70: 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 ssl command pus
8f80: 68 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 hes SSL over a (
8f90: 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 newly connected)
8fa0: 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 tcp socket. *.
8fb0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
8fc0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
8fd0: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
8fe0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
8ff0: 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 modify the behav
9000: 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 ior of an IO cha
9010: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nnel.. *. *-----
9020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
9060: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 */..static int.I
9070: 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 0a 20 20 20 mportObjCmd(.
9080: 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 TCL_UNUSED(void
9090: 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 *),. Tcl_Int
90a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 erp *interp,.
90b0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 int objc,. T
90c0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
90d0: 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f jv[]).{. Tcl_
90e0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f Channel chan;../
90f0: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
9100: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 set a mode on.
9110: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 */. State *st
9120: 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 atePtr;../* clie
9130: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c nt state for ssl
9140: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 socket */. S
9150: 53 4c 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e SL_CTX *ctx..= N
9160: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
9170: 20 2a 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c *script..= NULL
9180: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 ;. Tcl_Obj *p
9190: 61 73 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b assword..= NULL;
91a0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 . Tcl_Obj *vc
91b0: 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 md..= NULL;.
91c0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 Tcl_DString uppe
91d0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
91e0: 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ion, upperChanne
91f0: 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 lBlocking, upper
9200: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c ChannelEncoding,
9210: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 upperChannelEOF
9220: 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 Char;. int id
9230: 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 x;. Tcl_Size
9240: 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 len;. int fla
9250: 67 73 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 gs...= TLS_TCL_I
9260: 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 NIT;. int ser
9270: 76 65 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 ver...= 0;./* is
9280: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f connection inco
9290: 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 ming or outgoing
92a0: 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b ? */. char *k
92b0: 65 79 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a eyfile..= NULL;.
92c0: 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 char *certfi
92d0: 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 le..= NULL;.
92e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
92f0: 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ey..= NULL;.
9300: 54 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e Tcl_Size key_len
9310: 09 09 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 ..= 0;. unsig
9320: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 ned char *cert..
9330: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
9340: 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d Size cert_len..=
9350: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 0;. char *ci
9360: 70 68 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 phers..= NULL;.
9370: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 char *ciphers
9380: 75 69 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 uites..= NULL;.
9390: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 char *CAfile.
93a0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 .= NULL;. cha
93b0: 72 20 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c r *CApath..= NUL
93c0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 L;. char *DHp
93d0: 61 72 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 arams..= NULL;.
93e0: 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 char *model..
93f0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 .= NULL;. cha
9400: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d r *servername..=
9410: 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 NULL;./* hostna
9420: 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 me for Server Na
9430: 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f me Indication */
9440: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
9450: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
9460: 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 n_id = NULL;.
9470: 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 Tcl_Obj *alpn..
9480: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
9490: 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d ssl2 = 0, ssl3 =
94a0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 0;. int tls1
94b0: 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 = 1, tls1_1 = 1
94c0: 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c , tls1_2 = 1, tl
94d0: 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e s1_3 = 1;. in
94e0: 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 t proto = 0, lev
94f0: 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 el = -1;. int
9500: 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 verify = 0, req
9510: 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 uire = 0, reques
9520: 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 t = 1, post_hand
9530: 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 20 shake = 0;..
9540: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
9550: 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 );..#if defined(
9560: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 NO_TLS1) || defi
9570: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
9580: 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 LS1). tls1 =
9590: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
95a0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
95b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
95c0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 SSL_NO_TLS1_1).
95d0: 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 tls1_1 = 0;.#
95e0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
95f0: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 d(NO_TLS1_2) ||
9600: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
9610: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 NO_TLS1_2). t
9620: 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 ls1_2 = 0;.#endi
9630: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
9640: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 _TLS1_3) || defi
9650: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
9660: 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f LS1_3). tls1_
9670: 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 3 = 0;.#endif..
9680: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 if (objc < 2)
9690: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
96a0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
96b0: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f objv, "channel ?
96c0: 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 options?");..ret
96d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
96e0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
96f0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
9700: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
9710: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
9720: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
9730: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 jv[1]), NULL);.
9740: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
9750: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
9760: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
9770: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
9780: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b /*. * Mak
9790: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
97a0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
97b0: 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f channel. */
97c0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
97d0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
97e0: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 an);.. for (i
97f0: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 dx = 2; idx < ob
9800: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 jc; idx++) {..ch
9810: 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 ar *opt = Tcl_Ge
9820: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64 78 tString(objv[idx
9830: 5d 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d ]);...if (opt[0]
9840: 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 != '-').. br
9850: 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d eak;...OPTOBJ("-
9860: 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f alpn", alpn);..O
9870: 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20 PTSTR("-cadir",
9880: 43 41 70 61 74 68 29 3b 0a 09 4f 50 54 53 54 52 CApath);..OPTSTR
9890: 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 ("-cafile", CAfi
98a0: 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d le);..OPTBYTE("-
98b0: 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72 cert", cert, cer
98c0: 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 t_len);..OPTSTR(
98d0: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 "-certfile", cer
98e0: 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 tfile);..OPTSTR(
98f0: 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 "-cipher", ciphe
9900: 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 rs);..OPTSTR("-c
9910: 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 iphers", ciphers
9920: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 );..OPTSTR("-cip
9930: 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 hersuites", ciph
9940: 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f ersuites);..OPTO
9950: 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 BJ("-command", s
9960: 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 cript);..OPTSTR(
9970: 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 "-dhparams", DHp
9980: 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45 arams);..OPTBYTE
9990: 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 ("-key", key, ke
99a0: 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 y_len);..OPTSTR(
99b0: 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 "-keyfile", keyf
99c0: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
99d0: 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a model", model);.
99e0: 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f .OPTOBJ("-passwo
99f0: 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a rd", password);.
9a00: 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f .OPTBOOL("-post_
9a10: 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 handshake", post
9a20: 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 _handshake);..OP
9a30: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 TBOOL("-request"
9a40: 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 , request);..OPT
9a50: 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c BOOL("-require",
9a60: 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49 require);..OPTI
9a70: 4e 54 28 22 2d 73 65 63 75 72 69 74 79 5f 6c 65 NT("-security_le
9a80: 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f vel", level);..O
9a90: 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 PTBOOL("-server"
9aa0: 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 , server);..OPTS
9ab0: 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 TR("-servername"
9ac0: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 , servername);..
9ad0: 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e OPTSTR("-session
9ae0: 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 _id", session_id
9af0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 );..OPTBOOL("-ss
9b00: 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 l2", ssl2);..OPT
9b10: 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 BOOL("-ssl3", ss
9b20: 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d l3);..OPTBOOL("-
9b30: 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f tls1", tls1);..O
9b40: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 PTBOOL("-tls1.1"
9b50: 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 , tls1_1);..OPTB
9b60: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 OOL("-tls1.2", t
9b70: 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c ls1_2);..OPTBOOL
9b80: 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 ("-tls1.3", tls1
9b90: 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 _3);..OPTOBJ("-v
9ba0: 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c alidatecommand",
9bb0: 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 vcmd);..OPTOBJ(
9bc0: 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a "-vcmd", vcmd);.
9bd0: 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e ..OPTBAD("option
9be0: 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 ", "-alpn, -cadi
9bf0: 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 r, -cafile, -cer
9c00: 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 t, -certfile, -c
9c10: 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 ipher, -ciphersu
9c20: 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 ites, -command,
9c30: 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c -dhparams, -key,
9c40: 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 -keyfile, -mode
9c50: 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 l, -password, -p
9c60: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d ost_handshake, -
9c70: 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 request, -requir
9c80: 65 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 e, -security_lev
9c90: 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 el, -server, -se
9ca0: 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 rvername, -sessi
9cb0: 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 on_id, -ssl2, -s
9cc0: 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 sl3, -tls1, -tls
9cd0: 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 1.1, -tls1.2, -t
9ce0: 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 ls1.3, or -valid
9cf0: 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 atecommand");...
9d00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
9d10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
9d20: 72 65 71 75 65 73 74 29 09 20 20 20 20 76 65 72 request). ver
9d30: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
9d40: 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 Y_CLIENT_ONCE |
9d50: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b SSL_VERIFY_PEER;
9d60: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 . if (request
9d70: 20 26 26 20 72 65 71 75 69 72 65 29 20 76 65 72 && require) ver
9d80: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
9d90: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 Y_FAIL_IF_NO_PEE
9da0: 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 R_CERT;. if (
9db0: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f request && post_
9dc0: 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 handshake).verif
9dd0: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
9de0: 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a POST_HANDSHAKE;.
9df0: 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d if (verify =
9e00: 3d 20 30 29 09 76 65 72 69 66 79 20 3d 20 53 53 = 0).verify = SS
9e10: 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a L_VERIFY_NONE;..
9e20: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 proto |= (ss
9e30: 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 l2 ? TLS_PROTO_S
9e40: 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 SL2 : 0);. pr
9e50: 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 oto |= (ssl3 ? T
9e60: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 LS_PROTO_SSL3 :
9e70: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
9e80: 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f (tls1 ? TLS_PRO
9e90: 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 TO_TLS1 : 0);.
9ea0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
9eb0: 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _1 ? TLS_PROTO_T
9ec0: 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 LS1_1 : 0);.
9ed0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 proto |= (tls1_2
9ee0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
9ef0: 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 1_2 : 0);. pr
9f00: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f oto |= (tls1_3 ?
9f10: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
9f20: 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 3 : 0);.. /*
9f30: 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 reset to NULL if
9f40: 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 blank string pr
9f50: 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 ovided */. if
9f60: 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 (cert && !*cert
9f70: 29 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09 ).. cert.
9f80: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
9f90: 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 if (key && !
9fa0: 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b *key).. k
9fb0: 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c ey. = NUL
9fc0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 L;. if (certf
9fd0: 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c ile && !*certfil
9fe0: 65 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66 e) certf
9ff0: 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ile.= NULL;.
a000: 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 if (keyfile && !
a010: 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 *keyfile)..keyfi
a020: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c le. = NUL
a030: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 L;. if (ciphe
a040: 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 rs && !*ciphers)
a050: 09 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73 . ciphers
a060: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
a070: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 . if (ciphers
a080: 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 uites && !*ciphe
a090: 72 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73 rsuites) ciphers
a0a0: 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b uites = NULL;
a0b0: 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 . if (CAfile
a0c0: 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 && !*CAfile).
a0d0: 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 CAfile.
a0e0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a0f0: 69 66 20 28 43 41 70 61 74 68 20 26 26 20 21 2a if (CApath && !*
a100: 43 41 70 61 74 68 29 09 20 20 20 20 20 20 20 20 CApath).
a110: 43 41 70 61 74 68 09 20 20 20 20 20 20 20 20 3d CApath. =
a120: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 NULL;. if (D
a130: 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 Hparams && !*DHp
a140: 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 arams). D
a150: 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d Hparams =
a160: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e NULL;.. /* n
a170: 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a ew SSL state */.
a180: 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 statePtr..=
a190: 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f (State *) ckallo
a1a0: 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a c((unsigned) siz
a1b0: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 eof(State));.
a1c0: 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 memset(statePtr
a1d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 , 0, sizeof(Stat
a1e0: 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 e));.. stateP
a1f0: 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 tr->flags.= flag
a200: 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d s;. statePtr-
a210: 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 >interp.= interp
a220: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
a230: 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b vflags.= verify;
a240: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 . statePtr->e
a250: 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a rr.= "";.. /*
a260: 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 allocate script
a270: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 */. if (scri
a280: 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 pt) {..(void) Tc
a290: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
a2a0: 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 bj(script, &len)
a2b0: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 ;..if (len) {..
a2c0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c statePtr->cal
a2d0: 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a lback = script;.
a2e0: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
a2f0: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
a300: 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 callback);..}.
a310: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f }.. /* allo
a320: 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f cate password */
a330: 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 . if (passwor
a340: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c d) {..(void) Tcl
a350: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
a360: 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e j(password, &len
a370: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
a380: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 statePtr->pa
a390: 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 ssword = passwor
a3a0: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 d;.. Tcl_Incr
a3b0: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
a3c0: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d r->password);..}
a3d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 . }.. /* a
a3e0: 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 llocate validate
a3f0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
a400: 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f if (vcmd) {..(vo
a410: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e id) Tcl_GetStrin
a420: 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 gFromObj(vcmd, &
a430: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 len);..if (len)
a440: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d {.. statePtr-
a450: 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 >vcmd = vcmd;..
a460: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
a470: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 unt(statePtr->vc
a480: 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 md);..}. }..
a490: 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 if (model !=
a4a0: 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 NULL) {..int mod
a4b0: 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 e;../* Get the "
a4c0: 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a model" context *
a4d0: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
a4e0: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
a4f0: 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a model, &mode);.
a500: 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 .if (chan == (Tc
a510: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
a520: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
a530: 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 ((void *)statePt
a540: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
a550: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
a560: 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 /*.. * Make sure
a570: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
a580: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
a590: 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 el.. */..chan =
a5a0: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
a5b0: 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 l(chan);..if (Tc
a5c0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
a5d0: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
a5e0: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
a5f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
a600: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
a610: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
a620: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
a630: 65 28 63 68 61 6e 29 2c 0a 09 09 20 20 20 20 22 e(chan),... "
a640: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
a650: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 annel", (char *)
a660: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
a670: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
a680: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
a690: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c ORT", "CHANNEL",
a6a0: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
a6b0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 r *)NULL);..
a6c0: 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a Tls_Free((void *
a6d0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 )statePtr);..
a6e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
a6f0: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 R;..}..ctx = ((S
a700: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
a710: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
a720: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 a(chan))->ctx;.
a730: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
a740: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 ((ctx = CTX_Init
a750: 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 (statePtr, serve
a760: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c r, proto, keyfil
a770: 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 e, certfile, key
a780: 2c 20 63 65 72 74 2c 20 28 69 6e 74 29 20 6b 65 , cert, (int) ke
a790: 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e 74 y_len,.. (int
a7a0: 29 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61 ) cert_len, CApa
a7b0: 74 68 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 th, CAfile, ciph
a7c0: 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 ers, ciphersuite
a7d0: 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 s, level, DHpara
a7e0: 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a ms)) == NULL) {.
a7f0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76 . Tls_Free((v
a800: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
a810: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
a820: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
a830: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
a840: 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 ctx = ctx;..
a850: 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 /*. * We nee
a860: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 d to make sure t
a870: 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 hat the channel
a880: 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 works in binary
a890: 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 (for the. *
a8a0: 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 encryption not t
a8b0: 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 o get goofed up)
a8c0: 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 .. * We only
a8d0: 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 want to adjust
a8e0: 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e the buffering in
a8f0: 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 pre-v2 channels
a900: 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 , where. * e
a910: 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 ach channel in t
a920: 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 he stack maintai
a930: 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 ned its own buff
a940: 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ers.. */.
a950: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
a960: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 (&upperChannelTr
a970: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 anslation);.
a980: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
a990: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
a9a0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f cking);. 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 45 4f 46 43 68 61 72 erChannelEOFChar
a9d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
a9e0: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
a9f0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 nnelEncoding);.
aa00: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
aa10: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
aa20: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 chan, "-eofchar"
aa30: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 , &upperChannelE
aa40: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c OFChar);. Tcl
aa50: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
aa60: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
aa70: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 "-encoding", &up
aa80: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
aa90: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ng);. Tcl_Get
aaa0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
aab0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 terp, chan, "-tr
aac0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 anslation", &upp
aad0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
aae0: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 tion);. Tcl_G
aaf0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
ab00: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
ab10: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 blocking", &uppe
ab20: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
ab30: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
ab40: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
ab50: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e rp, chan, "-tran
ab60: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 slation", "binar
ab70: 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 y");. Tcl_Set
ab80: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
ab90: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c terp, chan, "-bl
aba0: 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 ocking", "true")
abb0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 ;. dprintf("C
abc0: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 onsuming Tcl cha
abd0: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 nnel %s", Tcl_Ge
abe0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
abf0: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 n));. statePt
ac00: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 r->self = Tcl_St
ac10: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 ackChannel(inter
ac20: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 p, Tls_ChannelTy
ac30: 70 65 28 29 2c 20 73 74 61 74 65 50 74 72 2c 20 pe(), statePtr,
ac40: 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 (TCL_READABLE |
ac50: 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 TCL_WRITABLE), c
ac60: 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 han);. dprint
ac70: 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e f("Created chann
ac80: 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 el named %s", Tc
ac90: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
aca0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
acb0: 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 );. if (state
acc0: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 Ptr->self == (Tc
acd0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
ace0: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 {../*.. * No us
acf0: 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 e of Tcl_Eventua
ad00: 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20 llyFree because
ad10: 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f no possible Tcl_
ad20: 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 Preserve... */..
ad30: 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a Tls_Free((void *
ad40: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 )statePtr);..ret
ad50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
ad60: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 }.. Tcl_Se
ad70: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
ad80: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
ad90: 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 >self, "-transla
ada0: 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 tion", Tcl_DStri
adb0: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
adc0: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
add0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ));. Tcl_SetC
ade0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
adf0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
ae00: 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 elf, "-encoding"
ae10: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
ae20: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
ae30: 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 Encoding));.
ae40: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
ae50: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
ae60: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 tePtr->self, "-e
ae70: 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 ofchar", Tcl_DSt
ae80: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
ae90: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 ChannelEOFChar))
aea0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
aeb0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
aec0: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
aed0: 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 f, "-blocking",
aee0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
aef0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c (&upperChannelBl
af00: 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 ocking));. Tc
af10: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 l_DStringFree(&u
af20: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
af30: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c lation);. Tcl
af40: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 _DStringFree(&up
af50: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
af60: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ng);. Tcl_DSt
af70: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 ringFree(&upperC
af80: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a hannelEOFChar);.
af90: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
afa0: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 ree(&upperChanne
afb0: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 lBlocking);..
afc0: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 /*. * SSL I
afd0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 nitialization.
afe0: 20 20 20 2a 2f 0a 0a 20 20 20 20 73 74 61 74 65 */.. state
aff0: 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e Ptr->ssl = SSL_n
b000: 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ew(statePtr->ctx
b010: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 );. if (!stat
b020: 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a ePtr->ssl) {../*
b030: 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 SSL library err
b040: 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e or */..Tcl_Appen
b050: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
b060: 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 "couldn't constr
b070: 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a uct ssl session:
b080: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 ", GET_ERR_REAS
b090: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 ON(), (char *)NU
b0a0: 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 LL);..Tcl_SetErr
b0b0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
b0c0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
b0d0: 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22 "INIT", "FAILED"
b0e0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
b0f0: 0a 09 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 ..Tls_Free((void
b100: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 72 *)statePtr);..r
b110: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
b120: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
b130: 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e et host server n
b140: 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 ame */. if (s
b150: 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a ervername) {../*
b160: 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72 Sets the server
b170: 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e name indication
b180: 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 (SNI) in Client
b190: 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 Hello extension
b1a0: 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 */../* Per RFC 6
b1b0: 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 066, hostname is
b1c0: 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 a ASCII encoded
b1d0: 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 string, though
b1e0: 52 46 43 20 34 33 36 36 20 73 61 79 73 20 55 54 RFC 4366 says UT
b1f0: 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 F-8. */..if (!SS
b200: 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 L_set_tlsext_hos
b210: 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d t_name(statePtr-
b220: 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 >ssl, servername
b230: 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a ) && require) {.
b240: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
b250: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
b260: 65 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e et SNI extension
b270: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f failed: ", GET_
b280: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
b290: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 har *)NULL);..
b2a0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
b2b0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
b2c0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 , "IMPORT", "SNI
b2d0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
b2e0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 ar *)NULL);..
b2f0: 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 Tls_Free((void
b300: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 *)statePtr);..
b310: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
b320: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 OR;..}.../* Set
b330: 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 hostname for pee
b340: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 68 6f r certificate ho
b350: 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 stname verificat
b360: 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a ion in clients..
b370: 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 . Don't use SS
b380: 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 L_set1_host sinc
b390: 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 e it has limitat
b3a0: 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 ions. */..if (!S
b3b0: 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 SL_add1_host(sta
b3c0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 tePtr->ssl, serv
b3d0: 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 ername)) {..
b3e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
b3f0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 44 4e (interp, "Set DN
b400: 53 20 68 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65 S hostname faile
b410: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 d: ", GET_ERR_RE
b420: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
b430: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
b440: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
b450: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
b460: 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 ORT", "HOSTNAME"
b470: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
b480: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 r *)NULL);..
b490: 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a Tls_Free((void *
b4a0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 )statePtr);..
b4b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
b4c0: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 R;..}. }..
b4d0: 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69 /* Resume sessi
b4e0: 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 on id */. if
b4f0: 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 (session_id && s
b500: 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 trlen(session_id
b510: 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 ) <= SSL_MAX_SID
b520: 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 _CTX_LENGTH) {..
b530: 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 /* SSL_set_sessi
b540: 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 on() */..if (!SS
b550: 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 L_SESSION_set1_i
b560: 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 d_context(SSL_ge
b570: 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50 t_session(stateP
b580: 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f tr->ssl), sessio
b590: 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 n_id, (unsigned
b5a0: 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 int) strlen(sess
b5b0: 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 ion_id))) {..
b5c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
b5d0: 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d t(interp, "Resum
b5e0: 65 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64 e session failed
b5f0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
b600: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e SON(), (char *)N
b610: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
b620: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
b630: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
b640: 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 RT", "SESSION",
b650: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
b660: 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c *)NULL);.. Tl
b670: 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 s_Free((void *)s
b680: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
b690: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
b6a0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
b6b0: 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 * Enable Applica
b6c0: 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f tion-Layer Proto
b6d0: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e col Negotiation.
b6e0: 20 45 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 Examples are: h
b6f0: 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 ttp/1.0,..http/1
b700: 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c .1, h2, h3, ftp,
b710: 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 imap, pop3, xmp
b720: 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 p-client, xmpp-s
b730: 65 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 erver, mqtt, irc
b740: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 , etc. */. if
b750: 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f (alpn) {../* Co
b760: 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 nvert a TCL list
b770: 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c into a protocol
b780: 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f -list in wire-fo
b790: 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 rmat */..unsigne
b7a0: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 d char *protos,
b7b0: 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e *p;..unsigned in
b7c0: 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 t protos_len = 0
b7d0: 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c ;..Tcl_Size cnt,
b7e0: 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c i;..int j;..Tcl
b7f0: 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 _Obj **list;...i
b800: 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 f (Tcl_ListObjGe
b810: 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 tElements(interp
b820: 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c , alpn, &cnt, &l
b830: 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ist) != TCL_OK)
b840: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 {.. Tls_Free(
b850: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
b860: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
b870: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
b880: 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 * Determine the
b890: 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 memory required
b8a0: 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c for the protocol
b8b0: 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 -list */..for (i
b8c0: 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 = 0; i < cnt; i
b8d0: 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 ++) {.. Tcl_G
b8e0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
b8f0: 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a list[i], &len);.
b900: 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 . if (len > 2
b910: 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 55) {...Tcl_Appe
b920: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
b930: 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 "ALPN protocol
b940: 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f 6e 67 22 2c names too long",
b950: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
b960: 09 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
b970: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
b980: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 , "IMPORT", "ALP
b990: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 N", "FAILED", (c
b9a0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 54 har *)NULL);...T
b9b0: 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 ls_Free((void *)
b9c0: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 statePtr);...ret
b9d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
b9e0: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f }.. proto
b9f0: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e s_len += 1 + (in
ba00: 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 t) len;..}.../*
ba10: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 Build the comple
ba20: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 te protocol-list
ba30: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b */..protos = ck
ba40: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e alloc(protos_len
ba50: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d );../* protocol-
ba60: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 lists consist of
ba70: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 8-bit length-pr
ba80: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 efixed, byte str
ba90: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 ings */..for (j
baa0: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b = 0, p = protos;
bab0: 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b j < cnt; j++) {
bac0: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 .. char *str
bad0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
bae0: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 romObj(list[j],
baf0: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b &len);.. *p++
bb00: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 = (unsigned cha
bb10: 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d r) len;.. mem
bb20: 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a cpy(p, str, (siz
bb30: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 e_t) len);..
bb40: 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f p += len;..}.../
bb50: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 * SSL_set_alpn_p
bb60: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f rotos makes a co
bb70: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 py of the protoc
bb80: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e ol-list */../* N
bb90: 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 ote: This functi
bba0: 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 65 ons reverses the
bbb0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f return value co
bbc0: 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 nvention */..if
bbd0: 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 (SSL_set_alpn_pr
bbe0: 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 otos(statePtr->s
bbf0: 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 sl, protos, prot
bc00: 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 os_len)) {..
bc10: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
bc20: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c (interp, "Set AL
bc30: 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 PN protocols fai
bc40: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f led: ", GET_ERR_
bc50: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
bc60: 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 *)NULL);.. Tc
bc70: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
bc80: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
bc90: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 MPORT", "ALPN",
bca0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
bcb0: 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c *)NULL);.. Tl
bcc0: 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 s_Free((void *)s
bcd0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 tatePtr);.. c
bce0: 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 kfree(protos);..
bcf0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
bd00: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 RROR;..}.../* St
bd10: 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 ore protocols li
bd20: 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d st */..statePtr-
bd30: 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 >protos = protos
bd40: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f ;..statePtr->pro
bd50: 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 tos_len = protos
bd60: 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 _len;. } else
bd70: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 {..statePtr->pr
bd80: 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 otos = NULL;..st
bd90: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c atePtr->protos_l
bda0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 en = 0;. }..
bdb0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c /*. * SSL
bdc0: 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 Callbacks.
bdd0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 */. SSL_set_a
bde0: 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 pp_data(statePtr
bdf0: 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 ->ssl, (void *)s
be00: 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 tatePtr);./* poi
be10: 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f nt back to us */
be20: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 . SSL_set_ver
be30: 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ify(statePtr->ss
be40: 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 l, verify, Verif
be50: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 yCallback);.
be60: 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c SSL_set_info_cal
be70: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e lback(statePtr->
be80: 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 ssl, InfoCallbac
be90: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c k);.. /* Call
bea0: 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 back for observi
beb0: 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 ng protocol mess
bec0: 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 ages */.#ifndef
bed0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 OPENSSL_NO_SSL_T
bee0: 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 RACE. /* void
bef0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 SSL_CTX_set_msg
bf00: 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 _callback_arg(st
bf10: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f atePtr->ctx, (vo
bf20: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
bf30: 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 void SSL_CTX
bf40: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
bf50: 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c k(statePtr->ctx,
bf60: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b MessageCallback
bf70: 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 ); */. SSL_se
bf80: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 t_msg_callback_a
bf90: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c rg(statePtr->ssl
bfa0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
bfb0: 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 tr);. SSL_set
bfc0: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 _msg_callback(st
bfd0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 atePtr->ssl, Mes
bfe0: 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 sageCallback);.#
bff0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 endif.. /* Cr
c000: 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c eate Tcl_Channel
c010: 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a BIO Handler */.
c020: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f statePtr->p_
c030: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 bio.= BIO_new_tc
c040: 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f l(statePtr, BIO_
c050: 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 NOCLOSE);. st
c060: 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 atePtr->bio.= BI
c070: 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 O_new(BIO_f_ssl(
c080: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 ));.. if (ser
c090: 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 ver) {../* Serve
c0a0: 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 r callbacks */..
c0b0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 SSL_CTX_set_tlse
c0c0: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 xt_servername_ar
c0d0: 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c g(statePtr->ctx,
c0e0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
c0f0: 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 r);..SSL_CTX_set
c100: 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 _tlsext_serverna
c110: 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 me_callback(stat
c120: 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 ePtr->ctx, SNICa
c130: 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 llback);..SSL_CT
c140: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c X_set_client_hel
c150: 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e lo_cb(statePtr->
c160: 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 ctx, HelloCallba
c170: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
c180: 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 ePtr);..if (stat
c190: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
c1a0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c NULL) {.. SSL
c1b0: 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 _CTX_set_alpn_se
c1c0: 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 lect_cb(statePtr
c1d0: 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 ->ctx, ALPNCallb
c1e0: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
c1f0: 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 tePtr);.#ifdef U
c200: 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 SE_NPN.. if (
c210: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 tls1_2 == 0 && t
c220: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 ls1_3 == 0) {...
c230: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 SSL_CTX_set_next
c240: 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 _protos_advertis
c250: 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ed_cb(statePtr->
c260: 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b ctx, NPNCallback
c270: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
c280: 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 tr);.. }.#end
c290: 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c if..}.../* Enabl
c2a0: 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 e server to send
c2b0: 20 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66 cert request af
c2c0: 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 ter handshake (T
c2d0: 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a LS 1.3 only) */.
c2e0: 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 ./* A write oper
c2f0: 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 ation must take
c300: 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 place for the Ce
c310: 72 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73 rtificate Reques
c320: 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 t to be.. sent
c330: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 to the client,
c340: 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 this can be done
c350: 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e with SSL_do_han
c360: 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 dshake(). */..if
c370: 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 (request && pos
c380: 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 t_handshake && t
c390: 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 ls1_3) {.. SS
c3a0: 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f L_verify_client_
c3b0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 post_handshake(s
c3c0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 tatePtr->ssl);..
c3d0: 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d }.../* set autom
c3e0: 61 74 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 atic curve selec
c3f0: 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 tion */..SSL_set
c400: 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 _ecdh_auto(state
c410: 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 Ptr->ssl, 1);...
c420: 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f /* Set server mo
c430: 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d de */..statePtr-
c440: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 >flags |= TLS_TC
c450: 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 L_SERVER;..SSL_s
c460: 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 et_accept_state(
c470: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
c480: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a } else {../*
c490: 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b Client callback
c4a0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f s */.#ifdef USE_
c4b0: 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 NPN..if (statePt
c4c0: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c r->protos != NUL
c4d0: 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 L && tls1_2 == 0
c4e0: 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 && tls1_3 == 0)
c4f0: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f {.. SSL_CTX_
c500: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 set_next_proto_s
c510: 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 elect_cb(statePt
c520: 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c r->ctx, ALPNCall
c530: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 back, (void *)st
c540: 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 atePtr);..}.#end
c550: 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 if.../* Session
c560: 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f caching */..SSL_
c570: 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f CTX_set_session_
c580: 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 cache_mode(state
c590: 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 Ptr->ctx, SSL_SE
c5a0: 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 SS_CACHE_CLIENT
c5b0: 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 | SSL_SESS_CACHE
c5c0: 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f _NO_INTERNAL_STO
c5d0: 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 RE);..SSL_CTX_se
c5e0: 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 ss_set_new_cb(st
c5f0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 atePtr->ctx, Ses
c600: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a sionCallback);..
c610: 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 ./* Enable post
c620: 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e handshake Authen
c630: 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 tication extensi
c640: 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 on. TLS 1.3 only
c650: 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f , not http/2. */
c660: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 ..if (request &&
c670: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 post_handshake)
c680: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f {.. SSL_set_
c690: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 post_handshake_a
c6a0: 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 uth(statePtr->ss
c6b0: 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 l, 1);..}.../* S
c6c0: 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a et client mode *
c6d0: 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 /..SSL_set_conne
c6e0: 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 ct_state(statePt
c6f0: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 r->ssl);. }.
c700: 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 SSL_set_bio(s
c710: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 tatePtr->ssl, st
c720: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 atePtr->p_bio, s
c730: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b tatePtr->p_bio);
c740: 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c . BIO_set_ssl
c750: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 (statePtr->bio,
c760: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 statePtr->ssl, B
c770: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 IO_NOCLOSE);..
c780: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 /*. * End
c790: 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 of SSL Init.
c7a0: 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 */. dprintf(
c7b0: 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 "Returning %s",
c7c0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
c7d0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
c7e0: 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 f));. Tcl_Set
c7f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 Result(interp, (
c800: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 char *) Tcl_GetC
c810: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
c820: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f Ptr->self), TCL_
c830: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 VOLATILE);. r
c840: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
c850: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
c860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
c8a0: 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 UnimportObjCmd
c8b0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
c8c0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
c8d0: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 ed to remove the
c8e0: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
c8f0: 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 filter.. *. * R
c900: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
c910: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
c920: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
c930: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 ects:. *.May mod
c940: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 ify the behavior
c950: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 of an IO channe
c960: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d l.. *. *--------
c970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
c9b0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d .static int.Unim
c9c0: 70 6f 72 74 4f 62 6a 43 6d 64 28 0a 20 20 20 20 portObjCmd(.
c9d0: 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 TCL_UNUSED(void
c9e0: 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 *),. Tcl_Inte
c9f0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 rp *interp,.
ca00: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 int objc,. Tc
ca10: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
ca20: 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]).{. Tcl_C
ca30: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
ca40: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
ca50: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
ca60: 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 /.. dprintf("
ca70: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
ca80: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
ca90: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
caa0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
cab0: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
cac0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
cad0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 ;. }.. cha
cae0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
caf0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
cb00: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d etString(objv[1]
cb10: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 ), NULL);. if
cb20: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
cb30: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
cb40: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
cb50: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
cb60: 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 . * Make sur
cb70: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
cb80: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
cb90: 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 nel. */.
cba0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
cbb0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
cbc0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
cbd0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
cbe0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
cbf0: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
cc00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
cc10: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
cc20: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
cc30: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
cc40: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 .."\": not a TLS
cc50: 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 channel", (char
cc60: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *)NULL);.. T
cc70: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
cc80: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
cc90: 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e UNIMPORT", "CHAN
cca0: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
ccb0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
ccc0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
ccd0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 R;. }.. if
cce0: 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 (Tcl_UnstackCha
ccf0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 nnel(interp, cha
cd00: 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 n) == TCL_ERROR)
cd10: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
cd20: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
cd30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
cd40: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
cd90: 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 * CTX_Init -- c
cda0: 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 onstruct a SSL_C
cdb0: 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 TX instance. *.
cdc0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
cdd0: 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e valid SSL_CTX in
cde0: 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a stance or NULL..
cdf0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
ce00: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 ts:. *.construct
ce10: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 s SSL context (C
ce20: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d TX). *. *-------
ce30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
ce70: 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 ..static SSL_CTX
ce80: 20 2a 0a 43 54 58 5f 49 6e 69 74 28 0a 20 20 20 *.CTX_Init(.
ce90: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
cea0: 2c 0a 20 20 20 20 69 6e 74 20 69 73 53 65 72 76 ,. int isServ
ceb0: 65 72 2c 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 er,. int prot
cec0: 6f 2c 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 o,. char *key
ced0: 66 69 6c 65 2c 0a 20 20 20 20 63 68 61 72 20 2a file,. char *
cee0: 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e certfile,. un
cef0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 signed char *key
cf00: 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ,. unsigned c
cf10: 68 61 72 20 2a 63 65 72 74 2c 0a 20 20 20 20 69 har *cert,. i
cf20: 6e 74 20 6b 65 79 5f 6c 65 6e 2c 0a 20 20 20 20 nt key_len,.
cf30: 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 0a 20 20 int cert_len,.
cf40: 20 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c 0a char *CApath,.
cf50: 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 char *CAfile
cf60: 2c 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ,. char *ciph
cf70: 65 72 73 2c 0a 20 20 20 20 63 68 61 72 20 2a 63 ers,. char *c
cf80: 69 70 68 65 72 73 75 69 74 65 73 2c 0a 20 20 20 iphersuites,.
cf90: 20 69 6e 74 20 6c 65 76 65 6c 2c 0a 20 20 20 20 int level,.
cfa0: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 0a char *DHparams).
cfb0: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 {. Tcl_Interp
cfc0: 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 *interp = state
cfd0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
cfe0: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 SSL_CTX *ctx =
cff0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 NULL;. Tcl_DS
d000: 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 69 6e tring ds;. in
d010: 74 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72 74 t off = 0, abort
d020: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f = 0;. int lo
d030: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a ad_private_key;.
d040: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 const SSL_ME
d050: 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 THOD *method;..
d060: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
d070: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 ed");.. if (!
d080: 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 proto) {..Tcl_Ap
d090: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
d0a0: 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f p, "no valid pro
d0b0: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c tocol selected",
d0c0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
d0d0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
d0e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 }.. /* crea
d0f0: 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a te SSL context *
d100: 2f 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 /. if (ENABLE
d110: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
d120: 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c TO_SSL2)) {..Tcl
d130: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d140: 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 terp, "SSL2 prot
d150: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
d160: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c ed", (char *)NUL
d170: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
d180: 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 ;. }.#if defi
d190: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 ned(NO_SSL3) ||
d1a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d1b0: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 NO_SSL3) || defi
d1c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
d1d0: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 SL3_METHOD).
d1e0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
d1f0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c o, TLS_PROTO_SSL
d200: 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 3)) {..Tcl_Appen
d210: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
d220: 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e "SSL3 protocol n
d230: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
d240: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
d250: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
d260: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 }.#endif.#if def
d270: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c ined(NO_TLS1) ||
d280: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
d290: 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 _NO_TLS1) || def
d2a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d2b0: 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 TLS1_METHOD).
d2c0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
d2d0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
d2e0: 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 S1)) {..Tcl_Appe
d2f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
d300: 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 "TLS 1.0 protoc
d310: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
d320: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
d330: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
d340: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
d350: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
d360: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
d370: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
d380: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
d390: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d NSSL_NO_TLS1_1_M
d3a0: 45 54 48 4f 44 29 0a 20 20 20 20 69 66 20 28 45 ETHOD). if (E
d3b0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
d3c0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 S_PROTO_TLS1_1))
d3d0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
d3e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
d3f0: 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.1 protocol n
d400: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
d410: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
d420: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
d430: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 }.#endif.#if def
d440: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
d450: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
d460: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c SL_NO_TLS1_2) ||
d470: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
d480: 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f _NO_TLS1_2_METHO
d490: 44 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c D). if (ENABL
d4a0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d4b0: 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 OTO_TLS1_2)) {..
d4c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d4d0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e (interp, "TLS 1.
d4e0: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 2 protocol not s
d4f0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
d500: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *)NULL);..retur
d510: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
d520: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
d530: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 (NO_TLS1_3) || d
d540: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d550: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 O_TLS1_3) || def
d560: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d570: 54 4c 53 31 5f 33 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_3_METHOD).
d580: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
d590: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
d5a0: 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f TLS1_3)) {..Tcl_
d5b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d5c0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 erp, "TLS 1.3 pr
d5d0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d5e0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e rted", (char *)N
d5f0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
d600: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
d610: 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d . if (proto =
d620: 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 = 0) {../* Use f
d630: 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 ull range */..SS
d640: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 L_CTX_set_min_pr
d650: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
d660: 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 0);..SSL_CTX_se
d670: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 t_max_proto_vers
d680: 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 ion(ctx, 0);.
d690: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 }.. switch (
d6a0: 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 21 64 65 proto) {.#if !de
d6b0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
d6c0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d6d0: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 SL_NO_SSL3) && !
d6e0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d6f0: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a NO_SSL3_METHOD).
d700: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
d710: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 TO_SSL3:..method
d720: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 = isServer ? SS
d730: 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f Lv3_server_metho
d740: 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 d() : SSLv3_clie
d750: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
d760: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
d770: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
d780: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d790: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 ENSSL_NO_TLS1) &
d7a0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d7b0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
d7c0: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
d7d0: 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 PROTO_TLS1:..met
d7e0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
d7f0: 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 TLSv1_server_me
d800: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 thod() : TLSv1_c
d810: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
d820: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
d830: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
d840: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
d850: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d860: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
d870: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d880: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_1_METHOD).
d890: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
d8a0: 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_1:..method =
d8b0: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
d8c0: 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 1_1_server_metho
d8d0: 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c d() : TLSv1_1_cl
d8e0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
d8f0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
d900: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
d910: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
d920: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d930: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
d940: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d950: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 _2_METHOD). c
d960: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
d970: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 S1_2:..method =
d980: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 isServer ? TLSv1
d990: 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 _2_server_method
d9a0: 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 () : TLSv1_2_cli
d9b0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
d9c0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
d9d0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
d9e0: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
d9f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
da00: 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 _3). case TLS
da10: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 _PROTO_TLS1_3:..
da20: 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 /* Use the gener
da30: 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f ic method and co
da40: 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 nstraint range a
da50: 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 fter context is
da60: 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 created */..meth
da70: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
da80: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f TLS_server_metho
da90: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 d() : TLS_client
daa0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
dab0: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 k;.#endif. de
dac0: 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 fault:../* Negot
dad0: 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61 iate highest ava
dae0: 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 ilable SSL/TLS v
daf0: 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f ersion */..metho
db00: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
db10: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 LS_server_method
db20: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f () : TLS_client_
db30: 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 21 64 method();.#if !d
db40: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
db50: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
db60: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 SSL_NO_SSL3) &&
db70: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
db80: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 _NO_SSL3_METHOD)
db90: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
dba0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
dbb0: 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a TO_SSL3) ? 0 :
dbc0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 SSL_OP_NO_SSLv3
dbd0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
dbe0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
dbf0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
dc00: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 SSL_NO_TLS1) &&
dc10: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
dc20: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 _NO_TLS1_METHOD)
dc30: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
dc40: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
dc50: 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a TO_TLS1) ? 0 :
dc60: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
dc70: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
dc80: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
dc90: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
dca0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
dcb0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
dcc0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d NSSL_NO_TLS1_1_M
dcd0: 45 54 48 4f 44 29 0a 09 6f 66 66 20 7c 3d 20 28 ETHOD)..off |= (
dce0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
dcf0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 LS_PROTO_TLS1_1)
dd00: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
dd10: 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 _TLSv1_1);.#endi
dd20: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
dd30: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
dd40: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
dd50: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
dd60: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
dd70: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 TLS1_2_METHOD)..
dd80: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
dd90: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
dda0: 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 _TLS1_2) ? 0 : S
ddb0: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 SL_OP_NO_TLSv1_2
ddc0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
ddd0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
dde0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
ddf0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
de00: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
de10: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 5f 4d NSSL_NO_TLS1_3_M
de20: 45 54 48 4f 44 29 0a 09 6f 66 66 20 7c 3d 20 28 ETHOD)..off |= (
de30: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
de40: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
de50: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
de60: 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 _TLSv1_3);.#endi
de70: 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a f..break;. }.
de80: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
de90: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 rror();.. ctx
dea0: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d = SSL_CTX_new(m
deb0: 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 ethod);. if (
dec0: 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 !ctx) {..return(
ded0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL);. }..
dee0: 20 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c if (getenv(SSL
def0: 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 KEYLOGFILE)) {..
df00: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c SSL_CTX_set_keyl
df10: 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c og_callback(ctx,
df20: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 KeyLogCallback)
df30: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 ;. }..#if !de
df40: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
df50: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
df60: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
df70: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d if (proto ==
df80: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
df90: 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 3) {..SSL_CTX_se
dfa0: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 t_min_proto_vers
dfb0: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
dfc0: 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 VERSION);..SSL_C
dfd0: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f TX_set_max_proto
dfe0: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
dff0: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 S1_3_VERSION);.
e000: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 }.#endif..
e010: 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 /* Force cipher
e020: 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 selection order
e030: 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 by server */.
e040: 20 20 69 66 20 28 21 69 73 53 65 72 76 65 72 29 if (!isServer)
e050: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
e060: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c options(ctx, SSL
e070: 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 _OP_CIPHER_SERVE
e080: 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 R_PREFERENCE);.
e090: 20 20 20 7d 0a 0a 20 20 20 20 53 53 4c 5f 43 54 }.. SSL_CT
e0a0: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 X_set_app_data(c
e0b0: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 tx, (void*)inter
e0c0: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 p);./* remember
e0d0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
e0e0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
e0f0: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
e100: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 SSL_OP_ALL);./*
e110: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b all SSL bug work
e120: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 arounds */. S
e130: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
e140: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e ns(ctx, SSL_OP_N
e150: 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 O_COMPRESSION);.
e160: 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 /* disable compr
e170: 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 ession even if s
e180: 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 upported */.
e190: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
e1a0: 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 ons(ctx, off);..
e1b0: 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f /* disable proto
e1c0: 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a col versions */.
e1d0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 SSL_CTX_sess
e1e0: 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 _set_cache_size(
e1f0: 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 ctx, 128);..
e200: 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66 69 /* Set user defi
e210: 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69 70 ned ciphers, cip
e220: 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20 her suites, and
e230: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a security level *
e240: 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 /. if ((ciphe
e250: 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 rs != NULL) && !
e260: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 SSL_CTX_set_ciph
e270: 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70 er_list(ctx, cip
e280: 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 hers)) {..Tcl_Ap
e290: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
e2a0: 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73 20 p, "Set ciphers
e2b0: 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 failed: No valid
e2c0: 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 ciphers", (char
e2d0: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 *)NULL);..SSL_C
e2e0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 TX_free(ctx);..r
e2f0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
e300: 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 }. if ((ciphe
e310: 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 rsuites != NULL)
e320: 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 && !SSL_CTX_set
e330: 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63 74 _ciphersuites(ct
e340: 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29 x, ciphersuites)
e350: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
e360: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
e370: 65 74 20 63 69 70 68 65 72 20 73 75 69 74 65 73 et cipher suites
e380: 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 failed: No vali
e390: 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 d ciphers", (cha
e3a0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f r *)NULL);..SSL_
e3b0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
e3c0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
e3d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 }.. /* Set s
e3e0: 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f ecurity level */
e3f0: 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e . if (level >
e400: 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 -1 && level < 6
e410: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f ) {../* SSL_set_
e420: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a security_level *
e430: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 /..SSL_CTX_set_s
e440: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 ecurity_level(ct
e450: 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d x, level);. }
e460: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d .. /* set som
e470: 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 e callbacks */.
e480: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 SSL_CTX_set_d
e490: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 efault_passwd_cb
e4a0: 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 (ctx, PasswordCa
e4b0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c llback);. SSL
e4c0: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 _CTX_set_default
e4d0: 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 _passwd_cb_userd
e4e0: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a ata(ctx, (void *
e4f0: 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 )statePtr);..
e500: 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 /* read a Diffi
e510: 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 e-Hellman parame
e520: 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 ters file, or us
e530: 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f e the built-in o
e540: 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 ne */.#ifdef OPE
e550: 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 NSSL_NO_DH. i
e560: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e f (DHparams != N
e570: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
e580: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
e590: 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 "DH parameter s
e5a0: 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c upport not avail
e5b0: 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 4e able", (char *)N
e5c0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
e5d0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
e5e0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
e5f0: 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 lse. {..DH* d
e600: 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 h;..if (DHparams
e610: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
e620: 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 BIO *bio;..
e630: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 bio = BIO_new_fi
e640: 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c le(F2N(DHparams,
e650: 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 &ds), "r");..
e660: 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 if (!bio) {...
e670: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
e680: 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 &ds);...Tcl_Appe
e690: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
e6a0: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 "Could not find
e6b0: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 DH parameters f
e6c0: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 ile", (char *)NU
e6d0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
e6e0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
e6f0: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a rn NULL;.. }.
e700: 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 .. dh = PEM_r
e710: 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 ead_bio_DHparams
e720: 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c (bio, NULL, NULL
e730: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 , NULL);.. BI
e740: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 O_free(bio);..
e750: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
e760: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 e(&ds);.. if
e770: 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 (!dh) {...Tcl_Ap
e780: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
e790: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 p, "Could not re
e7a0: 61 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 ad DH parameters
e7b0: 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 from file", (ch
e7c0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 ar *)NULL);...SS
e7d0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
e7e0: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
e7f0: 09 20 20 20 20 7d 0a 09 20 20 20 20 53 53 4c 5f . }.. SSL_
e800: 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 CTX_set_tmp_dh(c
e810: 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 20 44 48 tx, dh);.. DH
e820: 5f 66 72 65 65 28 64 68 29 3b 0a 0a 09 7d 20 65 _free(dh);...} e
e830: 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20 55 73 lse {.. /* Us
e840: 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20 e well known DH
e850: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 parameters that
e860: 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20 73 75 have built-in su
e870: 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53 53 4c pport in OpenSSL
e880: 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21 53 53 */.. if (!SS
e890: 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61 75 74 L_CTX_set_dh_aut
e8a0: 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09 09 54 o(ctx, 1)) {...T
e8b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e8c0: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e interp, "Could n
e8d0: 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20 44 48 ot enable set DH
e8e0: 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 5f 45 52 auto: ", GET_ER
e8f0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
e900: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c r *)NULL);...SSL
e910: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
e920: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
e930: 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 }..}. }.#
e940: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 endif.. /* se
e950: 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 t our certificat
e960: 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 e */. load_pr
e970: 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 ivate_key = 0;.
e980: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 if (certfile
e990: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 != NULL) {..load
e9a0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 _private_key = 1
e9b0: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f ;...if (SSL_CTX_
e9c0: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f use_certificate_
e9d0: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 file(ctx, F2N(ce
e9e0: 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 rtfile, &ds), SS
e9f0: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 L_FILETYPE_PEM)
ea00: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c <= 0) {.. Tcl
ea10: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
ea20: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 );.. Tcl_Appe
ea30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ea40: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
ea50: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 certificate file
ea60: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a ", certfile, ":
ea70: 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 ",... GET_ER
ea80: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
ea90: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 r *)NULL);..
eaa0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
eab0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
eac0: 55 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 ULL;..}..Tcl_DSt
ead0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a ringFree(&ds);..
eae0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
eaf0: 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ert != NULL) {..
eb00: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 load_private_key
eb10: 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43 = 1;..if (SSL_C
eb20: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 TX_use_certifica
eb30: 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 72 te_ASN1(ctx, cer
eb40: 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 t_len, cert) <=
eb50: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 0) {.. Tcl_Ap
eb60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
eb70: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
eb80: 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 t certificate: "
eb90: 2c 0a 09 09 20 20 20 20 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 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 *)NULL);.. SS
ebc0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
ebd0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
ebe0: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 L;..}. } else
ebf0: 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 {..certfile = (
ec00: 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 char*)X509_get_d
ec10: 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 efault_cert_file
ec20: 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 ();...if (SSL_CT
ec30: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 X_use_certificat
ec40: 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 e_file(ctx, cert
ec50: 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 file, SSL_FILETY
ec60: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a PE_PEM) <= 0) {.
ec70: 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 41 #if 0.. Tcl_A
ec80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
ec90: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 rp, "unable to u
eca0: 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 se default certi
ecb0: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 ficate file ", c
ecc0: 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 ertfile, ": ",..
ecd0: 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41 . GET_ERR_REA
ece0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e SON(), (char *)N
ecf0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
ed00: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
ed10: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
ed20: 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a #endif..}. }.
ed30: 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 . /* set our
ed40: 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 private key */.
ed50: 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 if (load_priv
ed60: 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 ate_key) {..if (
ed70: 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 keyfile == NULL
ed80: 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 && key == NULL)
ed90: 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d {.. keyfile =
eda0: 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 certfile;..}...
edb0: 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e if (keyfile != N
edc0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 ULL) {.. /* g
edd0: 65 74 20 74 68 65 20 70 72 69 76 61 74 65 20 6b et the private k
ede0: 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 ey associated wi
edf0: 74 68 20 74 68 69 73 20 63 65 72 74 69 66 69 63 th this certific
ee00: 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 ate */.. if (
ee10: 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 keyfile == NULL)
ee20: 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 {...keyfile = c
ee30: 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a ertfile;.. }.
ee40: 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 .. if (SSL_CT
ee50: 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 X_use_PrivateKey
ee60: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b _file(ctx, F2N(k
ee70: 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 eyfile, &ds), SS
ee80: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 L_FILETYPE_PEM)
ee90: 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 <= 0) {...Tcl_DS
eea0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
eeb0: 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 ../* flush the p
eec0: 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 assphrase which
eed0: 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e might be left in
eee0: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 the result */..
eef0: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
ef00: 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c nterp, NULL, TCL
ef10: 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f _STATIC);...Tcl_
ef20: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
ef30: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
ef40: 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 set public key f
ef50: 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 ile ", keyfile,
ef60: 22 20 22 2c 0a 09 09 09 47 45 54 5f 45 52 52 5f " ",....GET_ERR_
ef70: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
ef80: 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 *)NULL);...SSL_C
ef90: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
efa0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 return NULL;..
efb0: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
efc0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
efd0: 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 } else if (key !
efe0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 = NULL) {.. i
eff0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 f (SSL_CTX_use_P
f000: 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 rivateKey_ASN1(E
f010: 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 VP_PKEY_RSA, ctx
f020: 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c , key,key_len) <
f030: 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 6c 75 73 = 0) {.../* flus
f040: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 h the passphrase
f050: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 which might be
f060: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 left in the resu
f070: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 lt */...Tcl_SetR
f080: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 esult(interp, NU
f090: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b LL, TCL_STATIC);
f0a0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
f0b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
f0c0: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 ble to set publi
f0d0: 63 20 6b 65 79 3a 20 22 2c 20 47 45 54 5f 45 52 c key: ", GET_ER
f0e0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
f0f0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c r *)NULL);...SSL
f100: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
f110: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
f120: 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 }..}../* Now
f130: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 we know that a
f140: 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 76 key and cert hav
f150: 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e e been set again
f160: 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63 st.. * the SSL c
f170: 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21 ontext */..if (!
f180: 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 SSL_CTX_check_pr
f190: 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20 ivate_key(ctx))
f1a0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
f1b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a dResult(interp,.
f1c0: 09 09 09 20 20 20 20 22 70 72 69 76 61 74 65 20 ... "private
f1d0: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 key does not mat
f1e0: 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 ch the certifica
f1f0: 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a te public key",.
f200: 09 09 09 20 20 20 20 28 63 68 61 72 20 2a 29 4e ... (char *)N
f210: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
f220: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
f230: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
f240: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
f250: 20 53 65 74 20 74 6f 20 75 73 65 20 64 65 66 61 Set to use defa
f260: 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 ult location and
f270: 20 66 69 6c 65 20 66 6f 72 20 43 65 72 74 69 66 file for Certif
f280: 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 icate Authority
f290: 28 43 41 29 20 63 65 72 74 69 66 69 63 61 74 65 (CA) certificate
f2a0: 73 2e 20 54 68 65 0a 20 20 20 20 20 2a 20 76 65 s. The. * ve
f2b0: 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 73 74 rify path and st
f2c0: 6f 72 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 ore can be overr
f2d0: 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c idden by the SSL
f2e0: 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 _CERT_DIR env va
f2f0: 72 2e 20 54 68 65 20 76 65 72 69 66 79 20 66 69 r. The verify fi
f300: 6c 65 20 63 61 6e 0a 20 20 20 20 20 2a 20 62 65 le can. * be
f310: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 overridden by t
f320: 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 he SSL_CERT_FILE
f330: 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 20 20 20 env var. */.
f340: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 if (!SSL_CTX_se
f350: 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 t_default_verify
f360: 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a 09 _paths(ctx)) {..
f370: 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a abort++;. }..
f380: 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 64 65 73 /* Overrides
f390: 20 66 6f 72 20 74 68 65 20 43 41 20 76 65 72 69 for the CA veri
f3a0: 66 79 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 fy path and file
f3b0: 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 20 4f 50 */. {.#if OP
f3c0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
f3d0: 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
f3e0: 30 4c 0a 09 69 66 20 28 43 41 70 61 74 68 20 21 0L..if (CApath !
f3f0: 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 69 6c 65 = NULL || CAfile
f400: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
f410: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 Tcl_DString ds1
f420: 3b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f ;.. if (!SSL_
f430: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f CTX_load_verify_
f440: 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 locations(ctx, F
f450: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 2N(CAfile, &ds),
f460: 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73 F2N(CApath, &ds
f470: 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 1))) {...abort++
f480: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 ;.. }.. Tc
f490: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
f4a0: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 s);.. Tcl_DSt
f4b0: 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a ringFree(&ds1);.
f4c0: 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 .. /* Set lis
f4d0: 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 t of CAs to send
f4e0: 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 to client when
f4f0: 72 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 requesting a cli
f500: 65 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 ent certificate
f510: 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 73 */.. /* https
f520: 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e ://sourceforge.n
f530: 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 et/p/tls/bugs/57
f540: 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58 / */.. /* XXX
f550: 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 :TODO: Let the u
f560: 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 ser supply value
f570: 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f s here instead o
f580: 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 f something that
f590: 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 exists on the f
f5a0: 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20 ilesystem */..
f5b0: 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f STACK_OF(X509_
f5c0: 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 NAME) *certNames
f5d0: 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 = SSL_load_clie
f5e0: 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 nt_CA_file(F2N(C
f5f0: 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 Afile, &ds));..
f600: 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 if (certNames
f610: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 != NULL) {...SS
f620: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 L_CTX_set_client
f630: 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 _CA_list(ctx, ce
f640: 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d rtNames);.. }
f650: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
f660: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a gFree(&ds);..}..
f670: 23 65 6c 73 65 0a 09 69 66 20 28 43 41 70 61 74 #else..if (CApat
f680: 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 h != NULL) {..
f690: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c if (!SSL_CTX_l
f6a0: 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63 oad_verify_dir(c
f6b0: 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 tx, F2N(CApath,
f6c0: 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 &ds))) {...abort
f6d0: 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ++;.. }..
f6e0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
f6f0: 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28 43 41 &ds);..}..if (CA
f700: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
f710: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 . if (!SSL_CT
f720: 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 69 X_load_verify_fi
f730: 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 le(ctx, F2N(CAfi
f740: 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 le, &ds))) {...a
f750: 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 bort++;.. }..
f760: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
f770: 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 20 ree(&ds);...
f780: 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 /* Set list of C
f790: 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c As to send to cl
f7a0: 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 ient when reques
f7b0: 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 ting a client ce
f7c0: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 rtificate */..
f7d0: 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f STACK_OF(X509_
f7e0: 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 NAME) *certNames
f7f0: 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 = SSL_load_clie
f800: 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 nt_CA_file(F2N(C
f810: 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 Afile, &ds));..
f820: 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 if (certNames
f830: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 != NULL) {...SS
f840: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 L_CTX_set_client
f850: 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 _CA_list(ctx, ce
f860: 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d rtNames);.. }
f870: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
f880: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 23 gFree(&ds);..}.#
f890: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 endif. }..
f8a0: 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c return ctx;.}..
f8b0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
f8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f8d0: 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 ---------. *. *
f900: 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 StatusObjCmd --
f910: 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 return certifica
f920: 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 te for connected
f930: 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 peer.. *. * Res
f940: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
f950: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
f960: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
f970: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
f980: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
f990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
f9d0: 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d int.StatusObjCm
f9e0: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 d(. TCL_UNUSE
f9f0: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 D(void *),. T
fa00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
fa10: 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c p,. int objc,
fa20: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f . Tcl_Obj.*co
fa30: 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 nst objv[]).{.
fa40: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
fa50: 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 r;. X509 *pee
fa60: 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a r;. Tcl_Obj *
fa70: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f objPtr;. Tcl_
fa80: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 Channel chan;.
fa90: 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e char *channelN
faa0: 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 ame, *ciphers;.
fab0: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 int mode;.
fac0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
fad0: 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 char *proto;.
fae0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 unsigned int le
faf0: 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 n;. int nid,
fb00: 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 res;.. dprint
fb10: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
fb20: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c if (objc < 2 |
fb30: 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f | objc > 3 || (o
fb40: 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 73 74 72 bjc == 3 && !str
fb50: 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e cmp(Tcl_GetStrin
fb60: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f g(objv[1]), "-lo
fb70: 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 cal"))) {..Tcl_W
fb80: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
fb90: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d rp, 1, objv, "?-
fba0: 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 local? channel")
fbb0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
fbc0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
fbd0: 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 /* Get channel I
fbe0: 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c d */. channel
fbf0: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 Name = Tcl_GetSt
fc00: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
fc10: 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20 [(objc == 2 ? 1
fc20: 3a 20 32 29 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 : 2)], (Tcl_Size
fc30: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 63 *) NULL);. c
fc40: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
fc50: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 nnel(interp, cha
fc60: 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 nnelName, &mode)
fc70: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
fc80: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
fc90: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
fca0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
fcb0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
fcc0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
fcd0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
fce0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
fcf0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
fd00: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
fd10: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
fd20: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
fd30: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
fd40: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
fd50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
fd60: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
fd70: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
fd80: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
fd90: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
fda0: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 nel", NULL);..Tc
fdb0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
fdc0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 nterp, "TLS", "S
fdd0: 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c TATUS", "CHANNEL
fde0: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 ", "INVALID", (c
fdf0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 har *)NULL);..re
fe00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
fe10: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 }. stateP
fe20: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 tr = (State *) T
fe30: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
fe40: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b tanceData(chan);
fe50: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 .. /* Get cer
fe60: 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 tificate for pee
fe70: 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 r or self */.
fe80: 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 if (objc == 2)
fe90: 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 {..peer = SSL_ge
fea0: 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 t_peer_certifica
feb0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
fec0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
fed0: 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f .peer = SSL_get_
fee0: 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 certificate(stat
fef0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
ff00: 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30 }. /* Get X50
ff10: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 9 certificate in
ff20: 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 fo */. if (pe
ff30: 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 er) {..objPtr =
ff40: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 Tls_NewX509Obj(i
ff50: 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 nterp, peer);..i
ff60: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a f (objc == 2) {.
ff70: 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70 . X509_free(p
ff80: 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20 eer);.. peer
ff90: 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d = NULL;..}. }
ffa0: 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 else {..objPtr
ffb0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
ffc0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d (0, NULL);. }
ffd0: 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 .. /* Peer na
ffe0: 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e me */. LAPPEN
fff0: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
10000 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 jPtr, "peername"
10010 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e , SSL_get0_peern
10020 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ame(statePtr->ss
10030 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 l), -1);. LAP
10040 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
10050 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22 objPtr, "sbits"
10060 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 , SSL_get_cipher
10070 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e _bits(statePtr->
10080 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 ssl, NULL));..
10090 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 ciphers = (cha
100a0 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 r*)SSL_get_ciphe
100b0 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 r(statePtr->ssl)
100c0 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 ;. LAPPEND_ST
100d0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
100e0 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68 , "cipher", ciph
100f0 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f ers, -1);.. /
10100 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 * Verify the X50
10110 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 9 certificate pr
10120 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 esented by the p
10130 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 eer */. LAPPE
10140 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
10150 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65 bjPtr, "verifyRe
10160 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 sult",..X509_ver
10170 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 ify_cert_error_s
10180 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 tring(SSL_get_ve
10190 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 rify_result(stat
101a0 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 ePtr->ssl)), -1)
101b0 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 ;.. /* Verify
101c0 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 mode */. mod
101d0 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 e = SSL_get_veri
101e0 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 fy_mode(statePtr
101f0 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 ->ssl);. if (
10200 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
10210 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 FY_NONE) {..LAPP
10220 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10230 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d objPtr, "verifyM
10240 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 ode", "none", -1
10250 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
10260 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 .Tcl_Obj *listOb
10270 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
10280 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
10290 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c .if (mode && SSL
102a0 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a _VERIFY_PEER) {.
102b0 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
102c0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
102d0 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 terp, listObjPtr
102e0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
102f0 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b bj("peer", -1));
10300 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 ..}..if (mode &&
10310 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
10320 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
10330 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
10340 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10350 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 t(interp, listOb
10360 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
10370 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 ingObj("fail if
10380 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d no peer cert", -
10390 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 1));..}..if (mod
103a0 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f e && SSL_VERIFY_
103b0 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 CLIENT_ONCE) {..
103c0 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
103d0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
103e0 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c erp, listObjPtr,
103f0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
10400 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c j("client once",
10410 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d -1));..}..if (m
10420 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
10430 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 Y_POST_HANDSHAKE
10440 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
10450 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10460 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 t(interp, listOb
10470 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
10480 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e ingObj("post han
10490 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 dshake", -1));..
104a0 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 }..LAPPEND_OBJ(i
104b0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
104c0 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 verifyMode", lis
104d0 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a tObjPtr). }..
104e0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f /* Verify mo
104f0 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 de depth */.
10500 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
10510 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 rp, objPtr, "ver
10520 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 ifyDepth", SSL_g
10530 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 et_verify_depth(
10540 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b statePtr->ssl));
10550 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 .. /* Report
10560 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f the selected pro
10570 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c tocol as a resul
10580 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 t of the negotia
10590 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f tion */. SSL_
105a0 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 get0_alpn_select
105b0 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ed(statePtr->ssl
105c0 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b , &proto, &len);
105d0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
105e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
105f0 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a "alpn", (char *
10600 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a )proto, (Tcl_Siz
10610 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 e) len);. LAP
10620 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
10630 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 objPtr, "protoc
10640 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 ol", SSL_get_ver
10650 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 sion(statePtr->s
10660 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f sl), -1);.. /
10670 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d * Valid for non-
10680 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e RSA signature an
10690 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 d TLS 1.3 */.
106a0 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 if (objc == 2)
106b0 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 {..res = SSL_get
106c0 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f _peer_signature_
106d0 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
106e0 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 l, &nid);. }
106f0 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 else {..res = SS
10700 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f L_get_signature_
10710 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
10720 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a l, &nid);. }.
10730 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e if (!res) {n
10740 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 id = 0;}. LAP
10750 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
10760 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 objPtr, "signat
10770 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d ureHashAlgorithm
10780 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 ", OBJ_nid2ln(ni
10790 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 69 66 d), -1);.. if
107a0 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
107b0 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 res = SSL_get_pe
107c0 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 er_signature_typ
107d0 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
107e0 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
107f0 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
10800 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 SSL_get_signatur
10810 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 e_type_nid(state
10820 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b Ptr->ssl, &nid);
10830 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 . }. if (!
10840 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a res) {nid = 0;}.
10850 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
10860 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10870 22 73 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c "signatureType",
10880 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 OBJ_nid2ln(nid)
10890 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f , -1);.. Tcl_
108a0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
108b0 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
108c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
108d0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
108e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
108f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10900 2d 2d 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 0a 20 2a -------------. *
10920 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e . * ConnectionIn
10930 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 foObjCmd -- retu
10940 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e rn connection in
10950 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e fo from OpenSSL.
10960 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
10970 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e *.A list of con
10980 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a nection info. *
10990 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
109a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
109b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
109c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
109d0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
109e0 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f ic int Connectio
109f0 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 0a 20 20 20 nInfoObjCmd(.
10a00 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 TCL_UNUSED(void
10a10 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 *),. Tcl_Int
10a20 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 erp *interp,.
10a30 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 int objc,. T
10a40 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
10a50 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f jv[]).{. Tcl_
10a60 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f Channel chan;../
10a70 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
10a80 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a set a mode on *
10a90 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
10aa0 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e tePtr;../* clien
10ab0 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
10ac0 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 socket */. Tc
10ad0 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a l_Obj *objPtr, *
10ae0 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e listPtr;. con
10af0 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 st SSL *ssl;.
10b00 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 const SSL_CIPHE
10b10 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 R *cipher;. c
10b20 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e onst SSL_SESSION
10b30 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 *session;. c
10b40 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b onst EVP_MD *md;
10b50 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
10b60 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
10b70 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
10b80 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
10b90 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 el");..return(TC
10ba0 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a L_ERROR);. }.
10bb0 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
10bc0 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
10bd0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
10be0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
10bf0 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 4c (Tcl_Size *)NUL
10c00 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 L), NULL);. i
10c10 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
10c20 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
10c30 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
10c40 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
10c50 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
10c60 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
10c70 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
10c80 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
10c90 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
10ca0 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 han);. if (Tc
10cb0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
10cc0 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
10cd0 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
10ce0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
10cf0 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
10d00 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
10d10 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
10d20 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e an),.. "\": n
10d30 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
10d40 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 ", NULL);..Tcl_S
10d50 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
10d60 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e rp, "TLS", "CONN
10d70 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 ECTION", "CHANNE
10d80 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 L", "INVALID", (
10d90 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
10da0 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
10db0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a ;. }.. obj
10dc0 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
10dd0 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a tObj(0, NULL);..
10de0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f /* Connectio
10df0 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 n info */. st
10e00 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
10e10 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c *)Tcl_GetChannel
10e20 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
10e30 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 n);. ssl = st
10e40 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 atePtr->ssl;.
10e50 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c if (ssl != NULL
10e60 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 ) {../* connecti
10e70 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 on state */..LAP
10e80 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
10e90 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65 22 objPtr, "state"
10ea0 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 , SSL_state_stri
10eb0 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 ng_long(ssl), -1
10ec0 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 );.../* Get SNI
10ed0 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65 72 requested server
10ee0 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e name */..LAPPEN
10ef0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
10f00 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61 6d jPtr, "servernam
10f10 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 e", SSL_get_serv
10f20 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 ername(ssl, TLSE
10f30 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 XT_NAMETYPE_host
10f40 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f _name), -1);.../
10f50 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a * Get protocol *
10f60 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
10f70 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10f80 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 protocol", SSL_g
10f90 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c et_version(ssl),
10fa0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 -1);.../* Reneg
10fb0 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 otiation allowed
10fc0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
10fd0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
10fe0 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e , "renegotiation
10ff0 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67 _allowed", SSL_g
11000 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f et_secure_renego
11010 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 tiation_support(
11020 28 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b 0a 0a (SSL *) ssl));..
11030 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 ./* Get security
11040 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 level */..LAPPE
11050 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
11060 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74 79 bjPtr, "security
11070 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74 _level", SSL_get
11080 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 _security_level(
11090 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 ssl));.../* Sess
110a0 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 ion info */..LAP
110b0 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 PEND_BOOL(interp
110c0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 , objPtr, "sessi
110d0 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f on_reused", SSL_
110e0 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 session_reused(s
110f0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 sl));.../* Is se
11100 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 rver info */..LA
11110 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
11120 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73 p, objPtr, "is_s
11130 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73 erver", SSL_is_s
11140 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f erver(ssl));.../
11150 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 * Is DTLS */..LA
11160 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
11170 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64 p, objPtr, "is_d
11180 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c tls", SSL_is_dtl
11190 73 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a s(ssl));. }..
111a0 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e /* Cipher in
111b0 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 fo */. cipher
111c0 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 = SSL_get_curre
111d0 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a nt_cipher(ssl);.
111e0 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21 if (cipher !
111f0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 = NULL) {..char
11200 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 buf[BUFSIZ] = {0
11210 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c };..int bits, al
11220 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 g_bits;.../* Cip
11230 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 her name */..LAP
11240 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11250 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 objPtr, "cipher
11260 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ", SSL_CIPHER_ge
11270 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 t_name(cipher),
11280 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 -1);.../* RFC na
11290 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a me of cipher */.
112a0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
112b0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 erp, objPtr, "st
112c0 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 andard_name", SS
112d0 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 L_CIPHER_standar
112e0 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 d_name(cipher),
112f0 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 -1);.../* OpenSS
11300 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 L name of cipher
11310 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
11320 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11330 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c "openssl_name",
11340 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f OPENSSL_cipher_
11350 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f name(SSL_CIPHER_
11360 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 standard_name(ci
11370 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f pher)), -1);.../
11380 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72 * number of secr
11390 65 74 20 62 69 74 73 20 75 73 65 64 20 66 6f 72 et bits used for
113a0 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 cipher */..bits
113b0 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 = SSL_CIPHER_ge
113c0 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 t_bits(cipher, &
113d0 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 alg_bits);..LAPP
113e0 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 END_INT(interp,
113f0 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f objPtr, "secret_
11400 62 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c bits", bits);..L
11410 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
11420 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f p, objPtr, "algo
11430 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 rithm_bits", alg
11440 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f _bits);../* alg_
11450 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b bits is actual k
11460 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 ey secret bits.
11470 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 If use bits and
11480 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 secret (algorith
11490 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a m) bits differ,.
114a0 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 . the rest of
114b0 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 the bits are fix
114c0 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d ed, i.e. for lim
114d0 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 ited export ciph
114e0 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 ers (bits < 56)
114f0 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 */.../* Indicate
11500 73 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 s which SSL/TLS
11510 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e protocol version
11520 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 74 first defined t
11530 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 he cipher */..LA
11540 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11550 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 , objPtr, "min_v
11560 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 ersion", SSL_CIP
11570 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 HER_get_version(
11580 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 cipher), -1);...
11590 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a 2f /* Cipher NID */
115a0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
115b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
115c0 69 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72 ipherNID", (char
115d0 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 *)OBJ_nid2ln(SS
115e0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70 L_CIPHER_get_cip
115f0 68 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29 her_nid(cipher))
11600 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f , -1);..LAPPEND_
11610 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11620 74 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c tr, "digestNID",
11630 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 (char *)OBJ_nid
11640 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 2ln(SSL_CIPHER_g
11650 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69 et_digest_nid(ci
11660 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 pher)), -1);..LA
11670 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11680 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 , objPtr, "keyEx
11690 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 changeNID", (cha
116a0 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 r *)OBJ_nid2ln(S
116b0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 SL_CIPHER_get_kx
116c0 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d _nid(cipher)), -
116d0 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 1);..LAPPEND_STR
116e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
116f0 20 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e "authentication
11700 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 NID", (char *)OB
11710 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 J_nid2ln(SSL_CIP
11720 48 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 HER_get_auth_nid
11730 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
11740 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74 ../* message aut
11750 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 hentication code
11760 20 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 41 - Cipher is AEA
11770 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 D (e.g. GCM or C
11780 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 haCha20/Poly1305
11790 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 ) or not */../*
117a0 41 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e Authenticated En
117b0 63 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73 cryption with as
117c0 73 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 41 sociated data (A
117d0 45 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c EAD) check */..L
117e0 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
117f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
11800 68 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 her_is_aead", SS
11810 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64 L_CIPHER_is_aead
11820 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 (cipher));.../*
11830 44 69 67 65 73 74 20 75 73 65 64 20 64 75 72 69 Digest used duri
11840 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 ng the SSL/TLS h
11850 61 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73 andshake when us
11860 69 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e 20 ing the cipher.
11870 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 */..md = SSL_CIP
11880 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b HER_get_handshak
11890 65 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 29 e_digest(cipher)
118a0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
118b0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
118c0 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 handshake_digest
118d0 22 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d ", (char *)EVP_M
118e0 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b D_name(md), -1);
118f0 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 .../* Get OpenSS
11900 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e L-specific ID, n
11910 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c ot IANA ID */..L
11920 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
11930 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 p, objPtr, "ciph
11940 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 er_id", (int) SS
11950 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 L_CIPHER_get_id(
11960 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 cipher));.../* T
11970 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 20 wo-byte ID used
11980 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f in the TLS proto
11990 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e col of the given
119a0 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 cipher */..LAPP
119b0 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 END_INT(interp,
119c0 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f objPtr, "protoco
119d0 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c l_id", (int) SSL
119e0 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 _CIPHER_get_prot
119f0 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29 ocol_id(cipher))
11a00 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 ;.../* Textual d
11a10 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 escription of th
11a20 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 20 e cipher */..if
11a30 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 (SSL_CIPHER_desc
11a40 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 ription(cipher,
11a50 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 buf, sizeof(buf)
11a60 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 ) != NULL) {..
11a70 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
11a80 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 terp, objPtr, "d
11a90 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66 escription", buf
11aa0 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a , -1);..}. }.
11ab0 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 . /* Session
11ac0 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 info */. sess
11ad0 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 ion = SSL_get_se
11ae0 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 ssion(ssl);.
11af0 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e if (session != N
11b00 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e ULL) {..const un
11b10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 signed char *tic
11b20 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e ket;..size_t len
11b30 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 2;..unsigned int
11b40 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e ulen;..const un
11b50 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 signed char *ses
11b60 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b sion_id, *proto;
11b70 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
11b80 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d buffer[SSL_MAX_M
11b90 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 ASTER_KEY_LENGTH
11ba0 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 ];.../* Report t
11bb0 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 he selected prot
11bc0 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 ocol as a result
11bd0 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 of the ALPN neg
11be0 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c otiation */..SSL
11bf0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c _SESSION_get0_al
11c00 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 pn_selected(sess
11c10 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 ion, &proto, &le
11c20 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 n2);..LAPPEND_ST
11c30 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11c40 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 , "alpn", (char
11c50 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 *) proto, (Tcl_S
11c60 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a ize) len2);.../*
11c70 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 Report the sele
11c80 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 cted protocol as
11c90 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 a result of the
11ca0 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e NPN negotiation
11cb0 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e */.#ifdef USE_N
11cc0 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 PN..SSL_get0_nex
11cd0 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 t_proto_negotiat
11ce0 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 ed(ssl, &proto,
11cf0 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 &ulen);..LAPPEND
11d00 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11d10 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 Ptr, "npn", (cha
11d20 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c r *) proto, (Tcl
11d30 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65 _Size) ulen);.#e
11d40 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 ndif.../* Resuma
11d50 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 ble session */..
11d60 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
11d70 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 erp, objPtr, "re
11d80 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 sumable", SSL_SE
11d90 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 SSION_is_resumab
11da0 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 le(session));...
11db0 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 /* Session start
11dc0 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 time (seconds s
11dd0 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 ince epoch) */..
11de0 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 LAPPEND_LONG(int
11df0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 erp, objPtr, "st
11e00 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 art_time", SSL_S
11e10 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 ESSION_get_time(
11e20 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 session));.../*
11e30 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 Timeout value -
11e40 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 SSL_CTX_get_time
11e50 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 out (in seconds)
11e60 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e */..LAPPEND_LON
11e70 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 G(interp, objPtr
11e80 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c , "timeout", SSL
11e90 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d _SESSION_get_tim
11ea0 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a eout(session));.
11eb0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 ../* Session id
11ec0 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 - TLSv1.2 and be
11ed0 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 low only */..ses
11ee0 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 sion_id = SSL_SE
11ef0 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 SSION_get_id(ses
11f00 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c sion, &ulen);..L
11f10 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e APPEND_BARRAY(in
11f20 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
11f30 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 ession_id", sess
11f40 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a ion_id, (Tcl_Siz
11f50 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 e) ulen);.../* S
11f60 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a ession context *
11f70 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 /..session_id =
11f80 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
11f90 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 _id_context(sess
11fa0 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 ion, &ulen);..LA
11fb0 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 PPEND_BARRAY(int
11fc0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
11fd0 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 ssion_context",
11fe0 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c session_id, (Tcl
11ff0 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 _Size) ulen);...
12000 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 /* Session ticke
12010 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 t - client only
12020 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f */..SSL_SESSION_
12030 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 get0_ticket(sess
12040 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
12050 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 en2);..LAPPEND_B
12060 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 ARRAY(interp, ob
12070 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 jPtr, "session_t
12080 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 icket", ticket,
12090 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
120a0 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 ;.../* Session t
120b0 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 icket lifetime h
120c0 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 int (in seconds)
120d0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e */..LAPPEND_LON
120e0 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 G(interp, objPtr
120f0 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 , "lifetime", SS
12100 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
12110 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 cket_lifetime_hi
12120 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 nt(session));...
12130 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 /* Ticket app da
12140 74 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 ta */.#if OPENSS
12150 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
12160 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
12170 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
12180 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 _ticket_appdata(
12190 28 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 20 (SSL_SESSION *)
121a0 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 session, &ticket
121b0 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 , &len2);..LAPPE
121c0 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 ND_BARRAY(interp
121d0 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 , objPtr, "ticke
121e0 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63 t_app_data", tic
121f0 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 ket, (Tcl_Size)
12200 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 len2);.#endif...
12210 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 /* Get master ke
12220 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c y */..len2 = SSL
12230 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 _SESSION_get_mas
12240 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c ter_key(session,
12250 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 buffer, SSL_MAX
12260 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 _MASTER_KEY_LENG
12270 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 TH);..LAPPEND_BA
12280 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a RRAY(interp, obj
12290 50 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 Ptr, "master_key
122a0 22 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c 5f ", buffer, (Tcl_
122b0 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f Size) len2);.../
122c0 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 * Compression id
122d0 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e */..unsigned in
122e0 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 t id = SSL_SESSI
122f0 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f ON_get_compress_
12300 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 id(session);..LA
12310 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12320 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 , objPtr, "compr
12330 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d ession_id", id =
12340 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 = 1 ? "zlib" : "
12350 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 none", -1);.
12360 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 }.. /* Compre
12370 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ssion info */.
12380 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c if (ssl != NUL
12390 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 L) {.#ifdef HAVE
123a0 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e _SSL_COMPRESSION
123b0 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 ..const COMP_MET
123c0 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e HOD *comp, *expn
123d0 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 ;..comp = SSL_ge
123e0 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 t_current_compre
123f0 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 ssion(ssl);..exp
12400 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 n = SSL_get_curr
12410 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 ent_expansion(ss
12420 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 l);...LAPPEND_ST
12430 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
12440 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c , "compression",
12450 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 comp ? SSL_COMP
12460 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 _get_name(comp)
12470 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 : "none", -1);..
12480 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12490 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 rp, objPtr, "exp
124a0 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 ansion", expn ?
124b0 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d SSL_COMP_get_nam
124c0 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 e(expn) : "none"
124d0 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 , -1);.#else..LA
124e0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
124f0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 , objPtr, "compr
12500 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c ession", "none",
12510 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 -1);..LAPPEND_S
12520 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12530 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 r, "expansion",
12540 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e "none", -1);.#en
12550 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f dif. }.. /
12560 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f * Server info */
12570 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 . {..long mod
12580 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f e = SSL_CTX_get_
12590 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f session_cache_mo
125a0 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 de(statePtr->ctx
125b0 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a );..char *msg;..
125c0 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f .if (mode & SSL_
125d0 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 SESS_CACHE_OFF)
125e0 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 {.. msg = "of
125f0 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 f";..} else if (
12600 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
12610 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a CACHE_CLIENT) {.
12620 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 . msg = "clie
12630 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 nt";..} else if
12640 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 (mode & SSL_SESS
12650 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b _CACHE_SERVER) {
12660 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 .. msg = "ser
12670 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 ver";..} else if
12680 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
12690 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a S_CACHE_BOTH) {.
126a0 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 . msg = "both
126b0 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 ";..} else {..
126c0 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e msg = "unknown
126d0 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 ";..}..LAPPEND_S
126e0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
126f0 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 r, "session_cach
12700 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 e_mode", msg, -1
12710 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
12720 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 CA List */.
12730 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 /* IF not a serv
12740 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f er, same as SSL_
12750 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 get0_peer_CA_lis
12760 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 6d t. If server sam
12770 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 e as SSL_CTX_get
12780 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 _client_CA_list
12790 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d */. listPtr =
127a0 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
127b0 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 0, NULL);. ST
127c0 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 ACK_OF(X509_NAME
127d0 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 ) *ca_list;.
127e0 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 if ((ca_list = S
127f0 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 SL_get_client_CA
12800 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e _list(ssl)) != N
12810 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 ULL) {..char buf
12820 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f fer[BUFSIZ];..fo
12830 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 r (int i = 0; i
12840 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e < sk_X509_NAME_n
12850 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b um(ca_list); i++
12860 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 ) {.. X509_NA
12870 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 ME *name = sk_X5
12880 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 09_NAME_value(ca
12890 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 _list, i);..
128a0 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 if (name) {...X5
128b0 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 09_NAME_oneline(
128c0 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 name, buffer, BU
128d0 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 FSIZ);...Tcl_Lis
128e0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
128f0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 t(interp, listPt
12900 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
12910 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 Obj(buffer, -1))
12920 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 ;.. }..}.
12930 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 }. LAPPEND_OB
12940 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 J(interp, objPtr
12950 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 , "caList", list
12960 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e Ptr);. LAPPEN
12970 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
12980 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 jPtr, "caListCou
12990 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d nt", sk_X509_NAM
129a0 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b E_num(ca_list));
129b0 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
129c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
129d0 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
129e0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
129f0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
12a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a30 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 -------. *. * Ve
12a40 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 rsionObjCmd -- r
12a50 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 eturn version st
12a60 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 ring from OpenSS
12a70 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 L.. *. * Results
12a80 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
12a90 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
12aa0 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
12ab0 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b00 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
12b10 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 0a .VersionObjCmd(.
12b20 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 TCL_UNUSED(v
12b30 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f oid *),. Tcl_
12b40 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a Interp *interp,.
12b50 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 69 TCL_UNUSED(i
12b60 6e 74 29 20 2f 2a 20 6f 62 6a 63 20 2a 2f 2c 0a nt) /* objc */,.
12b70 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 54 TCL_UNUSED(T
12b80 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 29 cl_Obj *const *)
12b90 20 2f 2a 20 6f 62 6a 76 20 2a 2f 29 0a 7b 0a 20 /* objv */).{.
12ba0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
12bb0 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 tr;.. dprintf
12bc0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
12bd0 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 objPtr = Tcl_Ne
12be0 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 wStringObj(OPENS
12bf0 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c SL_VERSION_TEXT,
12c00 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 -1);.. Tcl_S
12c10 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
12c20 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
12c30 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
12c40 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
12c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
12c90 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d * MiscObjCmd --
12ca0 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 misc commands.
12cb0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
12cc0 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
12cd0 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
12ce0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
12cf0 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
12d40 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 /.static int.Mis
12d50 63 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c cObjCmd(. TCL
12d60 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c _UNUSED(void *),
12d70 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
12d80 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 *interp,. int
12d90 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f objc,. Tcl_O
12da0 62 6a 09 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj.*const objv[]
12db0 29 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 ).{. static c
12dc0 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 onst char *comma
12dd0 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 nds [] = { "req"
12de0 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c , "strreq", NULL
12df0 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d };. enum com
12e00 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f mand { C_REQ, C_
12e10 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 STRREQ, C_DUMMY
12e20 7d 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 };. Tcl_Size
12e30 63 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 cmd;. int isS
12e40 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 tr;. char buf
12e50 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 20 fer[16384];..
12e60 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
12e70 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
12e80 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 c < 2) {..Tcl_Wr
12e90 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
12ea0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 p, 1, objv, "sub
12eb0 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 command ?args?")
12ec0 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
12ed0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
12ee0 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 f (Tcl_GetIndexF
12ef0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
12f00 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 bjv[1], commands
12f10 2c 0a 09 20 20 20 20 22 63 6f 6d 6d 61 6e 64 22 ,.. "command"
12f20 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 43 4c , 0,&cmd) != TCL
12f30 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
12f40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
12f50 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
12f60 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 rror();.. isS
12f70 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 tr = (cmd == C_S
12f80 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 TRREQ);. swit
12f90 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e ch ((enum comman
12fa0 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 d) cmd) {..case
12fb0 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 C_REQ:..case C_S
12fc0 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 TRREQ: {.. EV
12fd0 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c P_PKEY *pkey=NUL
12fe0 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 L;.. X509 *ce
12ff0 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 rt=NULL;.. X5
13000 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 09_NAME *name=NU
13010 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a LL;.. Tcl_Obj
13020 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 **listv;.. T
13030 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 2c 69 3b cl_Size listc,i;
13040 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d ... BIO *out=
13050 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 6f 6e 73 NULL;... cons
13060 74 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a t char *k_C="",*
13070 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c k_ST="",*k_L="",
13080 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 *k_O="",*k_OU=""
13090 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 ,*k_CN="",*k_Ema
130a0 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 il="";.. char
130b0 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 *keyout,*pemout
130c0 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 ,*str;.. int
130d0 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 keysize,serial=0
130e0 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 ,days=365;..#if
130f0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
13100 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
13110 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 000L.. BIGNUM
13120 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 *bne = NULL;..
13130 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 RSA *rsa = NU
13140 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 LL;.#else.. E
13150 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 VP_PKEY_CTX *ctx
13160 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a = NULL;.#endif.
13170 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c .. if ((objc<
13180 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 5) || (objc>6))
13190 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {...Tcl_WrongNum
131a0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 Args(interp, 2,
131b0 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b objv, "keysize k
131c0 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 eyfile certfile
131d0 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 ?info?");...retu
131e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
131f0 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 }... if (T
13200 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
13210 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d (interp, objv[2]
13220 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 , &keysize) != T
13230 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 CL_OK) {...retur
13240 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
13250 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d }.. keyout=
13260 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
13270 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d jv[3]);.. pem
13280 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e out=Tcl_GetStrin
13290 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 g(objv[4]);..
132a0 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 if (isStr) {...
132b0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 Tcl_SetVar(inter
132c0 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a p,keyout,"",0);.
132d0 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 ..Tcl_SetVar(int
132e0 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 erp,pemout,"",0)
132f0 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 ;.. }... i
13300 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 f (objc>=6) {...
13310 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 if (Tcl_ListObjG
13320 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 etElements(inter
13330 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 p, objv[5], &lis
13340 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 tc, &listv) != T
13350 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 CL_OK) {... r
13360 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
13370 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 ...}....if ((lis
13380 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 tc%2) != 0) {...
13390 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
133a0 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d t(interp,"Inform
133b0 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 ation list must
133c0 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 have even number
133d0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e of arguments",N
133e0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 ULL);... retu
133f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
13400 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c }...for (i=0; i<
13410 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 listc; i+=2) {..
13420 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 . str=Tcl_Get
13430 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 String(listv[i])
13440 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63 ;... if (strc
13450 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d mp(str,"days")==
13460 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 0) {....if (Tcl_
13470 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e GetIntFromObj(in
13480 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c terp,listv[i+1],
13490 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a &days)!=TCL_OK).
134a0 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
134b0 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d L_ERROR;... }
134c0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
134d0 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d (str,"serial")==
134e0 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 0) {....if (Tcl_
134f0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e GetIntFromObj(in
13500 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c terp,listv[i+1],
13510 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b &serial)!=TCL_OK
13520 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 ).... return
13530 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
13540 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
13550 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 mp(str,"C")==0)
13560 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 {....k_C=Tcl_Get
13570 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
13580 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
13590 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
135a0 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b "ST")==0) {....k
135b0 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e _ST=Tcl_GetStrin
135c0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
135d0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
135e0 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d strcmp(str,"L")=
135f0 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c =0) {....k_L=Tcl
13600 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
13610 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
13620 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
13630 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 str,"O")==0) {..
13640 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 ..k_O=Tcl_GetStr
13650 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
13660 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
13670 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 (strcmp(str,"OU
13680 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 ")==0) {....k_OU
13690 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
136a0 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
136b0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
136c0 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 cmp(str,"CN")==0
136d0 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f ) {....k_CN=Tcl_
136e0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
136f0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
13700 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
13710 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 tr,"Email")==0)
13720 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c {....k_Email=Tcl
13730 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
13740 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
13750 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 else {....Tcl_Se
13760 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
13770 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 Unknown paramete
13780 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 r",NULL);....ret
13790 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
137a0 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 . }...}..
137b0 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 }..#if OPENSSL_V
137c0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
137d0 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 0x30000000L..
137e0 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b bne = BN_new();
137f0 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f .. rsa = RSA_
13800 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 new();.. pkey
13810 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 = EVP_PKEY_new(
13820 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 );.. if (bne
13830 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d == NULL || rsa =
13840 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d = NULL || pkey =
13850 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 = NULL || !BN_se
13860 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 t_word(bne,RSA_F
13870 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 4) ||...!RSA_gen
13880 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 erate_key_ex(rsa
13890 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 , keysize, bne,
138a0 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b NULL) || !EVP_PK
138b0 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b EY_assign_RSA(pk
138c0 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 ey, rsa)) {...EV
138d0 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 P_PKEY_free(pkey
138e0 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 );.../* RSA_free
138f0 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 (rsa); freed by
13900 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f EVP_PKEY_free */
13910 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b ...BN_free(bne);
13920 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 .#else.. pkey
13930 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 = EVP_RSA_gen((
13940 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 unsigned int) ke
13950 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 ysize);.. ctx
13960 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f = EVP_PKEY_CTX_
13970 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a new(pkey,NULL);.
13980 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d . if (pkey ==
13990 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 NULL || ctx ==
139a0 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 NULL || !EVP_PKE
139b0 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 Y_keygen_init(ct
139c0 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 x) ||...!EVP_PKE
139d0 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 Y_CTX_set_rsa_ke
139e0 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b ygen_bits(ctx, k
139f0 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f eysize) || !EVP_
13a00 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c PKEY_keygen(ctx,
13a10 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 &pkey)) {...EVP
13a20 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
13a30 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 ;...EVP_PKEY_CTX
13a40 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 _free(ctx);.#end
13a50 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 if...Tcl_SetResu
13a60 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 lt(interp,"Error
13a70 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 generating priv
13a80 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a ate key",NULL);.
13a90 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
13aa0 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 OR;.. } else
13ab0 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b {...if (isStr) {
13ac0 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e ... out=BIO_n
13ad0 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b ew(BIO_s_mem());
13ae0 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 ... PEM_write
13af0 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 _bio_PrivateKey(
13b00 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 out,pkey,NULL,NU
13b10 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b LL,0,NULL,NULL);
13b20 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 ... i=BIO_rea
13b30 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a d(out,buffer,siz
13b40 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a eof(buffer)-1);.
13b50 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 .. i=(i<0) ?
13b60 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 0 : i;... buf
13b70 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 fer[i]='\0';...
13b80 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e Tcl_SetVar(in
13b90 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 terp,keyout,buff
13ba0 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f er,0);... BIO
13bb0 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 _flush(out);...
13bc0 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 BIO_free(out)
13bd0 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 ;...} else {...
13be0 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
13bf0 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 IO_s_file());...
13c00 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 BIO_write_fi
13c10 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 lename(out,keyou
13c20 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 t);... PEM_wr
13c30 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b ite_bio_PrivateK
13c40 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c ey(out,pkey,NULL
13c50 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c ,NULL,0,NULL,NUL
13c60 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d L);... /* PEM
13c70 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 _write_bio_RSAPr
13c80 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 ivateKey(out, rs
13c90 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 a, NULL, NULL, 0
13ca0 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a , NULL, NULL); *
13cb0 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 /... BIO_free
13cc0 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a _all(out);.. .}.
13cd0 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 ...if ((cert=X50
13ce0 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 9_new())==NULL)
13cf0 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 {... Tcl_SetR
13d00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 esult(interp,"Er
13d10 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 ror generating c
13d20 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65 ertificate reque
13d30 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 st",NULL);...
13d40 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 EVP_PKEY_free(p
13d50 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 key);.#if OPENSS
13d60 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
13d70 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
13d80 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 . BN_free(bne
13d90 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 );.#endif...
13da0 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
13db0 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 );...}....X509_s
13dc0 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c et_version(cert,
13dd0 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 2);...ASN1_INTEG
13de0 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f ER_set(X509_get_
13df0 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 serialNumber(cer
13e00 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 t),serial);...X5
13e10 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 09_gmtime_adj(X5
13e20 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 09_getm_notBefor
13e30 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 e(cert),0);...X5
13e40 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 09_gmtime_adj(X5
13e50 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 09_getm_notAfter
13e60 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a (cert),(long)60*
13e70 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 60*24*days);...X
13e80 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 509_set_pubkey(c
13e90 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 ert,pkey);....na
13ea0 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a me=X509_get_subj
13eb0 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a ect_name(cert);.
13ec0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
13ed0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
13ee0 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 me,"C", MBSTRING
13ef0 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 _ASC, (unsigned
13f00 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c char *) k_C, -1,
13f10 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
13f20 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
13f30 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c y_txt(name,"ST",
13f40 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
13f50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
13f60 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 k_ST, -1, -1, 0
13f70 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
13f80 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
13f90 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 name,"L", MBSTRI
13fa0 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 NG_ASC, (unsigne
13fb0 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d d char *) k_L, -
13fc0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
13fd0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
13fe0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 _by_txt(name,"O"
13ff0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
14000 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
14010 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 ) k_O, -1, -1, 0
14020 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
14030 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
14040 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 name,"OU", MBSTR
14050 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e ING_ASC, (unsign
14060 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c ed char *) k_OU,
14070 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
14080 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
14090 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
140a0 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 CN", MBSTRING_AS
140b0 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 C, (unsigned cha
140c0 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d r *) k_CN, -1, -
140d0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
140e0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
140f0 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 txt(name,"Email"
14100 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
14110 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
14120 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d ) k_Email, -1, -
14130 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 1, 0);....X509_s
14140 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 et_subject_name(
14150 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 cert,name);....i
14160 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 f (!X509_sign(ce
14170 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 rt,pkey,EVP_sha2
14180 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 56())) {... X
14190 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 509_free(cert);.
141a0 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 .. EVP_PKEY_f
141b0 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
141c0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
141d0 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
141e0 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 00L... BN_fre
141f0 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 e(bne);.#endif..
14200 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
14210 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 lt(interp,"Error
14220 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 signing certifi
14230 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 cate",NULL);...
14240 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
14250 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 ROR;...}....if (
14260 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f isStr) {... o
14270 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
14280 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 _mem());... P
14290 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 EM_write_bio_X50
142a0 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 9(out,cert);...
142b0 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 i=BIO_read(ou
142c0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 t,buffer,sizeof(
142d0 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 buffer)-1);...
142e0 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 i=(i<0) ? 0 :
142f0 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b i;... buffer[
14300 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 i]='\0';... T
14310 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
14320 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 ,pemout,buffer,0
14330 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 );... BIO_flu
14340 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 sh(out);... B
14350 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 IO_free(out);...
14360 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f } else {... o
14370 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
14380 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 _file());...
14390 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
143a0 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a me(out,pemout);.
143b0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
143c0 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 bio_X509(out,cer
143d0 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 t);... BIO_fr
143e0 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d ee_all(out);...}
143f0 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 ....X509_free(ce
14400 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f rt);...EVP_PKEY_
14410 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
14420 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
14430 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
14440 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 000L...BN_free(b
14450 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 ne);.#endif..
14460 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 }..}..break;.
14470 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 default:..brea
14480 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 k;. }. ret
14490 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
144a0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
144b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144e0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
144f0 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a ls_Free --. *. *
14500 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
14510 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 cleans up when a
14520 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
14530 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 d channel. *.is
14540 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 closed and its r
14550 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 eference count f
14560 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a alls below 1. *.
14570 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e * Results:. *.n
14580 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
14590 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 ffects:. *.Frees
145a0 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 all the state.
145b0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
145c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145f0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
14600 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 .#if TCL_MAJOR_V
14610 45 52 53 49 4f 4e 20 3e 20 38 0a 54 6c 73 5f 46 ERSION > 8.Tls_F
14620 72 65 65 28 20 76 6f 69 64 20 2a 62 6c 6f 63 6b ree( void *block
14630 50 74 72 20 29 0a 23 65 6c 73 65 0a 54 6c 73 5f Ptr ).#else.Tls_
14640 46 72 65 65 28 20 63 68 61 72 20 2a 62 6c 6f 63 Free( char *bloc
14650 6b 50 74 72 20 29 0a 23 65 6e 64 69 66 0a 7b 0a kPtr ).#endif.{.
14660 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
14670 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 Ptr = (State *)b
14680 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 lockPtr;.. dp
14690 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
146a0 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 .. Tls_Clean(
146b0 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 statePtr);. c
146c0 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b kfree(blockPtr);
146d0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
146e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
146f0 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a -------------. *
14720 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d . * Tls_Clean --
14730 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
14740 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 edure cleans up
14750 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
14760 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
14770 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 *.is closed and
14780 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 its reference c
14790 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 ount falls below
147a0 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 1. This should
147b0 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 . *.be called sy
147c0 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 nchronously by t
147d0 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f he CloseProc, no
147e0 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e t in the. *.Even
147f0 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 tuallyFree callb
14800 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ack.. *. * Resul
14810 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 ts:. *.none. *.
14820 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
14830 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 *.Frees all the
14840 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d state. *. *----
14850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a ---------------.
14890 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 */.void Tls_Cle
148a0 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 an(State *stateP
148b0 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 tr) {. dprint
148c0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
148d0 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 /*. * we'r
148e0 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 e assuming here
148f0 74 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c that we're singl
14900 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 e-threaded.
14910 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
14920 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 Ptr->timer != (T
14930 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
14940 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 ULL) {..Tcl_Dele
14950 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 teTimerHandler(s
14960 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b tatePtr->timer);
14970 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 ..statePtr->time
14980 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a r = NULL;. }.
14990 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
149a0 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b r->protos) {..ck
149b0 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 free(statePtr->p
149c0 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 rotos);..statePt
149d0 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c r->protos = NULL
149e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
149f0 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b statePtr->bio) {
14a00 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 ../* This will c
14a10 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e all SSL_shutdown
14a20 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f . Bug 1414045 */
14a30 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 ..dprintf("BIO_f
14a40 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 ree_all(%p)", st
14a50 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 atePtr->bio);..B
14a60 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 IO_free_all(stat
14a70 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 ePtr->bio);..sta
14a80 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c tePtr->bio = NUL
14a90 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
14aa0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 (statePtr->ssl)
14ab0 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f {..dprintf("SSL_
14ac0 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 free(%p)", state
14ad0 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f Ptr->ssl);..SSL_
14ae0 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 free(statePtr->s
14af0 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e sl);..statePtr->
14b00 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ssl = NULL;.
14b10 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
14b20 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f tr->ctx) {..SSL_
14b30 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 CTX_free(statePt
14b40 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 r->ctx);..stateP
14b50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a tr->ctx = NULL;.
14b60 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
14b70 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
14b80 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 ) {..Tcl_DecrRef
14b90 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
14ba0 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 callback);..stat
14bb0 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
14bc0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
14bd0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
14be0 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f assword) {..Tcl_
14bf0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 DecrRefCount(sta
14c00 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
14c10 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 ;..statePtr->pas
14c20 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 sword = NULL;.
14c30 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
14c40 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 ePtr->vcmd) {..T
14c50 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
14c60 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
14c70 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 ..statePtr->vcmd
14c80 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a = NULL;. }..
14c90 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
14ca0 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a urning");.}.../*
14cb0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
14cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14cf0 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
14d00 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 _Init --. *. *.T
14d10 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 his is a package
14d20 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 initialization
14d30 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 procedure, which
14d40 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 is called. *.by
14d50 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 Tcl when this p
14d60 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 ackage is to be
14d70 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 added to an inte
14d80 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 rpreter.. *. * R
14d90 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e esults: Ssl con
14da0 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 figured and load
14db0 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ed. *. * Side ef
14dc0 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 fects:. *. creat
14dd0 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e e the ssl comman
14de0 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 d, initialize ss
14df0 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d l context. *. *-
14e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e40 2d 2d 0a 20 2a 2f 0a 0a 44 4c 4c 45 58 50 4f 52 --. */..DLLEXPOR
14e50 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 0a T int Tls_Init(.
14e60 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
14e70 69 6e 74 65 72 70 29 0a 7b 0a 20 20 20 20 63 6f interp).{. co
14e80 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 nst char tlsTclI
14e90 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a nitScript[] = {.
14ea0 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 #include "tls.tc
14eb0 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d l.h"..0x00. }
14ec0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
14ed0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
14ee0 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 f (Tcl_InitStubs
14ef0 28 69 6e 74 65 72 70 2c 20 22 38 2e 36 2d 22 2c (interp, "8.6-",
14f00 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 0) == NULL) {..
14f10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
14f20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
14f30 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 (TlsLibInit(0) !
14f40 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c = TCL_OK) {..Tcl
14f50 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
14f60 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 terp, "could not
14f70 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 initialize SSL
14f80 6c 69 62 72 61 72 79 22 2c 20 28 63 68 61 72 20 library", (char
14f90 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e *)NULL);..return
14fa0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
14fb0 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 }.. Tcl_Creat
14fc0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
14fd0 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 rp, "tls::cipher
14fe0 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d s", CiphersObjCm
14ff0 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 d, NULL, 0);.
15000 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
15010 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
15020 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c ls::connection",
15030 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f ConnectionInfoO
15040 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b bjCmd, NULL, 0);
15050 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
15060 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
15070 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b , "tls::handshak
15080 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a e", HandshakeObj
15090 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 Cmd, NULL, 0);.
150a0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
150b0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
150c0 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 "tls::import", I
150d0 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 4e 55 4c mportObjCmd, NUL
150e0 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 L, 0);. Tcl_C
150f0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
15100 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e interp, "tls::un
15110 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 import", Unimpor
15120 74 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 tObjCmd, NULL, 0
15130 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
15140 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
15150 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 rp, "tls::status
15160 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c ", StatusObjCmd,
15170 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 NULL, 0);. T
15180 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
15190 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
151a0 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 ::version", Vers
151b0 69 6f 6e 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c ionObjCmd, NULL,
151c0 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 0);. Tcl_Cre
151d0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
151e0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 terp, "tls::misc
151f0 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 4e ", MiscObjCmd, N
15200 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c ULL, 0);. Tcl
15210 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
15220 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
15230 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 protocols", Prot
15240 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 4e 55 4c ocolsObjCmd, NUL
15250 4c 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 20 28 L, 0);.. if (
15260 69 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 interp) {..Tcl_E
15270 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 val(interp, tlsT
15280 63 6c 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 clInitScript);.
15290 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e }.. return
152a0 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 Tcl_PkgProvide(
152b0 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f interp, PACKAGE_
152c0 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 NAME, PACKAGE_VE
152d0 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a RSION);.}../*. *
152e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
152f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15310 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c ------*. *. *.Tl
15320 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a s_SafeInit --. *
15330 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
15340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15360 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 ----*. *.Standar
15370 64 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 d procedure requ
15380 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a ired by 'load'..
15390 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 *.Initializes t
153a0 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f his extension fo
153b0 72 20 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 r a safe interpr
153c0 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d eter.. *.-------
153d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
153e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
153f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a ---------*. *. *
15400 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 .Side effects:.
15410 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e *..As of 'Tls_In
15420 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 it'. *. *.Result
15430 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 :. *..A standard
15440 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e Tcl error code.
15450 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
15460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
15490 2f 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 /..DLLEXPORT int
154a0 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 Tls_SafeInit(Tc
154b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
154c0 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ) {. dprintf(
154d0 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 "Called");. r
154e0 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 eturn(Tls_Init(i
154f0 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 nterp));.}../*.
15500 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
15510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15530 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 -------*. *. *.T
15540 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a lsLibInit --. *.
15550 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.-------------
15560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15580 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 ---*. *.Initiali
15590 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 zes SSL library
155a0 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 once per applica
155b0 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d tion. *.--------
155c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
155d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
155e0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
155f0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
15600 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 ..initializes SS
15610 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 L library. *. *.
15620 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 Result:. *..none
15630 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
15640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
15670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 /.static int Tls
15680 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e LibInit(int unin
15690 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 itialize) {.
156a0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 static int initi
156b0 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 alized = 0;.
156c0 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c int status = TCL
156d0 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 _OK;.#if defined
156e0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
156f0 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
15700 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 73 69 _THREADS). si
15710 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a ze_t num_locks;.
15720 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 #endif.. if (
15730 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a uninitialize) {.
15740 09 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 .if (!initialize
15750 64 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 d) {.. dprint
15760 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e f("Asked to unin
15770 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 itialize, but we
15780 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c are not initial
15790 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 ized");... re
157a0 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d turn(TCL_OK);..}
157b0 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 ...dprintf("Aske
157c0 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a d to uninitializ
157d0 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 e");..#if define
157e0 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
157f0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
15800 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f L_THREADS)..Tcl_
15810 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f MutexLock(&init_
15820 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 mx);...if (locks
15830 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28 6c 6f ) {.. free(lo
15840 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 cks);.. locks
15850 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f = NULL;.. lo
15860 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d cksCount = 0;..}
15870 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c .#endif..initial
15880 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 ized = 0;..#if d
15890 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
158a0 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
158b0 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
158c0 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b .Tcl_MutexUnlock
158d0 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 (&init_mx);.#end
158e0 69 66 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f if...return(TCL_
158f0 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OK);. }..
15900 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 if (initialized)
15910 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c {..dprintf("Cal
15920 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20 63 led, but using c
15930 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a 09 ached value");..
15940 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a return(status);.
15950 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
15960 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 tf("Called");..#
15970 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
15980 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
15990 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
159a0 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 DS). Tcl_Mute
159b0 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b xLock(&init_mx);
159c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 .#endif. init
159d0 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 ialized = 1;..#i
159e0 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
159f0 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
15a00 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
15a10 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 S). num_locks
15a20 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 = 1;. locksC
15a30 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d ount = (int) num
15a40 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b _locks;. lock
15a50 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f s = malloc(sizeo
15a60 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f f(*locks) * num_
15a70 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 locks);. mems
15a80 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a et(locks, 0, siz
15a90 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 eof(*locks) * nu
15aa0 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 m_locks);.#endif
15ab0 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c .. /* Initial
15ac0 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 ize BOTH libcryp
15ad0 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a to and libssl. *
15ae0 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e /. OPENSSL_in
15af0 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 it_ssl(OPENSSL_I
15b00 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 NIT_LOAD_SSL_STR
15b10 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 INGS | OPENSSL_I
15b20 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f NIT_LOAD_CRYPTO_
15b30 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 STRINGS..| OPENS
15b40 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f SL_INIT_ADD_ALL_
15b50 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 CIPHERS | OPENSS
15b60 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 L_INIT_ADD_ALL_D
15b70 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a IGESTS, NULL);..
15b80 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 BIO_new_tcl(
15b90 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 64 NULL, 0);..#if d
15ba0 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
15bb0 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
15bc0 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
15bd0 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c Tcl_MutexUnl
15be0 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 ock(&init_mx);.#
15bf0 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 endif.. retur
15c00 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a n(status);.}.