0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61 (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69 some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68 ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32 pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72 ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79 poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53 right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29 *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61 2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68 st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64 * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61 dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64 .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74 ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 full fileevent
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 Also work done
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68 ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 e impetus to do
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 pts.h".#include
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 rsa.h>.#include
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61 <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72 10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76 "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69 1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72 dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29 #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74 r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69 _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 ar *key,...char
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 tes, int level,
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 mask))..#define
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74 /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65 L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23 "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72 endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64 ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64 _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65 slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69 ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42 g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74 ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20 o/cryptlib.c of
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70 OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74 enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63 t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53 .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65 SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45 ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a ADS */..../*****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
09a0: 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 ./* Callbacks
09b0: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 --------. *. * E
0a20: 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d val Callback Com
0a30: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 mand --. *. *.Ev
0a40: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
0a50: 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e and and catch an
0a60: 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 y errors. *. * R
0a70: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43 esults:. *.0 = C
0a80: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20 ommand returned
0a90: 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74 fail or eval ret
0aa0: 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a urned TCL_ERROR.
0ab0: 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 *.1 = Command r
0ac0: 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20 eturned success
0ad0: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64 or eval returned
0ae0: 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 TCL_OK. *. * Si
0af0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45 de effects:. *.E
0b00: 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63 valuates callbac
0b10: 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d k command. *. *-
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b60: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
0b70: 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54 t.EvalCallback(T
0b80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
0b90: 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 p, State *stateP
0ba0: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 tr, Tcl_Obj *cmd
0bb0: 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63 Ptr) {. int c
0bc0: 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 ode, ok = 0;..
0bd0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
0be0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
0bf0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 rp);. Tcl_Pre
0c00: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 serve((ClientDat
0c10: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
0c20: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
0c30: 61 63 6b 20 77 69 74 68 20 73 75 63 63 65 73 73 ack with success
0c40: 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75 72 for ok or retur
0c50: 6e 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c 20 n value 1, fail
0c60: 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65 74 for error or ret
0c70: 75 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a 20 urn value 0 */.
0c80: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 Tcl_ResetResu
0c90: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 lt(interp);.
0ca0: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f code = Tcl_EvalO
0cb0: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 bjEx(interp, cmd
0cc0: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c Ptr, TCL_EVAL_GL
0cd0: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 OBAL);. if (c
0ce0: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b ode == TCL_OK) {
0cf0: 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c ../* Check resul
0d00: 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c t for return val
0d10: 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a ue */..Tcl_Obj *
0d20: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 result = Tcl_Get
0d30: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
0d40: 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d );..if (result =
0d50: 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 = NULL || Tcl_Ge
0d60: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 tIntFromObj(inte
0d70: 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 rp, result, &ok)
0d80: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 != TCL_OK) {..
0d90: 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 20 ok = 1;..}.
0da0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 } else {../* E
0db0: 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 rror - reject th
0dc0: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f e certificate */
0dd0: 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f .#if (TCL_MAJOR_
0de0: 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 VERSION == 8) &&
0df0: 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 (TCL_MINOR_VERS
0e00: 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 ION < 6)..Tcl_Ba
0e10: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e ckgroundError(in
0e20: 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 terp);.#else..Tc
0e30: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 l_BackgroundExce
0e40: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f ption(interp, co
0e50: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 de);.#endif.
0e60: 7d 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 }.. Tcl_Relea
0e70: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
0e80: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 statePtr);. T
0e90: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
0ea0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
0eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a . return ok;.
0ec0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
0f10: 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 * InfoCallback
0f20: 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 --. *. *.Monitor
0f30: 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e s SSL connection
0f40: 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52 process. *. * R
0f50: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
0f60: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
0f70: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
0f80: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
0f90: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d). *. *--------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
0fe0: 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f static void.Info
0ff0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
1000: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 SL *ssl, int whe
1010: 72 65 2c 20 69 6e 74 20 72 65 74 29 20 7b 0a 20 re, int ret) {.
1020: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
1030: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr = (State*)SSL
1040: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 _get_app_data((S
1050: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 SL *)ssl);. T
1060: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
1070: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
1080: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
1090: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 j *cmdPtr;. c
10a0: 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72 har *major; char
10b0: 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 *minor;.. dp
10c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
10d0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
10e0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 tr->callback ==
10f0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a (Tcl_Obj*)NULL).
1100: 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 .return;.. if
1110: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 (where & SSL_CB
1120: 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54 _HANDSHAKE_START
1130: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 ) {..major = "ha
1140: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 ndshake";..minor
1150: 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20 = "start";.
1160: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 } else if (where
1170: 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 & SSL_CB_HANDSH
1180: 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a AKE_DONE) {..maj
1190: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 or = "handshake"
11a0: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 ;..minor = "done
11b0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ";. } else {.
11c0: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c .if (where & SSL
11d0: 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f _CB_ALERT)..majo
11e0: 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c r = "alert";..el
11f0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
1200: 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d SL_ST_CONNECT).m
1210: 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22 ajor = "connect"
1220: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1230: 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50 e & SSL_ST_ACCEP
1240: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63 T)..major = "acc
1250: 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 ept";..else.....
1260: 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e major = "unknown
1270: 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26 ";...if (where &
1280: 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d SSL_CB_READ)..m
1290: 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09 inor = "read";..
12a0: 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 else if (where &
12b0: 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09 SSL_CB_WRITE)..
12c0: 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b minor = "write";
12d0: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 ..else if (where
12e0: 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 & SSL_CB_LOOP).
12f0: 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b .minor = "loop";
1300: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 ..else if (where
1310: 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09 & SSL_CB_EXIT).
1320: 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b .minor = "exit";
1330: 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72 ..else.....minor
1340: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 = "unknown";.
1350: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
1360: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
1370: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 al */. cmdPtr
1380: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
1390: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
13a0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c llback);. Tcl
13b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
13c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
13d0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
13e0: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d ingObj("info", -
13f0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
1400: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1410: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
1420: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
1430: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
1440: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
1450: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
1460: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1470: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1480: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1490: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
14a0: 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20 major, -1));.
14b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
14c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
14d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
14e0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72 wStringObj(minor
14f0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20 , -1));.. if
1500: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1510: 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69 ALERT) {..Tcl_Li
1520: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1530: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1540: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
1550: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 tringObj(SSL_ale
1560: 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c rt_desc_string_l
1570: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a ong(ret), -1));.
1580: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
1590: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
15a0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
15b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
15c0: 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 SSL_alert_type_s
15d0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c tring_long(ret),
15e0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 -1));. } els
15f0: 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a e {..Tcl_ListObj
1600: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1610: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
1620: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
1630: 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 Obj(SSL_state_st
1640: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 ring_long(ssl),
1650: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
1660: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1670: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1680: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1690: 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 ("info", -1));.
16a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 }.. /* Eva
16b0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
16c0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
16d0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
16e0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
16f0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
1700: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
1710: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
1720: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a ount(cmdPtr);.}.
1730: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
1780: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b MessageCallback
1790: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f --. *. *.Monito
17a0: 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 rs SSL protocol
17b0: 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52 messages. *. * R
17c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
17d0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
17e0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
17f0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
1800: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d). *. *--------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
1850: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f #ifndef OPENSSL_
1860: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 61 NO_SSL_TRACE.sta
1870: 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 65 tic void.Message
1880: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 69 Callback(int wri
1890: 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 6f te_p, int versio
18a0: 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f 74 n, int content_t
18b0: 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 ype, const void
18c0: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 6e *buf, size_t len
18d0: 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 64 , SSL *ssl, void
18e0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
18f0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
1900: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 State*)arg;.
1910: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
1920: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
1930: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
1940: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
1950: 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 65 char *ver, *type
1960: 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a ;. BIO *bio;.
1970: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b char buffer[
1980: 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 66 15000];. buff
1990: 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 er[0] = 0;..
19a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
19b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
19c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
19d0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
19e0: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 )..return;..
19f0: 73 77 69 74 63 68 28 76 65 72 73 69 6f 6e 29 20 switch(version)
1a00: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 {.#if OPENSSL_VE
1a10: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
1a20: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
1a30: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
1a40: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
1a50: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
1a60: 20 63 61 73 65 20 53 53 4c 32 5f 56 45 52 53 49 case SSL2_VERSI
1a70: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 ON:..ver = "SSLv
1a80: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 2";..break;.#end
1a90: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
1aa0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
1ab0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
1ac0: 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20 53 SSL3). case S
1ad0: 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 SL3_VERSION:..ve
1ae0: 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62 72 r = "SSLv3";..br
1af0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
1b00: 63 61 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f case TLS1_VERSIO
1b10: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 N:..ver = "TLSv1
1b20: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 ";..break;. c
1b30: 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 ase TLS1_1_VERSI
1b40: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 ON:..ver = "TLSv
1b50: 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 1.1";..break;.
1b60: 20 20 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 case TLS1_2_VE
1b70: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 RSION:..ver = "T
1b80: 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b LSv1.2";..break;
1b90: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33 . case TLS1_3
1ba0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d _VERSION:..ver =
1bb0: 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 "TLSv1.3";..bre
1bc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a ak;. case 0:.
1bd0: 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 .ver = "none";..
1be0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 break;. defau
1bf0: 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e lt:..ver = "unkn
1c00: 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 own";..break;.
1c10: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 }.. switch
1c20: 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b (content_type) {
1c30: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1c40: 54 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 T_HEADER:..type
1c50: 3d 20 22 48 65 61 64 65 72 22 3b 0a 09 62 72 65 = "Header";..bre
1c60: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c ak;. case SSL
1c70: 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 3_RT_INNER_CONTE
1c80: 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d NT_TYPE:..type =
1c90: 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 "Inner Content
1ca0: 54 79 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 Type";..break;.
1cb0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f case SSL3_RT_
1cc0: 43 48 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 CHANGE_CIPHER_SP
1cd0: 45 43 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 61 EC:..type = "Cha
1ce0: 6e 67 65 20 43 69 70 68 65 72 22 3b 0a 09 62 72 nge Cipher";..br
1cf0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 eak;. case SS
1d00: 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 L3_RT_ALERT:..ty
1d10: 70 65 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 pe = "Alert";..b
1d20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 reak;. case S
1d30: 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 SL3_RT_HANDSHAKE
1d40: 3a 0a 09 74 79 70 65 20 3d 20 22 48 61 6e 64 73 :..type = "Hands
1d50: 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 hake";..break;.
1d60: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f case SSL3_RT_
1d70: 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 APPLICATION_DATA
1d80: 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70 20 44 :..type = "App D
1d90: 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 ata";..break;.
1da0: 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54 5f case DTLS1_RT_
1db0: 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70 65 HEARTBEAT:..type
1dc0: 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b 0a = "Heartbeat";.
1dd0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 .break;. defa
1de0: 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e ult:..type = "un
1df0: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 known";. }..
1e00: 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 /* Needs comp
1e10: 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 ile time option
1e20: 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 "enable-ssl-trac
1e30: 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 e". */. if ((
1e40: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 bio = BIO_new(BI
1e50: 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e O_s_mem())) != N
1e60: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 ULL) {..int n;..
1e70: 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f SSL_trace(write_
1e80: 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 p, version, cont
1e90: 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c ent_type, buf, l
1ea0: 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a en, ssl, (void *
1eb0: 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f )bio);..n = BIO_
1ec0: 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 read(bio, buffer
1ed0: 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e , min(BIO_pendin
1ee0: 67 28 62 69 6f 29 2c 20 31 34 39 39 39 29 29 3b g(bio), 14999));
1ef0: 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20 ..n = (n<0) ? 0
1f00: 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20 : n;..buffer[n]
1f10: 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f = 0;..(void)BIO_
1f20: 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 42 49 4f flush(bio);..BIO
1f30: 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 7d _free(bio);. }
1f40: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
1f50: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
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 56 65 72 69 66 79 3a 20 25 64 intf("Verify: %d
29a0: 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20 ", ok);.. if
29b0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 (statePtr->vcmd
29c0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
29d0: 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65 50 L) {..if (stateP
29e0: 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c tr->vflags & SSL
29f0: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f _VERIFY_FAIL_IF_
2a00: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a NO_PEER_CERT) {.
2a10: 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a . return ok;.
2a20: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 .} else {.. r
2a30: 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 eturn 1;..}.
2a40: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 } else if (cert
2a50: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d == NULL || ssl =
2a60: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
2a70: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 n 0;. }..
2a80: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
2a90: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 d to eval */.
2aa0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
2ab0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
2ac0: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 Ptr->vcmd);.
2ad0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2ae0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2af0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2b00: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 StringObj("verif
2b10: 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 y", -1));. Tc
2b20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2b30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
2b40: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 mdPtr,..Tcl_NewS
2b50: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
2b60: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
2b70: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
2b80: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2b90: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2ba0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2bb0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 Tcl_NewIntObj(de
2bc0: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c pth));. Tcl_L
2bd0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2be0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2bf0: 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f tr, Tls_NewX509O
2c00: 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 bj(interp, cert)
2c10: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2c20: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2c30: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2c40: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b Tcl_NewIntObj(ok
2c50: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2c60: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2c70: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2c80: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f ..Tcl_NewStringO
2c90: 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76 bj((char*)X509_v
2ca0: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 erify_cert_error
2cb0: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 _string(err), -1
2cc0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 ));.. /* Prev
2cd0: 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 ent I/O while ca
2ce0: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72 6f llback is in pro
2cf0: 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 gress */. /*
2d00: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
2d10: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 |= TLS_TCL_CALLB
2d20: 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 ACK; */.. /*
2d30: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
2d40: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
2d50: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
2d60: 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 dPtr);. ok =
2d70: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
2d80: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
2d90: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
2da0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
2db0: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 Ptr);.. /* st
2dc0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d atePtr->flags &=
2dd0: 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 ~(TLS_TCL_CALLB
2de0: 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 ACK); */. ret
2df0: 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 urn(ok);./* By d
2e00: 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 efault, leave ve
2e10: 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 rification uncha
2e20: 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a nged. */.}.../*.
2e30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e70: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
2e80: 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 Error --. *. *.C
2e90: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 alls callback wi
2ea0: 74 68 20 6c 69 73 74 20 6f 66 20 65 72 72 6f 72 th list of error
2eb0: 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 s.. *. * Side ef
2ec0: 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 fects:. *.The er
2ed0: 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 r field of the c
2ee0: 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 urrently operati
2ef0: 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a ve State is set.
2f00: 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 *. to a string
2f10: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 describing the
2f20: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 SSL negotiation
2f30: 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 failure reason.
2f40: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f80: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
2f90: 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 .Tls_Error(State
2fa0: 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 *statePtr, char
2fb0: 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c *msg) {. Tcl
2fc0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
2fd0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
2fe0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
2ff0: 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 *cmdPtr, *listPt
3000: 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 r;. unsigned
3010: 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74 long err;. st
3020: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 atePtr->err = ms
3030: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 g;.. dprintf(
3040: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
3050: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 if (statePtr->ca
3060: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f llback == (Tcl_O
3070: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 bj*)NULL)..retur
3080: 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 n;.. /* Creat
3090: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
30a0: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 l */. cmdPtr
30b0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
30c0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
30d0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f lback);. Tcl_
30e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
30f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3100: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
3110: 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d ngObj("error", -
3120: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
3130: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3140: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3150: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
3160: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
3170: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
3180: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
3190: 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21 3d ;. if (msg !=
31a0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 NULL) {..Tcl_Li
31b0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
31c0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
31d0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
31e0: 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a Obj(msg, -1));..
31f0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 } else if ((
3200: 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 msg = Tcl_GetStr
3210: 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 ingFromObj(Tcl_G
3220: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
3230: 72 70 29 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e rp), NULL)) != N
3240: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 ULL) {..Tcl_List
3250: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3260: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3270: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3280: 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 j(msg, -1));..
3290: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 } else {..list
32a0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
32b0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 tObj(0, NULL);..
32c0: 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 45 52 while ((err = ER
32d0: 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 20 21 R_get_error()) !
32e0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f = 0) {.. Tcl_
32f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3300: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
3310: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tPtr, Tcl_NewStr
3320: 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f ingObj(ERR_reaso
3330: 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 n_error_string(e
3340: 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 rr), -1));..}..T
3350: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3360: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3370: 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 72 29 cmdPtr, listPtr)
3380: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
3390: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
33a0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
33b0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
33c0: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 dPtr);. EvalC
33d0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
33e0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
33f0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
3400: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
3410: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
3460: 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 . * KeyLogCallba
3470: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 ck --. *. *.Writ
3480: 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 20 64 e received key d
3490: 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e ata to log file.
34a0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
34b0: 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a cts:. *.none. *.
34c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3500: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b -----. */.void K
3510: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f eyLogCallback(co
3520: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f nst SSL *ssl, co
3530: 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 nst char *line)
3540: 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 {. char *str
3550: 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c = getenv(SSLKEYL
3560: 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c OGFILE);. FIL
3570: 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72 69 E *fd;.. dpri
3580: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
3590: 20 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a 09 if (str) {..
35a0: 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 fd = fopen(str,
35b0: 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 "a");..fprintf(f
35c0: 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b d, "%s\n",line);
35d0: 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 ..fclose(fd);.
35e0: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3630: 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 20 . *. * Password
3640: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 Callback --. *.
3650: 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 *.Called when a
3660: 70 61 73 73 77 6f 72 64 20 66 6f 72 20 61 20 70 password for a p
3670: 72 69 76 61 74 65 20 6b 65 79 20 6c 6f 61 64 69 rivate key loadi
3680: 6e 67 2f 73 74 6f 72 69 6e 67 20 61 20 50 45 4d ng/storing a PEM
3690: 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74 65 20 . *.certificate
36a0: 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e with encryption.
36b0: 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 20 Evals callback
36c0: 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75 72 script and retur
36d0: 6e 73 0a 20 2a 09 74 68 65 20 72 65 73 75 6c 74 ns. *.the result
36e0: 20 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64 as the password
36f0: 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a string in buf..
3700: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
3710: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
3720: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
3730: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
3740: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
3750: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73 Returns:. *.Pass
3760: 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74 word size in byt
3770: 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 es or -1 for an
3780: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d error.. *. *----
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
37d0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 */.static int.P
37e0: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 asswordCallback(
37f0: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 char *buf, int s
3800: 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c ize, int rwflag,
3810: 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a void *udata) {.
3820: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
3830: 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr.= (State *)
3840: 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 udata;. Tcl_I
3850: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
3860: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
3870: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
3880: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
3890: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ode;.. dprint
38a0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
38b0: 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c 62 /* If no callb
38c0: 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c 74 ack, use default
38d0: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 callback */.
38e0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
38f0: 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 assword == NULL)
3900: 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c {..if (Tcl_Eval
3910: 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a Ex(interp, "tls:
3920: 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c 20 :password", -1,
3930: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
3940: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 == TCL_OK) {..
3950: 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 28 char *ret = (
3960: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 char *) Tcl_GetS
3970: 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 tringResult(inte
3980: 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 70 rp);.. strncp
3990: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a y(buf, ret, (siz
39a0: 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 e_t) size);..
39b0: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72 return (int)str
39c0: 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c 73 len(ret);..} els
39d0: 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 e {.. return
39e0: 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 -1;..}. }..
39f0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
3a00: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 and to eval */.
3a10: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
3a20: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
3a30: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
3a40: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3a50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3a60: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3a70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3a80: 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 "password", -1))
3a90: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3aa0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3ab0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3ac0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 cl_NewIntObj(rwf
3ad0: 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c lag));. Tcl_L
3ae0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3af0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3b00: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
3b10: 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 j(size));.. T
3b20: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
3b30: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
3b40: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 ;. Tcl_Preser
3b50: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
3b60: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
3b70: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
3b80: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
3b90: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
3ba0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
3bb0: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
3bc0: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
3bd0: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
3be0: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
3bf0: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
3c00: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
3c10: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
3c20: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
3c30: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
3c40: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
3c50: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
3c60: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
3c70: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
3c80: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
3c90: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
3ca0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
3cb0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
3cc0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
3cd0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 ePtr);.. /* I
3ce0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 61 f successful, pa
3cf0: 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f 72 64 ss back password
3d00: 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72 75 6e string and trun
3d10: 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 cate if too long
3d20: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 65 */. if (code
3d30: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 69 == TCL_OK) {..i
3d40: 6e 74 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 72 nt len;..char *r
3d50: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 et = (char *) Tc
3d60: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
3d70: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 bj(Tcl_GetObjRes
3d80: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c 65 ult(interp), &le
3d90: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 73 n);..if (len > s
3da0: 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 ize-1) {.. le
3db0: 6e 20 3d 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 n = size-1;..}..
3dc0: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 strncpy(buf, ret
3dd0: 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b , (size_t) len);
3de0: 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 ..buf[len] = '\0
3df0: 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 ';..Tcl_Release(
3e00: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
3e10: 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 6c 65 erp);..return(le
3e20: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 n);. }. Tc
3e30: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
3e40: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
3e50: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d return -1;.}
3e60: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
3eb0: 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 * Session Callba
3ec0: 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d ck for Clients -
3ed0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 -. *. *.Called w
3ee0: 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f hen a new sessio
3ef0: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 n is added to th
3f00: 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 e cache. In TLS
3f10: 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 1.3. *.this may
3f20: 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 be received mult
3f30: 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 iple times after
3f40: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 the handshake.
3f50: 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 For. *.earlier v
3f60: 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 ersions, this wi
3f70: 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 64 ll be received d
3f80: 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 uring the handsh
3f90: 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 ake.. *.This is
3fa0: 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77 61 the preferred wa
3fb0: 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 y to obtain a re
3fc0: 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e sumable session.
3fd0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
3fe0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
3ff0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
4000: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
4010: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
4020: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
4030: 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 *.0 = error wher
4040: 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 e session will b
4050: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 e immediately re
4060: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 moved from the i
4070: 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 nternal cache..
4080: 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 *.1 = success wh
4090: 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 ere app retains
40a0: 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 session in sessi
40b0: 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 on cache, and mu
40c0: 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 st call SSL_SESS
40d0: 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 ION_free() when
40e0: 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d done.. *. *-----
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
4130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 */.static int.Se
4140: 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 6f ssionCallback(co
4150: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53 53 nst SSL *ssl, SS
4160: 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 L_SESSION *sessi
4170: 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 on) {. State
4180: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
4190: 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f te*)SSL_get_app_
41a0: 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 data((SSL *)ssl)
41b0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
41c0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
41d0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
41e0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
41f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 ;. const unsi
4200: 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 gned char *ticke
4210: 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 t;. const uns
4220: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 igned char *sess
4230: 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 ion_id;. size
4240: 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 _t len2;. uns
4250: 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a igned int ulen;.
4260: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
4270: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
4280: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
4290: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a ack == (Tcl_Obj*
42a0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
42b0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
42c0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 OK;. } else i
42d0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 f (ssl == NULL)
42e0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
42f0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4300: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
4310: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
4320: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
4330: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
4340: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
4350: 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 callback);. T
4360: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
4370: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
4380: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
4390: 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f tringObj("sessio
43a0: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 n", -1));. Tc
43b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
43c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
43d0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
43e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
43f0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
4400: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
4410: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 -1));.. /* S
4420: 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 ession id */.
4430: 20 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 session_id = SS
4440: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 L_SESSION_get_id
4450: 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 (session, &ulen)
4460: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
4470: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
4480: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
4490: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f cl_NewByteArrayO
44a0: 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 bj(session_id, (
44b0: 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 int) ulen));..
44c0: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 /* Session tic
44d0: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 ket */. SSL_S
44e0: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b ESSION_get0_tick
44f0: 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 et(session, &tic
4500: 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 ket, &len2);.
4510: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4520: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4530: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4540: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 wByteArrayObj(ti
4550: 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 cket, (int) len2
4560: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 ));.. /* Life
4570: 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 time - number of
4580: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 seconds */.
4590: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
45a0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
45b0: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 cmdPtr,..Tcl_Ne
45c0: 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 wLongObj((long)
45d0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
45e0: 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f ticket_lifetime_
45f0: 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b hint(session)));
4600: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
4610: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
4620: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
4630: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
4640: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b EvalCallback
4650: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
4660: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 r, cmdPtr);.
4670: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
4680: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 (cmdPtr);. re
4690: 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 turn 0;.}.../*.
46a0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46e0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 ----. *. * ALPN
46f0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 Callback for Ser
4700: 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c vers and NPN Cal
4710: 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 lback for Client
4720: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f s --. *. *.Perfo
4730: 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 rm protocol (htt
4740: 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 p/1.1, h2, h3, e
4750: 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 tc.) selection f
4760: 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 or the. *.incomi
4770: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 ng connection. C
4780: 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c alled after Hell
4790: 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c o and server cal
47a0: 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 lbacks.. *.Where
47b0: 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 'out' is select
47c0: 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 ed protocol and
47d0: 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 'in' is the peer
47e0: 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 advertised list
47f0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
4800: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
4810: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
4820: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
4830: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
4840: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
4850: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
4860: 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f R_OK: ALPN proto
4870: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 col selected. Th
4880: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
4890: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 tinues.. *.SSL_T
48a0: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
48b0: 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 FATAL: There was
48c0: 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 no overlap betw
48d0: 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 een the client's
48e0: 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 . *. supplied
48f0: 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 list and the se
4900: 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 rver configurati
4910: 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 on. The connecti
4920: 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 on will be abort
4930: 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 ed.. *.SSL_TLSEX
4940: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 T_ERR_NOACK: ALP
4950: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 N protocol not s
4960: 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 elected, e.g., b
4970: 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 ecause no ALPN.
4980: 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 *. protocols
4990: 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 are configured f
49a0: 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 or this connecti
49b0: 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 on. The connecti
49c0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
49d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a10: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
4a20: 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 c int.ALPNCallba
4a30: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 ck(const SSL *ss
4a40: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 l, const unsigne
4a50: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e d char **out, un
4a60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 signed char *out
4a70: 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 len,..const unsi
4a80: 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 gned char *in, u
4a90: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 nsigned int inle
4aa0: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a n, void *arg) {.
4ab0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
4ac0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
4ad0: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 g;. Tcl_Inter
4ae0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
4af0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
4b00: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
4b10: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c r;. int code,
4b20: 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e res;.. dprin
4b30: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
4b40: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 if (ssl == NU
4b50: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c LL || arg == NUL
4b60: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
4b70: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
4b80: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a K;. }.. /*
4b90: 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c Select protocol
4ba0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f */. if (SSL_
4bb0: 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 select_next_prot
4bc0: 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 o(out, outlen, s
4bd0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c tatePtr->protos,
4be0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
4bf0: 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 s_len,..in, inle
4c00: 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 n) == OPENSSL_NP
4c10: 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a N_NEGOTIATED) {.
4c20: 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 20 ./* Match found
4c30: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c */..res = SSL_TL
4c40: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
4c50: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50 } else {../* OP
4c60: 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 ENSSL_NPN_NO_OVE
4c70: 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61 RLAP = No overla
4c80: 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 20 p, so use first
4c90: 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74 item from client
4ca0: 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a protocol list *
4cb0: 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 /..res = SSL_TLS
4cc0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
4cd0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
4ce0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 atePtr->vcmd ==
4cf0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 (Tcl_Obj*)NULL)
4d00: 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 {..return res;.
4d10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
4d20: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
4d30: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 val */. cmdPt
4d40: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
4d50: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
4d60: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
4d70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4d80: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4d90: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4da0: 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 Obj("alpn", -1))
4db0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
4dc0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
4dd0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
4de0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
4df0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
4e00: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
4e10: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
4e20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4e30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4e40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
4e50: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f 75 NewStringObj(*ou
4e60: 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c t, -1));. Tcl
4e70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4e80: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4e90: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f dPtr, Tcl_NewBoo
4ea0: 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 leanObj(res == S
4eb0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
4ec0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c ));.. /* Eval
4ed0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
4ee0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
4ef0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
4f00: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 );. if ((code
4f10: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 = EvalCallback(
4f20: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
4f30: 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 , cmdPtr)) > 1)
4f40: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
4f50: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
4f60: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f } else if (co
4f70: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 de == 1) {..res
4f80: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 = SSL_TLSEXT_ERR
4f90: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 _OK;. } else
4fa0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
4fb0: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 EXT_ERR_ALERT_FA
4fc0: 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 TAL;. }. T
4fd0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
4fe0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
4ff0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a urn res;.}.../*.
5000: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5040: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 -----. *. * Adve
5050: 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 rtise Protocols
5060: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 Callback for Nex
5070: 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 t Protocol Negot
5080: 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 iation (NPN) in
5090: 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 ServerHello --.
50a0: 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e *. *.called when
50b0: 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e 65 a TLS server ne
50c0: 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73 75 eds a list of su
50d0: 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c pported protocol
50e0: 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 s for Next. *.Pr
50f0: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 otocol Negotiati
5100: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 on.. *. * Result
5110: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
5120: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
5130: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
5140: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s:. *.SSL_TLSEXT
5150: 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f _ERR_OK: NPN pro
5160: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 tocol selected.
5170: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
5180: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c ontinues.. *.SSL
5190: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
51a0: 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 K: NPN protocol
51b0: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54 68 not selected. Th
51c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
51d0: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d tinues.. *. *---
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5200: 2d 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: 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f . */.#ifdef USE_
5230: 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e NPN.static int.N
5240: 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 PNCallback(const
5250: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 SSL *ssl, const
5260: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
5270: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 *out, unsigned i
5280: 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 nt *outlen, void
5290: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
52a0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
52b0: 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 State*)arg;..
52c0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
52d0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c ");.. if (ssl
52e0: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 == NULL || arg
52f0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
5300: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
5310: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a R_NOACK;. }..
5320: 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f /* Set proto
5330: 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 cols list */.
5340: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
5350: 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b rotos != NULL) {
5360: 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 74 ..*out = statePt
5370: 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 r->protos;..*out
5380: 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d 3e len = statePtr->
5390: 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 protos_len;.
53a0: 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d } else {..*out =
53b0: 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 NULL;..*outlen
53c0: 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c = 0;..return SSL
53d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
53e0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 K;. }. ret
53f0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
5400: 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a RR_OK;.}.#endif.
5410: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
5420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
5460: 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f SNI Callback fo
5470: 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a r Servers --. *.
5480: 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65 *.Perform serve
5490: 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e r-side SNI hostn
54a0: 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 ame selection af
54b0: 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e ter receiving SN
54c0: 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 I extension. *.i
54d0: 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 n Client Hello.
54e0: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c Called after hel
54f0: 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 lo callback but
5500: 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c before ALPN call
5510: 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 back.. *. * Resu
5520: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
5530: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
5540: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
5550: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
5560: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
5570: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
5580: 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f T_ERR_OK: SNI ho
5590: 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74 stname is accept
55a0: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
55b0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
55c0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
55d0: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 ALERT_FATAL: SNI
55e0: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 hostname is not
55f0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 accepted. The c
5600: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 onnection. *.
5610: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66 is aborted. Def
5620: 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69 ault for alert i
5630: 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 s SSL_AD_UNRECOG
5640: 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 NIZED_NAME.. *.S
5650: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
5660: 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 ERT_WARNING: SNI
5670: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 hostname is not
5680: 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69 accepted, warni
5690: 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 ng alert. *.
56a0: 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 sent (not suppor
56b0: 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e ted in TLSv1.3).
56c0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
56d0: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
56e0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
56f0: 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 CK: SNI hostname
5700: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 is not accepted
5710: 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c and not acknowl
5720: 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e edged,. *. e.
5730: 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e 6f g. if SNI has no
5740: 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 t been configure
5750: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f d. The connectio
5760: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a n continues.. *.
5770: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
57c0: 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b int.SNICallback
57d0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c (const SSL *ssl,
57e0: 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 int *alert, voi
57f0: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 d *arg) {. St
5800: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
5810: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 (State*)arg;.
5820: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
5830: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
5840: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
5850: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
5860: 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a int code, res;.
5870: 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 char *server
5880: 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 name = NULL;..
5890: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
58a0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 d");.. if (ss
58b0: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 l == NULL || arg
58c0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
58d0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
58e0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
58f0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 . /* Only wor
5900: 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 ks for TLS 1.2 a
5910: 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 nd earlier */.
5920: 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 servername = S
5930: 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d SL_get_servernam
5940: 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 e(ssl, TLSEXT_NA
5950: 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 METYPE_host_name
5960: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72 76 );. if (!serv
5970: 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 ername || server
5980: 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 name[0] == '\0')
5990: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
59a0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
59b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
59c0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
59d0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
59e0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
59f0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
5a00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
5a10: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
5a20: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 val */. cmdPt
5a30: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
5a40: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
5a50: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
5a60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
5a70: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
5a80: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
5a90: 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b Obj("sni", -1));
5aa0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
5ab0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
5ac0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
5ad0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
5ae0: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
5af0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
5b00: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 >self), -1));.
5b10: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
5b20: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
5b30: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
5b40: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 ewStringObj(serv
5b50: 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a ername , -1));..
5b60: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
5b70: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
5b80: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
5b90: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
5ba0: 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 if ((code = Ev
5bb0: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 alCallback(inter
5bc0: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 p, statePtr, cmd
5bd0: 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 Ptr)) > 1) {..re
5be0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
5bf0: 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 RR_ALERT_WARNING
5c00: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f ;..*alert = SSL_
5c10: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f AD_UNRECOGNIZED_
5c20: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 NAME; /* Not sup
5c30: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e ported by TLS 1.
5c40: 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 3 */. } else
5c50: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b if (code == 1) {
5c60: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
5c70: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
5c80: 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 else {..res = S
5c90: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
5ca0: 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 ERT_FATAL;..*ale
5cb0: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 rt = SSL_AD_UNRE
5cc0: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f COGNIZED_NAME; /
5cd0: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 * Not supported
5ce0: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 by TLS 1.3 */.
5cf0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 }. Tcl_Decr
5d00: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
5d10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 ;. return res
5d20: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5d70: 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f *. * ClientHello
5d80: 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 Handshake Callb
5d90: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 ack for Servers
5da0: 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 --. *. *.Used by
5db0: 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 server to exami
5dc0: 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 ne the server na
5dd0: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 me indication (S
5de0: 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a NI) extension. *
5df0: 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 .provided by the
5e00: 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 client in order
5e10: 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 to select an ap
5e20: 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 propriate certif
5e30: 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 icate to. *.pres
5e40: 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 ent, and make ot
5e50: 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f her configuratio
5e60: 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 n adjustments re
5e70: 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 levant to that s
5e80: 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e erver. *.name an
5e90: 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 d its configurat
5ea0: 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 ion. This includ
5eb0: 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 es swapping out
5ec0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 the associated.
5ed0: 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 *.SSL_CTX pointe
5ee0: 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 r, modifying the
5ef0: 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f server's list o
5f00: 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 f permitted TLS
5f10: 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 versions,. *.cha
5f20: 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 nging the server
5f30: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 's cipher list i
5f40: 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 n response to th
5f50: 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 e client's ciphe
5f60: 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09 r list, etc.. *.
5f70: 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e Called before SN
5f80: 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62 I and ALPN callb
5f90: 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 acks.. *. * Resu
5fa0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
5fb0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
5fc0: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
5fd0: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
5fe0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
5ff0: 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e es:. *.SSL_CLIEN
6000: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 T_HELLO_RETRY: s
6010: 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73 uspend the hands
6020: 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61 hake, and the ha
6030: 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e ndshake function
6040: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d will return imm
6050: 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f ediately. *.SSL_
6060: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6070: 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72 OR: failure, ter
6080: 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f minate connectio
6090: 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20 n. Set alert to
60a0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53 error code.. *.S
60b0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
60c0: 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 73 SUCCESS: success
60d0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
6120: 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 atic int.HelloCa
6130: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
6140: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 *ssl, int *aler
6150: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a t, void *arg) {.
6160: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
6170: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
6180: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 g;. Tcl_Inter
6190: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
61a0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
61b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
61c0: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c r;. int code,
61d0: 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 res;. const
61e0: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 char *servername
61f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 ;. const unsi
6200: 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 gned char *p;.
6210: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 size_t len, re
6220: 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70 maining;.. dp
6230: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
6240: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
6250: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c tr->vcmd == (Tcl
6260: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 _Obj*)NULL) {..r
6270: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6280: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a _HELLO_SUCCESS;.
6290: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
62a0: 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 4c sl == (const SSL
62b0: 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d *)NULL || arg =
62c0: 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 20 = (void *)NULL)
62d0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c {..return SSL_CL
62e0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
62f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
6300: 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 Get names */.
6310: 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74 if (!SSL_client
6320: 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28 _hello_get0_ext(
6330: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45 ssl, TLSEXT_TYPE
6340: 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70 _server_name, &p
6350: 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c , &remaining) ||
6360: 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 remaining <= 2)
6370: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
6380: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 _R_SSLV3_ALERT_I
6390: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 LLEGAL_PARAMETER
63a0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
63b0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
63c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
63d0: 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67 Extract the leng
63e0: 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 th of the suppli
63f0: 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 ed list of names
6400: 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28 . */. len = (
6410: 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 *(p++) << 8);.
6420: 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b len += *(p++);
6430: 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 . if (len + 2
6440: 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b != remaining) {
6450: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 ..*alert = SSL_R
6460: 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c _SSLV3_ALERT_ILL
6470: 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a EGAL_PARAMETER;.
6480: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
6490: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
64a0: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e }. remain
64b0: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 ing = len;..
64c0: 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70 /* The list in p
64d0: 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73 ractice only has
64e0: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e a single elemen
64f0: 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f t, so we only co
6500: 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 74 nsider the first
6510: 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 one. */. if
6520: 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20 (remaining == 0
6530: 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58 || *p++ != TLSEX
6540: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f T_NAMETYPE_host_
6550: 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20 name) {..*alert
6560: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c = SSL_R_TLSV1_AL
6570: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 ERT_INTERNAL_ERR
6580: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f OR;..return SSL_
6590: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
65a0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 OR;. }. re
65b0: 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 maining--;..
65c0: 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 /* Now we can fi
65d0: 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 nally pull out t
65e0: 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 69 he byte array wi
65f0: 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f th the actual ho
6600: 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 stname. */. i
6610: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 f (remaining <=
6620: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 2) {..*alert = S
6630: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 SL_R_TLSV1_ALERT
6640: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b _INTERNAL_ERROR;
6650: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
6660: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
6670: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d . }. len =
6680: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a (*(p++) << 8);.
6690: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b len += *(p++
66a0: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b );. if (len +
66b0: 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20 2 > remaining)
66c0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
66d0: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e R_TLSV1_ALERT_IN
66e0: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 TERNAL_ERROR;..r
66f0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6700: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
6710: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e }. remainin
6720: 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72 g = len;. ser
6730: 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 vername = (const
6740: 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20 char *)p;..
6750: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
6760: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 d to eval */.
6770: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
6780: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
6790: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 Ptr->vcmd);.
67a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
67b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
67c0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
67d0: 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f StringObj("hello
67e0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
67f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
6800: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
6810: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
6820: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
6830: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
6840: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
6850: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
6860: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
6870: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
6880: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
6890: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 Obj(servername,
68a0: 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 (int) len));..
68b0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
68c0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
68d0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
68e0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
68f0: 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c if ((code = Eval
6900: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c Callback(interp,
6910: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 statePtr, cmdPt
6920: 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 r)) > 1) {..res
6930: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c = SSL_CLIENT_HEL
6940: 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 6c 65 72 LO_RETRY;..*aler
6950: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f t = SSL_R_TLSV1_
6960: 41 4c 45 52 54 5f 55 53 45 52 5f 43 41 4e 43 45 ALERT_USER_CANCE
6970: 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65 6c 73 65 LLED;. } else
6980: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
6990: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 {..res = SSL_CLI
69a0: 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 ENT_HELLO_SUCCES
69b0: 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a S;. } else {.
69c0: 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e .res = SSL_CLIEN
69d0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 T_HELLO_ERROR;..
69e0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 *alert = SSL_R_T
69f0: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 LSV1_ALERT_INTER
6a00: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d NAL_ERROR;. }
6a10: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
6a20: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
6a30: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d return res;.}
6a40: 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
6a50: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d ********/./* Com
6a60: 6d 61 6e 64 73 20 20 20 20 20 20 20 20 20 2a 2f mands */
6a70: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
6a80: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d ******/../*. *--
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ad0: 2d 0a 20 2a 0a 20 2a 20 48 61 73 68 20 43 61 6c -. *. * Hash Cal
6ae0: 63 20 2d 2d 20 72 65 74 75 72 6e 20 68 61 73 68 c -- return hash
6af0: 20 68 65 78 20 73 74 72 69 6e 67 20 66 6f 72 20 hex string for
6b00: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 0a 20 message digest.
6b10: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
6b20: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
6b30: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
6b40: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
6b50: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
6b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
6ba0: 2f 0a 69 6e 74 0a 48 61 73 68 43 61 6c 63 28 54 /.int.HashCalc(T
6bb0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
6bc0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
6bd0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
6be0: 5b 5d 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 [], const EVP_MD
6bf0: 20 2a 74 79 70 65 29 20 7b 0a 20 20 20 20 63 68 *type) {. ch
6c00: 61 72 20 2a 64 61 74 61 3b 0a 20 20 20 20 69 6e ar *data;. in
6c10: 74 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 t len;. unsig
6c20: 6e 65 64 20 69 6e 74 20 6d 64 6c 65 6e 3b 0a 20 ned int mdlen;.
6c30: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
6c40: 20 6d 64 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d mdbuf[EVP_MAX_M
6c50: 44 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 D_SIZE];. uns
6c60: 69 67 6e 65 64 20 63 68 61 72 20 68 61 73 68 62 igned char hashb
6c70: 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 uf[EVP_MAX_MD_SI
6c80: 5a 45 2a 32 2b 31 5d 3b 0a 20 20 20 20 63 6f 6e ZE*2+1];. con
6c90: 73 74 20 63 68 61 72 20 2a 68 65 78 20 3d 20 22 st char *hex = "
6ca0: 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 0123456789ABCDEF
6cb0: 22 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 ";.. if (objc
6cc0: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 != 2) {..Tcl_Wr
6cd0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
6ce0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 64 61 74 p, 1, objv, "dat
6cf0: 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c a");..return TCL
6d00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
6d10: 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 data = Tcl_Ge
6d20: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 tByteArrayFromOb
6d30: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6c 65 6e 29 j(objv[1], &len)
6d40: 3b 0a 20 20 20 20 69 66 20 28 64 61 74 61 20 3d ;. if (data =
6d50: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
6d60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
6d70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 63 20 }.. /* Calc
6d80: 68 61 73 68 2c 20 63 6f 6e 76 65 72 74 20 74 6f hash, convert to
6d90: 20 68 65 78 20 73 74 72 69 6e 67 2c 20 61 6e 64 hex string, and
6da0: 20 77 72 69 74 65 20 74 6f 20 72 65 73 75 6c 74 write to result
6db0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 45 56 50 5f */. if (EVP_
6dc0: 44 69 67 65 73 74 28 64 61 74 61 2c 20 28 73 69 Digest(data, (si
6dd0: 7a 65 5f 74 29 20 6c 65 6e 2c 20 6d 64 62 75 66 ze_t) len, mdbuf
6de0: 2c 20 26 6d 64 6c 65 6e 2c 20 74 79 70 65 2c 20 , &mdlen, type,
6df0: 4e 55 4c 4c 29 29 20 7b 0a 09 75 6e 73 69 67 6e NULL)) {..unsign
6e00: 65 64 20 63 68 61 72 20 2a 6d 70 74 72 20 3d 20 ed char *mptr =
6e10: 6d 64 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 mdbuf;..unsigned
6e20: 20 63 68 61 72 20 2a 68 70 74 72 20 3d 20 26 68 char *hptr = &h
6e30: 61 73 68 62 75 66 5b 30 5d 3b 0a 0a 09 66 6f 72 ashbuf[0];...for
6e40: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 (unsigned int i
6e50: 20 3d 20 30 3b 20 69 20 3c 20 6d 64 6c 65 6e 3b = 0; i < mdlen;
6e60: 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 2a 68 70 i++) {.. *hp
6e70: 74 72 2b 2b 20 3d 20 68 65 78 5b 28 2a 6d 70 74 tr++ = hex[(*mpt
6e80: 72 3e 3e 34 29 26 30 78 46 5d 3b 0a 09 20 20 20 r>>4)&0xF];..
6e90: 20 2a 68 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 *hptr++ = hex[(
6ea0: 2a 6d 70 74 72 2b 2b 29 26 30 78 46 5d 3b 0a 09 *mptr++)&0xF];..
6eb0: 7d 0a 09 2a 68 70 74 72 20 3d 20 30 3b 0a 09 54 }..*hptr = 0;..T
6ec0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
6ed0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 interp, Tcl_NewS
6ee0: 74 72 69 6e 67 4f 62 6a 28 68 61 73 68 62 75 66 tringObj(hashbuf
6ef0: 2c 20 6d 64 6c 65 6e 2a 32 29 29 3b 0a 20 20 20 , mdlen*2));.
6f00: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 53 } else {..Tcl_S
6f10: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
6f20: 20 22 48 61 73 68 20 63 61 6c 63 75 6c 61 74 69 "Hash calculati
6f30: 6f 6e 20 65 72 72 6f 72 22 2c 20 4e 55 4c 4c 29 on error", NULL)
6f40: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
6f50: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
6f60: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
6f70: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
6fc0: 48 61 73 68 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d Hash Commands --
6fd0: 20 52 65 74 75 72 6e 20 68 61 73 68 20 76 61 6c Return hash val
6fe0: 75 65 20 66 6f 72 20 64 69 67 65 73 74 20 61 73 ue for digest as
6ff0: 20 68 65 78 20 73 74 72 69 6e 67 0a 20 2a 0a 20 hex string. *.
7000: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
7010: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
7020: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
7030: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
7040: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
7050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 48 ----------. */.H
7090: 61 73 68 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ashCmd(ClientDat
70a0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
70b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
70c0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
70d0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
70e0: 5d 29 20 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e ]) {. int len
70f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
7100: 20 2a 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 *name;. cons
7110: 74 20 45 56 50 5f 4d 44 20 2a 74 79 70 65 3b 0a t EVP_MD *type;.
7120: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
7130: 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 3) {..Tcl_Wrong
7140: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
7150: 31 2c 20 6f 62 6a 76 2c 20 22 74 79 70 65 20 64 1, objv, "type d
7160: 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 ata");..return T
7170: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
7180: 0a 20 20 20 20 6e 61 6d 65 20 3d 20 54 63 6c 5f . name = Tcl_
7190: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
71a0: 28 6f 62 6a 76 5b 31 5d 2c 26 6c 65 6e 29 3b 0a (objv[1],&len);.
71b0: 20 20 20 20 69 66 20 28 6e 61 6d 65 20 3d 3d 20 if (name ==
71c0: 4e 55 4c 4c 20 7c 7c 20 28 74 79 70 65 20 3d 20 NULL || (type =
71d0: 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79 EVP_get_digestby
71e0: 6e 61 6d 65 28 6e 61 6d 65 29 29 20 3d 3d 20 4e name(name)) == N
71f0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
7200: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
7210: 20 22 49 6e 76 61 6c 69 64 20 64 69 67 65 73 74 "Invalid digest
7220: 20 74 79 70 65 20 5c 22 22 2c 20 6e 61 6d 65 2c type \"", name,
7230: 20 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 "\"", NULL);..r
7240: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7250: 0a 20 20 20 20 7d 0a 20 20 20 20 6f 62 6a 63 2d . }. objc-
7260: 2d 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a 20 -;. objv++;.
7270: 20 20 20 72 65 74 75 72 6e 20 48 61 73 68 43 61 return HashCa
7280: 6c 63 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c lc(interp, objc,
7290: 20 6f 62 6a 76 2c 20 74 79 70 65 29 3b 0a 7d 0a objv, type);.}.
72a0: 0a 2f 2a 0a 20 2a 20 43 6f 6d 6d 61 6e 64 20 74 ./*. * Command t
72b0: 6f 20 43 61 6c 63 75 6c 61 74 65 20 4d 44 34 20 o Calculate MD4
72c0: 48 61 73 68 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73 Hash. */.int.Has
72d0: 68 4d 44 34 43 6d 64 28 43 6c 69 65 6e 74 44 61 hMD4Cmd(ClientDa
72e0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
72f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
7300: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
7310: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
7320: 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e []) {. return
7330: 20 48 61 73 68 43 61 6c 63 28 69 6e 74 65 72 70 HashCalc(interp
7340: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 , objc, objv, EV
7350: 50 5f 6d 64 34 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a P_md4());.}../*.
7360: 20 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 20 43 61 * Command to Ca
7370: 6c 63 75 6c 61 74 65 20 4d 44 35 20 48 61 73 68 lculate MD5 Hash
7380: 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73 68 4d 44 35 . */.int.HashMD5
7390: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
73a0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
73b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
73c0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
73d0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
73e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 48 61 73 {. return Has
73f0: 68 43 61 6c 63 28 69 6e 74 65 72 70 2c 20 6f 62 hCalc(interp, ob
7400: 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 jc, objv, EVP_md
7410: 35 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43 5());.}../*. * C
7420: 6f 6d 6d 61 6e 64 20 74 6f 20 43 61 6c 63 75 6c ommand to Calcul
7430: 61 74 65 20 53 48 41 2d 31 20 48 61 73 68 0a 20 ate SHA-1 Hash.
7440: 2a 2f 0a 69 6e 74 0a 48 61 73 68 53 48 41 31 43 */.int.HashSHA1C
7450: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
7460: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
7470: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
7480: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
7490: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
74a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 48 61 73 68 . return Hash
74b0: 43 61 6c 63 28 69 6e 74 65 72 70 2c 20 6f 62 6a Calc(interp, obj
74c0: 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 73 68 61 c, objv, EVP_sha
74d0: 31 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43 1());.}../*. * C
74e0: 6f 6d 6d 61 6e 64 20 74 6f 20 43 61 6c 63 75 6c ommand to Calcul
74f0: 61 74 65 20 53 48 41 2d 32 35 36 20 48 61 73 68 ate SHA-256 Hash
7500: 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73 68 53 48 41 . */.int.HashSHA
7510: 32 35 36 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 256Cmd(ClientDat
7520: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
7530: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
7540: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
7550: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
7560: 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 ]) {. return
7570: 48 61 73 68 43 61 6c 63 28 69 6e 74 65 72 70 2c HashCalc(interp,
7580: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 objc, objv, EVP
7590: 5f 73 68 61 32 35 36 28 29 29 3b 0a 7d 0a 0a 2f _sha256());.}../
75a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
75b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75e0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 -------. *. * Ha
75f0: 73 68 20 4c 69 73 74 20 43 6f 6d 6d 61 6e 64 20 sh List Command
7600: 2d 2d 20 52 65 74 75 72 6e 20 6c 69 73 74 20 6f -- Return list o
7610: 66 20 68 61 73 68 20 6d 65 73 73 61 67 65 20 64 f hash message d
7620: 69 67 65 73 74 73 0a 20 2a 0a 20 2a 20 52 65 73 igests. *. * Res
7630: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
7640: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
7650: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
7660: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
7670: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
7680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 20 -----. */..void
76c0: 48 61 73 68 4c 69 73 74 43 61 6c 6c 62 61 63 6b HashListCallback
76d0: 28 63 6f 6e 73 74 20 4f 42 4a 5f 4e 41 4d 45 20 (const OBJ_NAME
76e0: 2a 6f 62 6a 2c 20 76 6f 69 64 20 2a 61 72 67 29 *obj, void *arg)
76f0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
7700: 6f 62 6a 50 74 72 20 3d 20 28 54 63 6c 5f 4f 62 objPtr = (Tcl_Ob
7710: 6a 20 2a 29 20 61 72 67 3b 0a 20 20 20 20 54 63 j *) arg;. Tc
7720: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
7730: 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 6f 62 6a lement(NULL, obj
7740: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
7750: 6e 67 4f 62 6a 28 6f 62 6a 2d 3e 6e 61 6d 65 2c ngObj(obj->name,
7760: 2d 31 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43 -1));.}../*. * C
7770: 6f 6d 6d 61 6e 64 20 74 6f 20 6c 69 73 74 20 61 ommand to list a
7780: 76 61 69 6c 61 62 6c 65 20 48 61 73 68 20 76 61 vailable Hash va
7790: 6c 75 65 73 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73 lues. */.int.Has
77a0: 68 4c 69 73 74 43 6d 64 28 43 6c 69 65 6e 74 44 hListCmd(ClientD
77b0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
77c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
77d0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
77e0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
77f0: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f v[]) {. Tcl_O
7800: 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 54 63 6c bj *objPtr = Tcl
7810: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
7820: 55 4c 4c 29 3b 0a 0a 20 20 20 20 4f 70 65 6e 53 ULL);.. OpenS
7830: 53 4c 5f 61 64 64 5f 61 6c 6c 5f 64 69 67 65 73 SL_add_all_diges
7840: 74 73 28 29 3b 20 2f 2f 6d 61 6b 65 20 73 75 72 ts(); //make sur
7850: 65 20 74 68 65 79 27 72 65 20 6c 6f 61 64 65 64 e they're loaded
7860: 0a 20 20 20 20 4f 42 4a 5f 4e 41 4d 45 5f 64 6f . OBJ_NAME_do
7870: 5f 61 6c 6c 28 4f 42 4a 5f 4e 41 4d 45 5f 54 59 _all(OBJ_NAME_TY
7880: 50 45 5f 4d 44 5f 4d 45 54 48 2c 20 48 61 73 68 PE_MD_METH, Hash
7890: 4c 69 73 74 43 61 6c 6c 62 61 63 6b 2c 20 28 76 ListCallback, (v
78a0: 6f 69 64 20 2a 29 20 6f 62 6a 50 74 72 29 3b 0a oid *) objPtr);.
78b0: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 Tcl_ResetRes
78c0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 ult(interp);.
78d0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
78e0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
78f0: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
7900: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
7910: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
7920: 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 ..objc = objc;..
7930: 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c objv = objv;.}..
7940: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
7950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
7990: 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d CiphersObjCmd --
79a0: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 list available
79b0: 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 ciphers. *. *.Th
79c0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
79d0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
79e0: 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 ss the "tls::cip
79f0: 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a hers" command. *
7a00: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 .to list availab
7a10: 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65 le ciphers, base
7a20: 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 d upon protocol
7a30: 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 selected.. *. *
7a40: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
7a50: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
7a60: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 t list.. *. * Si
7a70: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 de effects:. *.c
7a80: 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65 onstructs and de
7a90: 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 stroys SSL conte
7aa0: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d xt (CTX). *. *--
7ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7af0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e -. */.static con
7b00: 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f st char *protoco
7b10: 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 ls[] = {.."ssl2"
7b20: 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 , "ssl3", "tls1"
7b30: 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 , "tls1.1", "tls
7b40: 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 1.2", "tls1.3",
7b50: 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f NULL.};.enum pro
7b60: 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f tocol {. TLS_
7b70: 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 SSL2, TLS_SSL3,
7b80: 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c TLS_TLS1, TLS_TL
7b90: 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 S1_1, TLS_TLS1_2
7ba0: 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c , TLS_TLS1_3, TL
7bb0: 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 S_NONE.};..stati
7bc0: 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a c int.CiphersObj
7bd0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
7be0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
7bf0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
7c00: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
7c10: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
7c20: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f {. Tcl_Obj *o
7c30: 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 bjPtr = NULL;.
7c40: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d SSL_CTX *ctx =
7c50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a NULL;. SSL *
7c60: 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ssl = NULL;.
7c70: 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 STACK_OF(SSL_CIP
7c80: 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 HER) *sk;. ch
7c90: 61 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 ar *cp, buf[BUFS
7ca0: 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 IZ];. int ind
7cb0: 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c ex, verbose = 0,
7cc0: 20 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d use_supported =
7cd0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 0;. const SS
7ce0: 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 L_METHOD *method
7cf0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
7d00: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
7d10: 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c f ((objc < 2) ||
7d20: 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 (objc > 4)) {..
7d30: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
7d40: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
7d50: 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 , "protocol ?ver
7d60: 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 bose? ?supported
7d70: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c ?");..return TCL
7d80: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
7d90: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 if (Tcl_GetInd
7da0: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 exFromObj(interp
7db0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f , objv[1], proto
7dc0: 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 cols, "protocol"
7dd0: 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 , 0, &index) !=
7de0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 TCL_OK) {..retur
7df0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
7e00: 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 }. if ((objc
7e10: 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 > 2) && Tcl_Get
7e20: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 BooleanFromObj(i
7e30: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 nterp, objv[2],
7e40: 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c &verbose) != TCL
7e50: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
7e60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
7e70: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 if ((objc >
7e80: 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 3) && Tcl_GetBoo
7e90: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 leanFromObj(inte
7ea0: 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 rp, objv[3], &us
7eb0: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 e_supported) !=
7ec0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 TCL_OK) {..retur
7ed0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
7ee0: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 }.. ERR_clea
7ef0: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 r_error();..
7f00: 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 switch ((enum pr
7f10: 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a otocol)index) {.
7f20: 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a .case TLS_SSL2:.
7f30: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
7f40: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 ION_NUMBER >= 0x
7f50: 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 10100000L || def
7f60: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c ined(NO_SSL2) ||
7f70: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7f80: 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 _NO_SSL2).. T
7f90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
7fa0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
7fb0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
7fc0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
7fd0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
7fe0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7ff0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
8000: 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 ethod = SSLv2_me
8010: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 thod(); break;.#
8020: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
8030: 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 SSL3:.#if define
8040: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 d(NO_SSL3) || de
8050: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8060: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
8070: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
8080: 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 3_METHOD).. T
8090: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
80a0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
80b0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
80c0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
80d0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
80e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
80f0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
8100: 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 ethod = SSLv3_me
8110: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 thod(); break;.#
8120: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
8130: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 TLS1:.#if define
8140: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 d(NO_TLS1) || de
8150: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8160: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 _TLS1) || define
8170: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
8180: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 1_METHOD).. T
8190: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
81a0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
81b0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
81c0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
81d0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
81e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
81f0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
8200: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 ethod = TLSv1_me
8210: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 thod(); break;.#
8220: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
8230: 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 TLS1_1:.#if defi
8240: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c ned(NO_TLS1_1) |
8250: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
8260: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 L_NO_TLS1_1) ||
8270: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8280: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 NO_TLS1_1_METHOD
8290: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
82a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
82b0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
82c0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
82d0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
82e0: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
82f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
8300: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 e.. method =
8310: 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 TLSv1_1_method()
8320: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
8330: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 .case TLS_TLS1_2
8340: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f :.#if defined(NO
8350: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
8360: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
8370: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
8380: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
8390: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 1_2_METHOD)..
83a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
83b0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
83c0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
83d0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
83e0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
83f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
8400: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 RROR;.#else..
8410: 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f method = TLSv1_
8420: 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 2_method(); brea
8430: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 k;.#endif..case
8440: 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 TLS_TLS1_3:.#if
8450: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
8460: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
8470: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
8480: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
8490: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
84a0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
84b0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
84c0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
84d0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
84e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
84f0: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 .. method = T
8500: 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 LS_method();..
8510: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 SSL_CTX_set_mi
8520: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 n_proto_version(
8530: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 ctx, TLS1_3_VERS
8540: 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ION);.. SSL_C
8550: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f TX_set_max_proto
8560: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
8570: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 S1_3_VERSION);..
8580: 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 break;.#endi
8590: 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 f..default:..
85a0: 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 method = TLS_me
85b0: 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 62 72 65 thod();.. bre
85c0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 ak;. }.. c
85d0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
85e0: 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 (method);. if
85f0: 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b (ctx == NULL) {
8600: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
8610: 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f lt(interp, REASO
8620: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 N(), NULL);..ret
8630: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
8640: 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 }.. ssl =
8650: 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 SSL_new(ctx);.
8660: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c if (ssl == NUL
8670: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
8680: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 Result(interp, R
8690: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a EASON(), NULL);.
86a0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
86b0: 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f x);..return TCL_
86c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
86d0: 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e /* Use list an
86e0: 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64 d order as would
86f0: 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c be sent in a Cl
8700: 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c ientHello or all
8710: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 available ciphe
8720: 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 rs */. if (us
8730: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 e_supported) {..
8740: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 sk = SSL_get1_su
8750: 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28 pported_ciphers(
8760: 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ssl);. } else
8770: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 {..sk = SSL_get
8780: 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 _ciphers(ssl);.
8790: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b }.. if (sk
87a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 != NULL) {..if
87b0: 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 (!verbose) {..
87c0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
87d0: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
87e0: 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e L);.. for (in
87f0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f t i = 0; i < sk_
8800: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 SSL_CIPHER_num(s
8810: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e k); i++) {...con
8820: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 st SSL_CIPHER *c
8830: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 = sk_SSL_CIPHER
8840: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 _value(sk, i);..
8850: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 .if (c == NULL)
8860: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 continue;..../*
8870: 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 cipher name or (
8880: 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 NONE) */...cp =
8890: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e SSL_CIPHER_get_n
88a0: 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 ame(c);...if (cp
88b0: 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b == NULL) break;
88c0: 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ...Tcl_ListObjAp
88d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
88e0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
88f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c NewStringObj(cp,
8900: 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 -1));.. }...
8910: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 } else {.. ob
8920: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 jPtr = Tcl_NewSt
8930: 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 ringObj("",0);..
8940: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d for (int i =
8950: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 0; i < sk_SSL_C
8960: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 IPHER_num(sk); i
8970: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 ++) {...const SS
8980: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b L_CIPHER *c = sk
8990: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 _SSL_CIPHER_valu
89a0: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 e(sk, i);...if (
89b0: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 c == NULL) conti
89c0: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 nue;..../* textu
89d0: 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f al description o
89e0: 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a f the cipher */.
89f0: 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 ..if (SSL_CIPHER
8a00: 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 _description(c,
8a10: 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 buf, sizeof(buf)
8a20: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 ) != NULL) {...
8a30: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f Tcl_AppendToO
8a40: 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 bj(objPtr, buf,
8a50: 28 54 63 6c 5f 53 69 7a 65 29 20 73 74 72 6c 65 (Tcl_Size) strle
8a60: 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 n(buf));...} els
8a70: 65 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 e {... Tcl_Ap
8a80: 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 pendToObj(objPtr
8a90: 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 , "UNKNOWN\n", 8
8aa0: 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d );...}.. }..}
8ab0: 0a 09 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 ..if (use_suppor
8ac0: 74 65 64 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 ted) {.. sk_S
8ad0: 53 4c 5f 43 49 50 48 45 52 5f 66 72 65 65 28 73 SL_CIPHER_free(s
8ae0: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 k);..}. }.
8af0: 20 53 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a SSL_free(ssl);.
8b00: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
8b10: 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f (ctx);.. Tcl_
8b20: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
8b30: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
8b40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
8b50: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
8b60: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
8b70: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
8b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8bb0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 -------. *. * Pr
8bc0: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d otocolsObjCmd --
8bd0: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 list available
8be0: 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 protocols. *. *.
8bf0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
8c00: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
8c10: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 cess the "tls::p
8c20: 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e rotocols" comman
8c30: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 d. *.to list ava
8c40: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 ilable protocols
8c50: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
8c60: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
8c70: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a cl result list..
8c80: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
8c90: 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 ts:. *.none. *.
8ca0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
8cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ce0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
8cf0: 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a int.ProtocolsObj
8d00: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
8d10: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
8d20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
8d30: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
8d40: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
8d50: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f {. Tcl_Obj *o
8d60: 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 bjPtr;.. dpri
8d70: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
8d80: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 if (objc !=
8d90: 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 1) {..Tcl_WrongN
8da0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
8db0: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 , objv, "");..re
8dc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
8dd0: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 }.. ERR_c
8de0: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 lear_error();..
8df0: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
8e00: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
8e10: 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 LL);..#if OPENSS
8e20: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
8e30: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 < 0x10100000L &
8e40: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 & !defined(NO_SS
8e50: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L2) && !defined(
8e60: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
8e70: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
8e80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
8e90: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
8ea0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
8eb0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c rotocols[TLS_SSL
8ec0: 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 2], -1));.#endif
8ed0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
8ee0: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
8ef0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
8f00: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
8f10: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f OPENSSL_NO_SSL3_
8f20: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f METHOD). Tcl_
8f30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
8f40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
8f50: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
8f60: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
8f70: 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b TLS_SSL3], -1));
8f80: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
8f90: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 ined(NO_TLS1) &&
8fa0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
8fb0: 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 L_NO_TLS1) && !d
8fc0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
8fd0: 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 O_TLS1_METHOD).
8fe0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
8ff0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
9000: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
9010: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
9020: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d tocols[TLS_TLS1]
9030: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
9040: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
9050: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
9060: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
9070: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
9080: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
9090: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_1_METHOD).
90a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
90b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
90c0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
90d0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 StringObj(protoc
90e0: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c ols[TLS_TLS1_1],
90f0: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 -1));.#endif.#i
9100: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
9110: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
9120: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
9130: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
9140: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
9150: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 _2_METHOD). T
9160: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
9170: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
9180: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
9190: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
91a0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 ls[TLS_TLS1_2],
91b0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 -1));.#endif.#if
91c0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
91d0: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
91e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
91f0: 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 _3). Tcl_List
9200: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
9210: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
9220: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
9230: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
9240: 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 TLS1_3], -1));.#
9250: 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 endif.. Tcl_S
9260: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
9270: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
9280: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
9290: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
92a0: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
92b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
92c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e ------. *. * Han
9300: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a dshakeObjCmd --.
9310: 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 *. *.This comma
9320: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 nd is used to ve
9330: 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68 65 rify whether the
9340: 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f handshake is co
9350: 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 mplete. *.or not
9360: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
9370: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
9380: 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 cl result. 1 mea
9390: 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d ns handshake com
93a0: 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 plete, 0 means p
93b0: 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 ending.. *. * Si
93c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d de effects:. *.M
93d0: 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 ay force SSL neg
93e0: 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 otiation to take
93f0: 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d place.. *. *---
9400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9440: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
9450: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 HandshakeObjCmd(
9460: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
9470: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
9480: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
9490: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
94a0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
94b0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
94c0: 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 an; /* Th
94d0: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 e channel to set
94e0: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 a mode on. */.
94f0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
9500: 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c tr; /* cl
9510: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 ient state for s
9520: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 sl socket */.
9530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 const char *err
9540: 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 Str = NULL;.
9550: 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 int ret = 1;.
9560: 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 int err = 0;..
9570: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
9580: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
9590: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
95a0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
95b0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
95c0: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
95d0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
95e0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
95f0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
9600: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
9610: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
9620: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
9630: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 mObj(objv[1], NU
9640: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 LL), NULL);.
9650: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
9660: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
9670: 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 {..return(TCL_ER
9680: 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ROR);. }..
9690: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f /* Make sure to
96a0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
96b0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
96c0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
96d0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
96e0: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 chan);. if (T
96f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
9700: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
9710: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
9720: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
9730: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
9740: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
9750: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
9760: 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 han),.. "\":
9770: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
9780: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f l", NULL);..Tcl_
9790: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
97a0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e erp, "TLS", "HAN
97b0: 44 53 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 DSHAKE", "CHANNE
97c0: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 L", "INVALID", (
97d0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
97e0: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
97f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 );. }. sta
9800: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
9810: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 )Tcl_GetChannelI
9820: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e nstanceData(chan
9830: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 );.. dprintf(
9840: 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 "Calling Tls_Wai
9850: 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 tForConnect");.
9860: 20 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 ret = Tls_Wai
9870: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 tForConnect(stat
9880: 65 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a ePtr, &err, 1);.
9890: 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 dprintf("Tls
98a0: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 _WaitForConnect
98b0: 72 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 returned: %i", r
98c0: 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 et);.. if (re
98d0: 74 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 t < 0 && ((state
98e0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 Ptr->flags & TLS
98f0: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 _TCL_ASYNC) && (
9900: 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 err == EAGAIN)))
9910: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 {..dprintf("Asy
9920: 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d nc set and err =
9930: 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 EAGAIN");..ret
9940: 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 = 0;. } else
9950: 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 if (ret < 0) {..
9960: 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 long result;..er
9970: 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d rStr = statePtr-
9980: 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 >err;..Tcl_Reset
9990: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
99a0: 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 .Tcl_SetErrno(er
99b0: 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 r);...if (!errSt
99c0: 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d r || (*errStr ==
99d0: 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 0)) {.. errS
99e0: 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 tr = Tcl_PosixEr
99f0: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a ror(interp);..}.
9a00: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
9a10: 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 lt(interp, "hand
9a20: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c shake failed: ",
9a30: 20 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a errStr, (char *
9a40: 29 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 ) NULL);..if ((r
9a50: 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f esult = SSL_get_
9a60: 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 verify_result(st
9a70: 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d atePtr->ssl)) !=
9a80: 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 X509_V_OK) {..
9a90: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
9aa0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20 64 75 ult(interp, " du
9ab0: 65 20 74 6f 3a 20 22 2c 20 58 35 30 39 5f 76 65 e to: ", X509_ve
9ac0: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f rify_cert_error_
9ad0: 73 74 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 string(result),
9ae0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
9af0: 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 .}..Tcl_SetError
9b00: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
9b10: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c S", "HANDSHAKE",
9b20: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
9b30: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 *) NULL);..dpri
9b40: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 ntf("Returning T
9b50: 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 CL_ERROR with ha
9b60: 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 ndshake failed:
9b70: 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 %s", errStr);..r
9b80: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
9b90: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
9ba0: 69 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a if (err != 0) {.
9bb0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f . dprintf("Go
9bc0: 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 t an error with
9bd0: 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 a completed hand
9be0: 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 shake: err = %i"
9bf0: 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 , err);..}..ret
9c00: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 = 1;. }..
9c10: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
9c20: 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 ng TCL_OK with d
9c30: 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 ata \"%i\"", ret
9c40: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 );. Tcl_SetOb
9c50: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
9c60: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 Tcl_NewIntObj(re
9c70: 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 t));. return(
9c80: 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 TCL_OK);..client
9c90: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
9ca0: 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d a;.}../*. *-----
9cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
9cf0: 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d *. * ImportObjCm
9d00: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 d --. *. *.This
9d10: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
9d20: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
9d30: 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e the "ssl" comman
9d40: 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 d. *. *.The ssl
9d50: 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 command pushes S
9d60: 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 SL over a (newly
9d70: 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 connected) tcp
9d80: 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 socket. *. * Res
9d90: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
9da0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
9db0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
9dc0: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 ts:. *.May modif
9dd0: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f y the behavior o
9de0: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e f an IO channel.
9df0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
9e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
9e40: 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f atic int.ImportO
9e50: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
9e60: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
9e70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
9e80: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
9e90: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
9ea0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ) {. Tcl_Chan
9eb0: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 nel chan;../* Th
9ec0: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 e channel to set
9ed0: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 a mode on. */.
9ee0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
9ef0: 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 tr;../* client s
9f00: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 tate for ssl soc
9f10: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 ket */. SSL_C
9f20: 54 58 20 2a 63 74 78 09 20 20 20 20 20 20 20 20 TX *ctx.
9f30: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
9f40: 4f 62 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20 Obj *script.
9f50: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
9f60: 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 Tcl_Obj *passwor
9f70: 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c d. = NULL
9f80: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 ;. Tcl_Obj *v
9f90: 63 6d 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 cmd. = NU
9fa0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 LL;. Tcl_DStr
9fb0: 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c ing upperChannel
9fc0: 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 Translation, upp
9fd0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
9fe0: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 g, upperChannelE
9ff0: 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 ncoding, upperCh
a000: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 annelEOFChar;.
a010: 20 20 69 6e 74 20 69 64 78 2c 20 6c 65 6e 3b 0a int idx, len;.
a020: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09 20 int flags..
a030: 20 20 20 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c = TLS_TCL
a040: 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 _INIT;. int s
a050: 65 72 76 65 72 09 09 20 20 20 20 20 20 20 20 3d erver.. =
a060: 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 0;./* is connec
a070: 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 tion incoming or
a080: 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 outgoing? */.
a090: 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 char *keyfile.
a0a0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a0b0: 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 char *certfi
a0c0: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c le. = NUL
a0d0: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 L;. unsigned
a0e0: 63 68 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55 char *key .= NU
a0f0: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f LL;. int key_
a100: 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 len
a110: 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 = 0;. uns
a120: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 igned char *cert
a130: 20 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b = NULL;
a140: 0a 20 20 20 20 69 6e 74 20 63 65 72 74 5f 6c 65 . int cert_le
a150: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 n
a160: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a = 0;. char *
a170: 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20 ciphers.
a180: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
a190: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 09 20 *ciphersuites.
a1a0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a1b0: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 char *CAfile.
a1c0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a1d0: 20 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 09 char *CAdir.
a1e0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
a1f0: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 . char *DHpar
a200: 61 6d 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ams. = NU
a210: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f LL;. char *mo
a220: 64 65 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e del.. = N
a230: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 ULL;. char *s
a240: 65 72 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20 ervername.
a250: 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 = NULL;./* hos
a260: 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72 tname for Server
a270: 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e Name Indication
a280: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e */. const un
a290: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 signed char *ses
a2a0: 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a sion_id = NULL;.
a2b0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 Tcl_Obj *alp
a2c0: 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 n..= NULL;. i
a2d0: 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c nt ssl2 = 0, ssl
a2e0: 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 3 = 0;. int t
a2f0: 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 ls1 = 1, tls1_1
a300: 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c = 1, tls1_2 = 1,
a310: 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 tls1_3 = 1;.
a320: 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 int proto = 0,
a330: 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 level = -1;.
a340: 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 int verify = 0,
a350: 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 require = 0, req
a360: 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 uest = 1, post_h
a370: 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 andshake = 0;..
a380: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
a390: 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e ed");..#if defin
a3a0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 ed(NO_TLS1) || d
a3b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
a3c0: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 O_TLS1). tls1
a3d0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
a3e0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
a3f0: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
a400: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
a410: 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 ). tls1_1 = 0
a420: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
a430: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
a440: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
a450: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 SL_NO_TLS1_2).
a460: 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 tls1_2 = 0;.#e
a470: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
a480: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 (NO_TLS1_3) || d
a490: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
a4a0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c O_TLS1_3). tl
a4b0: 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 s1_3 = 0;.#endif
a4c0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c .. if (objc <
a4d0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
a4e0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
a4f0: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
a500: 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 l ?options?");..
a510: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a520: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
a530: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
a540: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
a550: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
a560: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
a570: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
a580: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 NULL), NULL);.
a590: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
a5a0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
a5b0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
a5c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
a5d0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
a5e0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
a5f0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
a600: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
a610: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
a620: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f l(chan);.. fo
a630: 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 r (idx = 2; idx
a640: 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b < objc; idx++) {
a650: 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 ..char *opt = Tc
a660: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
a670: 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 bj(objv[idx], NU
a680: 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 LL);...if (opt[0
a690: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 ] != '-').. b
a6a0: 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 reak;...OPTOBJ("
a6b0: 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 -alpn", alpn);..
a6c0: 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c OPTSTR("-cadir",
a6d0: 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52 CAdir);..OPTSTR
a6e0: 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 ("-cafile", CAfi
a6f0: 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d le);..OPTBYTE("-
a700: 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72 cert", cert, cer
a710: 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 t_len);..OPTSTR(
a720: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 "-certfile", cer
a730: 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 tfile);..OPTSTR(
a740: 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 "-cipher", ciphe
a750: 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 rs);..OPTSTR("-c
a760: 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 iphers", ciphers
a770: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 );..OPTSTR("-cip
a780: 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 hersuites", ciph
a790: 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f ersuites);..OPTO
a7a0: 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 BJ("-command", s
a7b0: 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 cript);..OPTSTR(
a7c0: 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 "-dhparams", DHp
a7d0: 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45 arams);..OPTBYTE
a7e0: 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 ("-key", key, ke
a7f0: 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 y_len);..OPTSTR(
a800: 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 "-keyfile", keyf
a810: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
a820: 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a model", model);.
a830: 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f .OPTOBJ("-passwo
a840: 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a rd", password);.
a850: 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f .OPTBOOL("-post_
a860: 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 handshake", post
a870: 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 _handshake);..OP
a880: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 TBOOL("-request"
a890: 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 , request);..OPT
a8a0: 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c BOOL("-require",
a8b0: 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49 require);..OPTI
a8c0: 4e 54 28 22 2d 73 65 63 75 72 69 74 79 6c 65 76 NT("-securitylev
a8d0: 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 el", level);..OP
a8e0: 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c TBOOL("-server",
a8f0: 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 server);..OPTST
a900: 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c R("-servername",
a910: 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f servername);..O
a920: 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f PTSTR("-session_
a930: 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 id", session_id)
a940: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c ;..OPTBOOL("-ssl
a950: 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 2", ssl2);..OPTB
a960: 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c OOL("-ssl3", ssl
a970: 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 3);..OPTBOOL("-t
a980: 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 ls1", tls1);..OP
a990: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c TBOOL("-tls1.1",
a9a0: 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f tls1_1);..OPTBO
a9b0: 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c OL("-tls1.2", tl
a9c0: 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 s1_2);..OPTBOOL(
a9d0: 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f "-tls1.3", tls1_
a9e0: 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61 3);..OPTOBJ("-va
a9f0: 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 lidatecommand",
aa00: 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 vcmd);..OPTOBJ("
aa10: 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a -vcmd", vcmd);..
aa20: 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 .OPTBAD("option"
aa30: 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 , "-alpn, -cadir
aa40: 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 , -cafile, -cert
aa50: 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 , -certfile, -ci
aa60: 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 pher, -ciphersui
aa70: 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d tes, -command, -
aa80: 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 dhparams, -key,
aa90: 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c -keyfile, -model
aaa0: 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f , -password, -po
aab0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 st_handshake, -r
aac0: 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65 equest, -require
aad0: 2c 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c , -securitylevel
aae0: 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 , -server, -serv
aaf0: 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e ername, -session
ab00: 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c _id, -ssl2, -ssl
ab10: 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 3, -tls1, -tls1.
ab20: 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 1, -tls1.2, -tls
ab30: 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 1.3, or -validat
ab40: 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 ecommand");...re
ab50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
ab60: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 }. if (re
ab70: 71 75 65 73 74 29 09 09 76 65 72 69 66 79 20 7c quest)..verify |
ab80: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 = SSL_VERIFY_CLI
ab90: 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 ENT_ONCE | SSL_V
aba0: 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 ERIFY_PEER;.
abb0: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72 if (request && r
abc0: 65 71 75 69 72 65 29 09 76 65 72 69 66 79 20 7c equire).verify |
abd0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 = SSL_VERIFY_FAI
abe0: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 L_IF_NO_PEER_CER
abf0: 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 T;. if (reque
ac00: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 st && post_hands
ac10: 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 hake).verify |=
ac20: 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f SSL_VERIFY_POST_
ac30: 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 HANDSHAKE;. i
ac40: 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 f (verify == 0).
ac50: 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 .verify = SSL_VE
ac60: 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 RIFY_NONE;..
ac70: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f proto |= (ssl2 ?
ac80: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 TLS_PROTO_SSL2
ac90: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
aca0: 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 |= (ssl3 ? TLS_P
acb0: 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a ROTO_SSL3 : 0);.
acc0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
acd0: 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 s1 ? TLS_PROTO_T
ace0: 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 LS1 : 0);. pr
acf0: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f oto |= (tls1_1 ?
ad00: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
ad10: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 1 : 0);. prot
ad20: 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 o |= (tls1_2 ? T
ad30: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 LS_PROTO_TLS1_2
ad40: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
ad50: 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 |= (tls1_3 ? TLS
ad60: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 _PROTO_TLS1_3 :
ad70: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 0);.. /* rese
ad80: 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 t to NULL if bla
ad90: 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 nk string provid
ada0: 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 ed */. if (ce
adb0: 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 rt && !*cert)..
adc0: 20 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20 cert.
add0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
ade0: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 if (key && !*key
adf0: 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 ).. key.
ae00: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
ae10: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 if (certfile
ae20: 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 && !*certfile)
ae30: 20 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 certfile.
ae40: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
ae50: 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 keyfile && !*key
ae60: 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 file)..keyfile.
ae70: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
ae80: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26 if (ciphers &
ae90: 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 & !*ciphers).
aea0: 20 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20 ciphers.
aeb0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
aec0: 20 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65 if (ciphersuite
aed0: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 s && !*ciphersui
aee0: 74 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65 tes) ciphersuite
aef0: 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 s = NULL;.
af00: 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 if (CAfile && !
af10: 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 *CAfile).
af20: 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 CAfile.
af30: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
af40: 43 41 64 69 72 20 26 26 20 21 2a 43 41 64 69 72 CAdir && !*CAdir
af50: 29 09 20 20 20 20 20 20 20 20 43 41 64 69 72 09 ). CAdir.
af60: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
af70: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 if (DHparams
af80: 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09 && !*DHparams).
af90: 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73 DHparams
afa0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
afb0: 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 . /* new SSL
afc0: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 state */. sta
afd0: 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20 tePtr..= (State
afe0: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 *) ckalloc((unsi
aff0: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61 gned) sizeof(Sta
b000: 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 te));. memset
b010: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 (statePtr, 0, si
b020: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 zeof(State));..
b030: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 statePtr->fla
b040: 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 gs.= flags;.
b050: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
b060: 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 .= interp;. s
b070: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 tatePtr->vflags.
b080: 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74 = verify;. st
b090: 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 atePtr->err.= ""
b0a0: 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 ;.. /* alloca
b0b0: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 te script */.
b0c0: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09 if (script) {..
b0d0: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 (void) Tcl_GetSt
b0e0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 ringFromObj(scri
b0f0: 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 pt, &len);..if (
b100: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 len) {.. stat
b110: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
b120: 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63 script;.. Tc
b130: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 l_IncrRefCount(s
b140: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
b150: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 k);..}. }..
b160: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 /* allocate pa
b170: 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 ssword */. if
b180: 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 (password) {..(
b190: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 void) Tcl_GetStr
b1a0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 ingFromObj(passw
b1b0: 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 ord, &len);..if
b1c0: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 (len) {.. sta
b1d0: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 tePtr->password
b1e0: 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 = password;..
b1f0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
b200: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 t(statePtr->pass
b210: 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a word);..}. }.
b220: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 . /* allocate
b230: 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e validate comman
b240: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d d */. if (vcm
b250: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c d) {..(void) Tcl
b260: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
b270: 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 j(vcmd, &len);..
b280: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 if (len) {..
b290: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
b2a0: 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f vcmd;.. Tcl_
b2b0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 IncrRefCount(sta
b2c0: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d tePtr->vcmd);..}
b2d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
b2e0: 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b model != NULL) {
b2f0: 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 ..int mode;../*
b300: 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 Get the "model"
b310: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e context */..chan
b320: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
b330: 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c l(interp, model,
b340: 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 &mode);..if (ch
b350: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
b360: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 el) NULL) {..
b370: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
b380: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
b390: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
b3a0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a ROR;..}.../*.. *
b3b0: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
b3c0: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
b3d0: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a most channel.. *
b3e0: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
b3f0: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
b400: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 );..if (Tcl_GetC
b410: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
b420: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
b430: 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 ype()) {.. Tc
b440: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
b450: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
b460: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
b470: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
b480: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
b490: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
b4a0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
b4b0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
b4c0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
b4d0: 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 T", "CHANNEL", "
b4e0: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
b4f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b500: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
b510: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
b520: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
b530: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 R;..}..ctx = ((S
b540: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
b550: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
b560: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 a(chan))->ctx;.
b570: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
b580: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 ((ctx = CTX_Init
b590: 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 (statePtr, serve
b5a0: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c r, proto, keyfil
b5b0: 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 e, certfile, key
b5c0: 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c , cert, key_len,
b5d0: 0a 09 20 20 20 20 63 65 72 74 5f 6c 65 6e 2c 20 .. cert_len,
b5e0: 43 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 CAdir, CAfile, c
b5f0: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 iphers, ciphersu
b600: 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 ites, level, DHp
b610: 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 arams)) == NULL)
b620: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
b630: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
b640: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
b650: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
b660: 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 }.. stateP
b670: 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a tr->ctx = ctx;..
b680: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 /*. * We
b690: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 need to make su
b6a0: 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e re that the chan
b6b0: 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e nel works in bin
b6c0: 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 ary (for the.
b6d0: 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e * encryption n
b6e0: 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 ot to get goofed
b6f0: 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 up).. * We
b700: 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a only want to adj
b710: 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69 6e ust the bufferin
b720: 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e g in pre-v2 chan
b730: 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20 nels, where.
b740: 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 * each channel
b750: 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69 in the stack mai
b760: 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 ntained its own
b770: 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f buffers.. */
b780: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
b790: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
b7a0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
b7b0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
b7c0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
b7d0: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 lBlocking);.
b7e0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
b7f0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
b800: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 Char);. Tcl_D
b810: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
b820: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
b830: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
b840: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
b850: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 rp, chan, "-eofc
b860: 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e har", &upperChan
b870: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 nelEOFChar);.
b880: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
b890: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
b8a0: 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c an, "-encoding",
b8b0: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e &upperChannelEn
b8c0: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c coding);. Tcl
b8d0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
b8e0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
b8f0: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 "-translation",
b900: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
b910: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 nslation);. T
b920: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
b930: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
b940: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 , "-blocking", &
b950: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
b960: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 king);. Tcl_S
b970: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
b980: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
b990: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 translation", "b
b9a0: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c inary");. Tcl
b9b0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
b9c0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
b9d0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 "-blocking", "tr
b9e0: 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 ue");. dprint
b9f0: 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c f("Consuming Tcl
ba00: 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 channel %s", Tc
ba10: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
ba20: 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 (chan));. sta
ba30: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 tePtr->self = Tc
ba40: 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 l_StackChannel(i
ba50: 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e nterp, Tls_Chann
ba60: 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e elType(), (Clien
ba70: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c tData) statePtr,
ba80: 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c (TCL_READABLE |
ba90: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 TCL_WRITABLE),
baa0: 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e chan);. dprin
bab0: 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e tf("Created chan
bac0: 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 nel named %s", T
bad0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
bae0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
baf0: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 ));. if (stat
bb00: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 ePtr->self == (T
bb10: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
bb20: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 ) {../*.. * No u
bb30: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 se of Tcl_Eventu
bb40: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 allyFree because
bb50: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c no possible Tcl
bb60: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a _Preserve... */.
bb70: 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 .Tls_Free((char
bb80: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 *) statePtr);..r
bb90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
bba0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
bbb0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
bbc0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
bbd0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 r->self, "-trans
bbe0: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 lation", Tcl_DSt
bbf0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
bc00: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
bc10: 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 on));. Tcl_Se
bc20: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
bc30: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
bc40: 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e >self, "-encodin
bc50: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 g", Tcl_DStringV
bc60: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
bc70: 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 elEncoding));.
bc80: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
bc90: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 Option(interp, s
bca0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 tatePtr->self, "
bcb0: 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 -eofchar", Tcl_D
bcc0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
bcd0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
bce0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ));. Tcl_SetC
bcf0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
bd00: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
bd10: 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 elf, "-blocking"
bd20: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
bd30: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
bd40: 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 Blocking));..
bd50: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 /*. * SSL I
bd60: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 nitialization.
bd70: 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 */. stateP
bd80: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 tr->ssl = SSL_ne
bd90: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 w(statePtr->ctx)
bda0: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65 ;. if (!state
bdb0: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 Ptr->ssl) {../*
bdc0: 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f SSL library erro
bdd0: 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 r */..Tcl_Append
bde0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
bdf0: 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 couldn't constru
be00: 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 ct ssl session:
be10: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 ", REASON(), (ch
be20: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
be30: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
be40: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
be50: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 , "IMPORT", "INI
be60: 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 T", "FAILED", (c
be70: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 har *) NULL);..T
be80: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
be90: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 statePtr);..ret
bea0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
beb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 }.. /* Set
bec0: 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d host server nam
bed0: 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 e */. if (ser
bee0: 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 vername) {../* S
bef0: 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e ets the server n
bf00: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 ame indication (
bf10: 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 SNI) in ClientHe
bf20: 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f llo extension */
bf30: 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 ../* Per RFC 606
bf40: 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 6, hostname is a
bf50: 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 ASCII encoded s
bf60: 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 tring, though RF
bf70: 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46 2d C 4366 says UTF-
bf80: 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 8. */..if (!SSL_
bf90: 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f set_tlsext_host_
bfa0: 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 name(statePtr->s
bfb0: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 sl, servername)
bfc0: 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 && require) {..
bfd0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
bfe0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74 ult(interp, "set
bff0: 74 69 6e 67 20 54 4c 53 20 68 6f 73 74 20 6e 61 ting TLS host na
c000: 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 me extension fai
c010: 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e led", (char *) N
c020: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
c030: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
c040: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
c050: 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 41 49 RT", "SNI", "FAI
c060: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
c070: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
c080: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
c090: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
c0a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
c0b0: 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e }.../* Set hostn
c0c0: 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 ame for peer cer
c0d0: 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d tificate hostnam
c0e0: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 e verification i
c0f0: 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 n clients... D
c100: 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74 on't use SSL_set
c110: 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20 1_host since it
c120: 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e has limitations.
c130: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 */..if (!SSL_ad
c140: 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 d1_host(statePtr
c150: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d ->ssl, servernam
c160: 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 e)) {.. Tcl_A
c170: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
c180: 72 70 2c 20 22 73 65 74 74 69 6e 67 20 44 4e 53 rp, "setting DNS
c190: 20 68 6f 73 74 20 6e 61 6d 65 20 66 61 69 6c 65 host name faile
c1a0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
c1b0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
c1c0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
c1d0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
c1e0: 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 ", "HOSTNAME", "
c1f0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
c200: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c ) NULL);.. Tl
c210: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
c220: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
c230: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
c240: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
c250: 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f /* Resume sessio
c260: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 n id */. if (
c270: 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 session_id && st
c280: 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 rlen(session_id)
c290: 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f <= SSL_MAX_SID_
c2a0: 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f CTX_LENGTH) {../
c2b0: 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f * SSL_set_sessio
c2c0: 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c n() */..if (!SSL
c2d0: 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 _SESSION_set1_id
c2e0: 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 _context(SSL_get
c2f0: 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 _session(statePt
c300: 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e r->ssl), session
c310: 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 _id, (unsigned i
c320: 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 nt) strlen(sessi
c330: 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 on_id))) {..
c340: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
c350: 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 (interp, "Resume
c360: 20 73 65 73 73 69 6f 6e 20 69 64 20 22 2c 20 73 session id ", s
c370: 65 73 73 69 6f 6e 5f 69 64 2c 20 22 20 66 61 69 ession_id, " fai
c380: 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e led", (char *) N
c390: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
c3a0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
c3b0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
c3c0: 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 RT", "SESSION",
c3d0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
c3e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
c3f0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
c400: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
c410: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
c420: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 R;..}. }..
c430: 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 /* Enable Appli
c440: 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f cation-Layer Pro
c450: 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f tocol Negotiatio
c460: 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61 72 65 3a n. Examples are:
c470: 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 http/1.0,..http
c480: 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 /1.1, h2, h3, ft
c490: 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 p, imap, pop3, x
c4a0: 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 mpp-client, xmpp
c4b0: 2d 73 65 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 -server, mqtt, i
c4c0: 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 rc, etc. */.
c4d0: 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 if (alpn) {../*
c4e0: 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69 Convert a TCL li
c4f0: 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 st into a protoc
c500: 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d ol-list in wire-
c510: 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 format */..unsig
c520: 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 ned char *protos
c530: 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 , *p;..unsigned
c540: 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d int protos_len =
c550: 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 6e 2c 0;..int i, len,
c560: 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a cnt;..Tcl_Obj *
c570: 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c *list;...if (Tcl
c580: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 _ListObjGetEleme
c590: 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e nts(interp, alpn
c5a0: 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 , &cnt, &list) !
c5b0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
c5c0: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
c5d0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
c5e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
c5f0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 ROR;..}.../* Det
c600: 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 ermine the memor
c610: 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 y required for t
c620: 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 he protocol-list
c630: 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b */..for (i = 0;
c640: 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b i < cnt; i++) {
c650: 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 .. Tcl_GetStr
c660: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b ingFromObj(list[
c670: 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 i], &len);..
c680: 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b if (len > 255) {
c690: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
c6a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 ult(interp, "ALP
c6b0: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 N protocol name
c6c0: 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 too long", (char
c6d0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c *) NULL);...Tcl
c6e0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
c6f0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
c700: 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 PORT", "ALPN", "
c710: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
c720: 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 ) NULL);...Tls_F
c730: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
c740: 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e tePtr);...return
c750: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 TCL_ERROR;..
c760: 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c }.. protos_l
c770: 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e 3b 0a 09 en += 1 + len;..
c780: 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 }.../* Build the
c790: 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 complete protoc
c7a0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 ol-list */..prot
c7b0: 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f os = ckalloc(pro
c7c0: 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 tos_len);../* pr
c7d0: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e otocol-lists con
c7e0: 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 sist of 8-bit le
c7f0: 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 ngth-prefixed, b
c800: 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 yte strings */..
c810: 66 6f 72 20 28 69 20 3d 20 30 2c 20 70 20 3d 20 for (i = 0, p =
c820: 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63 6e 74 3b protos; i < cnt;
c830: 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 i++) {.. cha
c840: 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 r *str = Tcl_Get
c850: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 StringFromObj(li
c860: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 st[i], &len);..
c870: 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 *p++ = len;..
c880: 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 memcpy(p, st
c890: 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 r, len);.. p
c8a0: 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 += len;..}.../*
c8b0: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f SSL_set_alpn_pro
c8c0: 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 tos makes a copy
c8d0: 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c of the protocol
c8e0: 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 -list */../* Not
c8f0: 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e e: This function
c900: 73 20 72 65 76 65 72 73 65 73 20 74 68 65 20 72 s reverses the r
c910: 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 eturn value conv
c920: 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 ention */..if (S
c930: 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 SL_set_alpn_prot
c940: 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c os(statePtr->ssl
c950: 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 , protos, protos
c960: 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 _len)) {.. Tc
c970: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
c980: 6e 74 65 72 70 2c 20 22 66 61 69 6c 65 64 20 74 nterp, "failed t
c990: 6f 20 73 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f o set ALPN proto
c9a0: 63 6f 6c 73 22 2c 20 28 63 68 61 72 20 2a 29 20 cols", (char *)
c9b0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
c9c0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
c9d0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
c9e0: 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 ORT", "ALPN", "F
c9f0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
ca00: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 NULL);.. Tls
ca10: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
ca20: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 tatePtr);.. c
ca30: 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 kfree(protos);..
ca40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
ca50: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 RROR;..}.../* St
ca60: 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 ore protocols li
ca70: 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d st */..statePtr-
ca80: 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 >protos = protos
ca90: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f ;..statePtr->pro
caa0: 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 tos_len = protos
cab0: 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 _len;. } else
cac0: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 {..statePtr->pr
cad0: 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 otos = NULL;..st
cae0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c atePtr->protos_l
caf0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 en = 0;. }..
cb00: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c /*. * SSL
cb10: 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 Callbacks.
cb20: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 */. SSL_set_a
cb30: 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 pp_data(statePtr
cb40: 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 ->ssl, (void *)s
cb50: 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 tatePtr);./* poi
cb60: 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f nt back to us */
cb70: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 . SSL_set_ver
cb80: 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ify(statePtr->ss
cb90: 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 l, verify, Verif
cba0: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 yCallback);.
cbb0: 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c SSL_set_info_cal
cbc0: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e lback(statePtr->
cbd0: 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 ssl, InfoCallbac
cbe0: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c k);.. /* Call
cbf0: 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 back for observi
cc00: 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 ng protocol mess
cc10: 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 ages */.#ifndef
cc20: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 OPENSSL_NO_SSL_T
cc30: 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 RACE. /* void
cc40: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 SSL_CTX_set_msg
cc50: 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 _callback_arg(st
cc60: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f atePtr->ctx, (vo
cc70: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
cc80: 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 void SSL_CTX
cc90: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
cca0: 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c k(statePtr->ctx,
ccb0: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b MessageCallback
ccc0: 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 ); */. SSL_se
ccd0: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 t_msg_callback_a
cce0: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c rg(statePtr->ssl
ccf0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
cd00: 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 tr);. SSL_set
cd10: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 _msg_callback(st
cd20: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 atePtr->ssl, Mes
cd30: 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 sageCallback);.#
cd40: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 endif.. /* Cr
cd50: 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c eate Tcl_Channel
cd60: 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a BIO Handler */.
cd70: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f statePtr->p_
cd80: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 bio.= BIO_new_tc
cd90: 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f l(statePtr, BIO_
cda0: 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 NOCLOSE);. st
cdb0: 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 atePtr->bio.= BI
cdc0: 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 O_new(BIO_f_ssl(
cdd0: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 ));.. if (ser
cde0: 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 ver) {../* Serve
cdf0: 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 r callbacks */..
ce00: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 SSL_CTX_set_tlse
ce10: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 xt_servername_ar
ce20: 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c g(statePtr->ctx,
ce30: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
ce40: 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 r);..SSL_CTX_set
ce50: 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 _tlsext_serverna
ce60: 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 me_callback(stat
ce70: 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 ePtr->ctx, SNICa
ce80: 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 llback);..SSL_CT
ce90: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c X_set_client_hel
cea0: 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e lo_cb(statePtr->
ceb0: 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 ctx, HelloCallba
cec0: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
ced0: 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 ePtr);..if (stat
cee0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
cef0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c NULL) {.. SSL
cf00: 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 _CTX_set_alpn_se
cf10: 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 lect_cb(statePtr
cf20: 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 ->ctx, ALPNCallb
cf30: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
cf40: 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 tePtr);.#ifdef U
cf50: 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 SE_NPN.. if (
cf60: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 tls1_2 == 0 && t
cf70: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 ls1_3 == 0) {...
cf80: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 SSL_CTX_set_next
cf90: 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 _protos_advertis
cfa0: 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ed_cb(statePtr->
cfb0: 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b ctx, NPNCallback
cfc0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
cfd0: 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 tr);.. }.#end
cfe0: 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c if..}.../* Enabl
cff0: 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 e server to send
d000: 20 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66 cert request af
d010: 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 ter handshake (T
d020: 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a LS 1.3 only) */.
d030: 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 ./* A write oper
d040: 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 ation must take
d050: 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 place for the Ce
d060: 72 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73 rtificate Reques
d070: 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 t to be.. sent
d080: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 to the client,
d090: 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 this can be done
d0a0: 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e with SSL_do_han
d0b0: 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 dshake(). */..if
d0c0: 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 (request && pos
d0d0: 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 t_handshake && t
d0e0: 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 ls1_3) {.. SS
d0f0: 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f L_verify_client_
d100: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 post_handshake(s
d110: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 tatePtr->ssl);..
d120: 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d }.../* set autom
d130: 61 74 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 atic curve selec
d140: 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 tion */..SSL_set
d150: 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 _ecdh_auto(state
d160: 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 Ptr->ssl, 1);...
d170: 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f /* Set server mo
d180: 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d de */..statePtr-
d190: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 >flags |= TLS_TC
d1a0: 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 L_SERVER;..SSL_s
d1b0: 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 et_accept_state(
d1c0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
d1d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a } else {../*
d1e0: 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b Client callback
d1f0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f s */.#ifdef USE_
d200: 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 NPN..if (statePt
d210: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c r->protos != NUL
d220: 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 L && tls1_2 == 0
d230: 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 && tls1_3 == 0)
d240: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f {.. SSL_CTX_
d250: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 set_next_proto_s
d260: 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 elect_cb(statePt
d270: 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c r->ctx, ALPNCall
d280: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 back, (void *)st
d290: 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 atePtr);..}.#end
d2a0: 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 if.../* Session
d2b0: 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f caching */..SSL_
d2c0: 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f CTX_set_session_
d2d0: 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 cache_mode(state
d2e0: 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 Ptr->ctx, SSL_SE
d2f0: 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 SS_CACHE_CLIENT
d300: 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 | SSL_SESS_CACHE
d310: 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f _NO_INTERNAL_STO
d320: 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 RE);..SSL_CTX_se
d330: 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 ss_set_new_cb(st
d340: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 atePtr->ctx, Ses
d350: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a sionCallback);..
d360: 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 ./* Enable post
d370: 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e handshake Authen
d380: 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 tication extensi
d390: 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 on. TLS 1.3 only
d3a0: 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f , not http/2. */
d3b0: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 ..if (request &&
d3c0: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 post_handshake)
d3d0: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f {.. SSL_set_
d3e0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 post_handshake_a
d3f0: 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 uth(statePtr->ss
d400: 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 l, 1);..}.../* S
d410: 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a et client mode *
d420: 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 /..SSL_set_conne
d430: 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 ct_state(statePt
d440: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 r->ssl);. }.
d450: 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 SSL_set_bio(s
d460: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 tatePtr->ssl, st
d470: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 atePtr->p_bio, s
d480: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b tatePtr->p_bio);
d490: 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c . BIO_set_ssl
d4a0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 (statePtr->bio,
d4b0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 statePtr->ssl, B
d4c0: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 IO_NOCLOSE);..
d4d0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 /*. * End
d4e0: 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 of SSL Init.
d4f0: 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 */. dprintf(
d500: 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 "Returning %s",
d510: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
d520: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
d530: 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 f));. Tcl_Set
d540: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 Result(interp, (
d550: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 char *) Tcl_GetC
d560: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
d570: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f Ptr->self), TCL_
d580: 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 VOLATILE);..
d590: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
d5a0: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
d5b0: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
d5c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
d5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d600: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d -----. *. * Unim
d610: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a portObjCmd --. *
d620: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
d630: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f re is invoked to
d640: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d remove the topm
d650: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 ost channel filt
d660: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
d670: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
d680: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
d690: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
d6a0: 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 . *.May modify t
d6b0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 he behavior of a
d6c0: 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a n IO channel.. *
d6d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
d6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d710: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
d720: 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 c int.UnimportOb
d730: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
d740: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
d750: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
d760: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
d770: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
d780: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e {. Tcl_Chann
d790: 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 el chan;../* The
d7a0: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 channel to set
d7b0: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 a mode on. */..
d7c0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
d7d0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
d7e0: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
d7f0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
d800: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
d810: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
d820: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
d830: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
d840: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
d850: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 nterp, Tcl_GetSt
d860: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e ring(objv[1]), N
d870: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 ULL);. if (ch
d880: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
d890: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
d8a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
d8b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b }.. /* Mak
d8c0: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
d8d0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
d8e0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
d8f0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
d900: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
d910: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
d920: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
d930: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
d940: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
d950: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
d960: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
d970: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
d980: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
d990: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 .."\": not a TLS
d9a0: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 channel", NULL)
d9b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
d9c0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
d9d0: 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 "TLS", "UNIMPORT
d9e0: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 ", "CHANNEL", "I
d9f0: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a NVALID", (char *
da00: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
da10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
da20: 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 }.. if (Tcl_U
da30: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e nstackChannel(in
da40: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 terp, chan) == T
da50: 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 CL_ERROR) {..ret
da60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
da70: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e }.. return
da80: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
da90: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
daa0: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
dab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
daf0: 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d *. * CTX_Init -
db00: 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 - construct a SS
db10: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 L_CTX instance.
db20: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
db30: 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 .A valid SSL_CTX
db40: 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c instance or NUL
db50: 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 L.. *. * Side ef
db60: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 fects:. *.constr
db70: 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 ucts SSL context
db80: 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d (CTX). *. *----
db90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
dbd0: 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 */.static SSL_C
dbe0: 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 TX *.CTX_Init(St
dbf0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 ate *statePtr, i
dc00: 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 nt isServer, int
dc10: 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 proto, char *ke
dc20: 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 yfile, char *cer
dc30: 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 tfile,. unsig
dc40: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 ned char *key, u
dc50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 nsigned char *ce
dc60: 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c rt, int key_len,
dc70: 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 int cert_len, c
dc80: 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 har *CAdir,.
dc90: 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 char *CAfile, ch
dca0: 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 ar *ciphers, cha
dcb0: 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c r *ciphersuites,
dcc0: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 int level, char
dcd0: 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 *DHparams) {.
dce0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
dcf0: 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d terp = statePtr-
dd00: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c >interp;. SSL
dd10: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
dd20: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
dd30: 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 g ds;. Tcl_DS
dd40: 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 tring ds1;. i
dd50: 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 nt off = 0;.
dd60: 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 int load_private
dd70: 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 _key;. const
dd80: 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 SSL_METHOD *meth
dd90: 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 od;.. dprintf
dda0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
ddb0: 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 if (!proto) {..
ddc0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
ddd0: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c (interp, "no val
dde0: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 id protocol sele
ddf0: 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 cted", NULL);..r
de00: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
de10: 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 }.. /* create
de20: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
de30: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
de40: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 ION_NUMBER >= 0x
de50: 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 10100000L || def
de60: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c ined(NO_SSL2) ||
de70: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
de80: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 _NO_SSL2). if
de90: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
dea0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 TLS_PROTO_SSL2)
deb0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
dec0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
ded0: 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 SL2 protocol not
dee0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
def0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
df00: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
df10: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 if defined(NO_SS
df20: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L3) || defined(O
df30: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a PENSSL_NO_SSL3).
df40: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 if (ENABLED(
df50: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
df60: 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 _SSL3)) {..Tcl_A
df70: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
df80: 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 rp, "SSL3 protoc
df90: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
dfa0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
dfb0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
dfc0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
dfd0: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 (NO_TLS1) || def
dfe0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
dff0: 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e TLS1). if (EN
e000: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
e010: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a _PROTO_TLS1)) {.
e020: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
e030: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
e040: 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .0 protocol not
e050: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
e060: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
e070: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 . }.#endif.#i
e080: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
e090: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_1) || defined(
e0a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
e0b0: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 1). if (ENABL
e0c0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
e0d0: 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 OTO_TLS1_1)) {..
e0e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
e0f0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e (interp, "TLS 1.
e100: 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 1 protocol not s
e110: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
e120: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
e130: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
e140: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
e150: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
e160: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
e170: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
e180: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
e190: 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 TO_TLS1_2)) {..T
e1a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e1b0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 interp, "TLS 1.2
e1c0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
e1d0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
e1e0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
e1f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
e200: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
e210: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
e220: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
e230: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
e240: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
e250: 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 O_TLS1_3)) {..Tc
e260: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e270: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 nterp, "TLS 1.3
e280: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
e290: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
e2a0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
e2b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 }.#endif. i
e2c0: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b f (proto == 0) {
e2d0: 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 ../* Use full ra
e2e0: 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f nge */..SSL_CTX_
e2f0: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 set_min_proto_ve
e300: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 rsion(ctx, 0);..
e310: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f SSL_CTX_set_max_
e320: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
e330: 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 x, 0);. }..
e340: 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 switch (proto)
e350: 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 {.#if OPENSSL_V
e360: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
e370: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 0x10100000L && !
e380: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
e390: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
e3a0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 NSSL_NO_SSL2).
e3b0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
e3c0: 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d _SSL2:..method =
e3d0: 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 isServer ? SSLv
e3e0: 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 2_server_method(
e3f0: 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 ) : SSLv2_client
e400: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
e410: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
e420: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
e430: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e440: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 SSL_NO_SSL3) &&
e450: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e460: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 _NO_SSL3_METHOD)
e470: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
e480: 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f OTO_SSL3:..metho
e490: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 d = isServer ? S
e4a0: 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 SLv3_server_meth
e4b0: 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 od() : SSLv3_cli
e4c0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
e4d0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
e4e0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
e4f0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
e500: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 PENSSL_NO_TLS1)
e510: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e520: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 SSL_NO_TLS1_METH
e530: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 OD). case TLS
e540: 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 _PROTO_TLS1:..me
e550: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
e560: 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d ? TLSv1_server_m
e570: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f ethod() : TLSv1_
e580: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
e590: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
e5a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
e5b0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
e5c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
e5d0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
e5e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e5f0: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_1_METHOD).
e600: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
e610: 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 TLS1_1:..method
e620: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 = isServer ? TLS
e630: 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 v1_1_server_meth
e640: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 od() : TLSv1_1_c
e650: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
e660: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
e670: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
e680: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
e690: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e6a0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
e6b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
e6c0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_2_METHOD).
e6d0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
e6e0: 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_2:..method =
e6f0: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
e700: 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 1_2_server_metho
e710: 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c d() : TLSv1_2_cl
e720: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
e730: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
e740: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
e750: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
e760: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
e770: 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 1_3). case TL
e780: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a S_PROTO_TLS1_3:.
e790: 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 ./* Use the gene
e7a0: 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 ric method and c
e7b0: 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 onstraint range
e7c0: 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 after context is
e7d0: 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 created */..met
e7e0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
e7f0: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 TLS_server_meth
e800: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e od() : TLS_clien
e810: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
e820: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 ak;.#endif. d
e830: 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f efault:../* Nego
e840: 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 tiate highest av
e850: 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 ailable SSL/TLS
e860: 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 version */..meth
e870: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
e880: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f TLS_server_metho
e890: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 d() : TLS_client
e8a0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f _method();.#if O
e8b0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
e8c0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
e8d0: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 00L && !defined(
e8e0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 NO_SSL2) && !def
e8f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
e900: 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 SSL2)..off |= (E
e910: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
e920: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 S_PROTO_SSL2)
e930: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
e940: 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 SSLv2);.#endif.#
e950: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 if !defined(NO_S
e960: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
e970: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
e980: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
e990: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
e9a0: 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 OTO_SSL3) ? 0
e9b0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 : SSL_OP_NO_SSLv
e9c0: 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 3);.#endif.#if !
e9d0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
e9e0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
e9f0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f NSSL_NO_TLS1)..o
ea00: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
ea10: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
ea20: 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 TLS1) ? 0 : SS
ea30: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a L_OP_NO_TLSv1);.
ea40: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
ea50: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 ned(NO_TLS1_1) &
ea60: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
ea70: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f SL_NO_TLS1_1)..o
ea80: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
ea90: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
eaa0: 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 TLS1_1) ? 0 : SS
eab0: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 L_OP_NO_TLSv1_1)
eac0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
ead0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
eae0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
eaf0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a NSSL_NO_TLS1_2).
eb00: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
eb10: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
eb20: 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 O_TLS1_2) ? 0 :
eb30: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f SSL_OP_NO_TLSv1_
eb40: 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 2);.#endif.#if !
eb50: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
eb60: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
eb70: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
eb80: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
eb90: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
eba0: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 OTO_TLS1_3) ? 0
ebb0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
ebc0: 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 1_3);.#endif..br
ebd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 eak;. }..
ebe0: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
ebf0: 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 );.. ctx = SS
ec00: 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 L_CTX_new(method
ec10: 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 );. if (!ctx)
ec20: 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 {..return(NULL)
ec30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
ec40: 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f (getenv(SSLKEYLO
ec50: 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 GFILE)) {..SSL_C
ec60: 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 TX_set_keylog_ca
ec70: 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c llback(ctx, KeyL
ec80: 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 ogCallback);.
ec90: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 }..#if !defined
eca0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 (NO_TLS1_3) && !
ecb0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
ecc0: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 NO_TLS1_3). i
ecd0: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f f (proto == TLS_
ece0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a PROTO_TLS1_3) {.
ecf0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e .SSL_CTX_set_min
ed00: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
ed10: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
ed20: 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 ON);..SSL_CTX_se
ed30: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 t_max_proto_vers
ed40: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
ed50: 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a VERSION);. }.
ed60: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 #endif.. /* F
ed70: 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 orce cipher sele
ed80: 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 ction order by s
ed90: 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 erver */. if
eda0: 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 (!isServer) {..S
edb0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
edc0: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 ns(ctx, SSL_OP_C
edd0: 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 IPHER_SERVER_PRE
ede0: 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a FERENCE);. }.
edf0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
ee00: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 _app_data(ctx, (
ee10: 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f void*)interp);./
ee20: 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 * remember the i
ee30: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 nterpreter */.
ee40: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 SSL_CTX_set_op
ee50: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
ee60: 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 P_ALL);./* all S
ee70: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e SL bug workaroun
ee80: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 ds */. SSL_CT
ee90: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
eea0: 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d x, SSL_OP_NO_COM
eeb0: 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69 PRESSION);./* di
eec0: 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f sable compressio
eed0: 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72 n even if suppor
eee0: 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 ted */. SSL_C
eef0: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 TX_set_options(c
ef00: 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 tx, off);../* di
ef10: 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 sable protocol v
ef20: 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f ersions */.#if O
ef30: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
ef40: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 UMBER < 0x101010
ef50: 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 00L. SSL_CTX_
ef60: 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 set_mode(ctx, SS
ef70: 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 L_MODE_AUTO_RETR
ef80: 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 Y);./* handle ne
ef90: 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 w handshakes in
efa0: 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 background. On b
efb0: 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 y default in Ope
efc0: 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 nSSL 1.1.1. */.#
efd0: 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 endif. SSL_CT
efe0: 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 X_sess_set_cache
eff0: 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b _size(ctx, 128);
f000: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 .. /* Set use
f010: 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 r defined cipher
f020: 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73 s, cipher suites
f030: 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c , and security l
f040: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 evel */. if (
f050: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c (ciphers != NULL
f060: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 ) && !SSL_CTX_se
f070: 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 t_cipher_list(ct
f080: 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 x, ciphers)) {..
f090: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
f0a0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 (interp, "Set ci
f0b0: 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f phers failed: No
f0c0: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c valid ciphers",
f0d0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
f0e0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
f0f0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
f100: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
f110: 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21 ((ciphersuites !
f120: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f = NULL) && !SSL_
f130: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 CTX_set_ciphersu
f140: 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 ites(ctx, cipher
f150: 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f suites)) {..Tcl_
f160: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f170: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 erp, "Set cipher
f180: 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 suites failed:
f190: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 No valid ciphers
f1a0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
f1b0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
f1c0: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e (ctx);..return N
f1d0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
f1e0: 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20 /* Set security
f1f0: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 level */. if
f200: 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c (level > -1 && l
f210: 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 evel < 6) {../*
f220: 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 SSL_set_security
f230: 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 _level */..SSL_C
f240: 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f TX_set_security_
f250: 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c level(ctx, level
f260: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
f270: 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 set some callba
f280: 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 cks */. SSL_C
f290: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 TX_set_default_p
f2a0: 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 asswd_cb(ctx, Pa
f2b0: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b sswordCallback);
f2c0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
f2d0: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f _default_passwd_
f2e0: 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c cb_userdata(ctx,
f2f0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
f300: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 r);.. /* read
f310: 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 a Diffie-Hellma
f320: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c n parameters fil
f330: 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 e, or use the bu
f340: 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 ilt-in one */.#i
f350: 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f fdef OPENSSL_NO_
f360: 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 DH. if (DHpar
f370: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ams != NULL) {..
f380: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
f390: 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 (interp, "DH par
f3a0: 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e ameter support n
f3b0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 ot available", (
f3c0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
f3d0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
f3e0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
f3f0: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 . }.#else.
f400: 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 {..DH* dh;..if
f410: 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c (DHparams != NUL
f420: 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 L) {.. BIO *b
f430: 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 io;.. Tcl_DSt
f440: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 ringInit(&ds);..
f450: 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 bio = BIO_ne
f460: 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 w_file(F2N(DHpar
f470: 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b ams, &ds), "r");
f480: 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 .. if (!bio)
f490: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 {...Tcl_DStringF
f4a0: 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f ree(&ds);...Tcl_
f4b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f4c0: 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 erp, "Could not
f4d0: 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 find DH paramete
f4e0: 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 rs file", (char
f4f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f *) NULL);...SSL_
f500: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
f510: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 .return NULL;..
f520: 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 }... dh =
f530: 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 PEM_read_bio_DHp
f540: 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c arams(bio, NULL,
f550: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 NULL, NULL);..
f560: 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 BIO_free(bio)
f570: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 ;.. Tcl_DStri
f580: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 ngFree(&ds);..
f590: 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 if (!dh) {...T
f5a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
f5b0: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e interp, "Could n
f5c0: 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61 6d ot read DH param
f5d0: 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 eters from file"
f5e0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
f5f0: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
f600: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
f610: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 NULL;.. }..}
f620: 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 68 20 3d else {.. dh =
f630: 20 67 65 74 5f 64 68 50 61 72 61 6d 73 28 29 3b get_dhParams();
f640: 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 ..}..SSL_CTX_set
f650: 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 _tmp_dh(ctx, dh)
f660: 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 29 3b 0a ;..DH_free(dh);.
f670: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 }.#endif..
f680: 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 /* set our cer
f690: 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 tificate */.
f6a0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 load_private_key
f6b0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 = 0;. if (ce
f6c0: 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 rtfile != NULL)
f6d0: 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f {..load_private_
f6e0: 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 key = 1;...Tcl_D
f6f0: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b StringInit(&ds);
f700: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 ...if (SSL_CTX_u
f710: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 se_certificate_f
f720: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 ile(ctx, F2N(cer
f730: 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c tfile, &ds), SSL
f740: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c _FILETYPE_PEM) <
f750: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f = 0) {.. Tcl_
f760: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
f770: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ;.. Tcl_Appen
f780: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f790: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 "unable to set c
f7a0: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 ertificate file
f7b0: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 ", certfile, ":
f7c0: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f ",.... REASO
f7d0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
f7e0: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
f7f0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
f800: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 return NULL;..
f810: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 }. } else if
f820: 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b (cert != NULL) {
f830: 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b ..load_private_k
f840: 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c ey = 1;..if (SSL
f850: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 _CTX_use_certifi
f860: 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 cate_ASN1(ctx, c
f870: 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c ert_len, cert) <
f880: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f = 0) {.. Tcl_
f890: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
f8a0: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ;.. Tcl_Appen
f8b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f8c0: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 "unable to set c
f8d0: 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 ertificate: ",..
f8e0: 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c .. REASON(),
f8f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
f900: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
f910: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
f920: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 turn NULL;..}.
f930: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 } else {..cert
f940: 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35 file = (char*)X5
f950: 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 09_get_default_c
f960: 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 ert_file();...if
f970: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 (SSL_CTX_use_ce
f980: 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 rtificate_file(c
f990: 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53 tx, certfile, SS
f9a0: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 L_FILETYPE_PEM)
f9b0: 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 <= 0) {.#if 0..
f9c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
f9d0: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 ee(&ds);.. Tc
f9e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
f9f0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
fa00: 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 o use default ce
fa10: 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 rtificate file "
fa20: 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 , certfile, ": "
fa30: 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e ,.... REASON
fa40: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
fa50: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
fa60: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
fa70: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 return NULL;.#e
fa80: 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ndif..}. }..
fa90: 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 /* set our pr
faa0: 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 ivate key */.
fab0: 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 if (load_privat
fac0: 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 e_key) {..if (ke
fad0: 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 yfile == NULL &&
fae0: 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a key == NULL) {.
faf0: 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 . keyfile = c
fb00: 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 ertfile;..}...if
fb10: 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c (keyfile != NUL
fb20: 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 L) {.. /* get
fb30: 20 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 the private key
fb40: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
fb50: 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74 this certificat
fb60: 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 e */.. if (ke
fb70: 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b yfile == NULL) {
fb80: 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 ...keyfile = cer
fb90: 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 tfile;.. }...
fba0: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f if (SSL_CTX_
fbb0: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 use_PrivateKey_f
fbc0: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 ile(ctx, F2N(key
fbd0: 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f file, &ds), SSL_
fbe0: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d FILETYPE_PEM) <=
fbf0: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 0) {...Tcl_DStr
fc00: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 ingFree(&ds);...
fc10: 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 /* flush the pas
fc20: 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 sphrase which mi
fc30: 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 ght be left in t
fc40: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 he result */...T
fc50: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
fc60: 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 erp, NULL, TCL_S
fc70: 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 TATIC);...Tcl_Ap
fc80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
fc90: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
fca0: 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c t public key fil
fcb0: 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 e ", keyfile, "
fcc0: 22 2c 0a 09 09 09 20 20 20 20 20 20 20 20 20 52 ",.... R
fcd0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
fce0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
fcf0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
fd00: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 return NULL;..
fd10: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
fd20: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a ringFree(&ds);..
fd30: 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 .} else if (key
fd40: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
fd50: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
fd60: 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 PrivateKey_ASN1(
fd70: 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 EVP_PKEY_RSA, ct
fd80: 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 x, key,key_len)
fd90: 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 <= 0) {...Tcl_DS
fda0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
fdb0: 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 ../* flush the p
fdc0: 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 assphrase which
fdd0: 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e might be left in
fde0: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 the result */..
fdf0: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
fe00: 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c nterp, NULL, TCL
fe10: 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f _STATIC);...Tcl_
fe20: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
fe30: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
fe40: 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 set public key:
fe50: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 ", REASON(), (ch
fe60: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
fe70: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
fe80: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
fe90: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e .. }..}../* N
fea0: 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 ow we know that
feb0: 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 a key and cert h
fec0: 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 ave been set aga
fed0: 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c inst.. * the SSL
fee0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 context */..if
fef0: 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f (!SSL_CTX_check_
ff00: 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 private_key(ctx)
ff10: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
ff20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
ff30: 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 , "private key d
ff40: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 oes not match th
ff50: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 e certificate pu
ff60: 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 blic key",....
ff70: 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c (char *) NULL
ff80: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
ff90: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 free(ctx);..
ffa0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a return NULL;..}.
ffb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
ffc0: 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 43 t verification C
ffd0: 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 As */. Tcl_DS
ffe0: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a tringInit(&ds);.
fff0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
10000 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20 2f nit(&ds1);. /
10010 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 64 * There is one d
10020 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 efault directory
10030 2c 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 66 69 , one default fi
10040 6c 65 2c 20 61 6e 64 20 6f 6e 65 20 64 65 66 61 le, and one defa
10050 75 6c 74 20 73 74 6f 72 65 2e 0a 09 54 68 65 20 ult store...The
10060 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 69 default CA certi
10070 66 69 63 61 74 65 73 20 64 69 72 65 63 74 6f 72 ficates director
10080 79 20 28 61 6e 64 20 64 65 66 61 75 6c 74 20 73 y (and default s
10090 74 6f 72 65 29 20 69 73 20 69 6e 20 74 68 65 20 tore) is in the
100a0 4f 70 65 6e 53 53 4c 0a 09 63 65 72 74 73 20 64 OpenSSL..certs d
100b0 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e irectory. It can
100c0 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 be overridden b
100d0 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 y the SSL_CERT_D
100e0 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65 0a IR env var. The.
100f0 09 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 .default CA cert
10100 69 66 69 63 61 74 65 73 20 66 69 6c 65 20 69 73 ificates file is
10110 20 63 61 6c 6c 65 64 20 63 65 72 74 2e 70 65 6d called cert.pem
10120 20 69 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 in the default
10130 4f 70 65 6e 53 53 4c 0a 09 64 69 72 65 63 74 6f OpenSSL..directo
10140 72 79 2e 20 49 74 20 63 61 6e 20 62 65 20 6f 76 ry. It can be ov
10150 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 erridden by the
10160 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e SSL_CERT_FILE en
10170 76 20 76 61 72 2e 20 2a 2f 0a 09 2f 2a 20 69 6e v var. */../* in
10180 74 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 t SSL_CTX_set_de
10190 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 64 69 72 fault_verify_dir
101a0 28 53 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 61 (SSL_CTX *ctx) a
101b0 6e 64 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 nd int SSL_CTX_s
101c0 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 et_default_verif
101d0 79 5f 66 69 6c 65 28 53 53 4c 5f 43 54 58 20 2a y_file(SSL_CTX *
101e0 63 74 78 29 20 2a 2f 0a 20 20 20 20 69 66 20 28 ctx) */. if (
101f0 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 !SSL_CTX_load_ve
10200 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 rify_locations(c
10210 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 tx, F2N(CAfile,
10220 26 64 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c &ds), F2N(CAdir,
10230 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c &ds1)) ||..!SSL
10240 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 _CTX_set_default
10250 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 _verify_paths(ct
10260 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c x)) {.#if 0..Tcl
10270 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
10280 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 );..Tcl_DStringF
10290 72 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44 ree(&ds1);../* D
102a0 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63 on't currently c
102b0 61 72 65 20 69 66 20 74 68 69 73 20 66 61 69 6c are if this fail
102c0 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 s */..Tcl_Append
102d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
102e0 53 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69 SSL default veri
102f0 66 79 20 70 61 74 68 73 3a 20 22 2c 20 52 45 41 fy paths: ", REA
10300 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
10310 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f NULL);..SSL_CTX_
10320 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 free(ctx);..retu
10330 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a rn NULL;.#endif.
10340 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 }.. /* ht
10350 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 tps://sourceforg
10360 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 e.net/p/tls/bugs
10370 2f 35 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 /57/ */. /* X
10380 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 XX:TODO: Let the
10390 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c user supply val
103a0 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 ues here instead
103b0 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 of something th
103c0 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 at exists on the
103d0 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20 filesystem */.
103e0 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 21 3d if (CAfile !=
103f0 20 4e 55 4c 4c 29 20 7b 0a 09 53 54 41 43 4b 5f NULL) {..STACK_
10400 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 OF(X509_NAME) *c
10410 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c ertNames = SSL_l
10420 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 oad_client_CA_fi
10430 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 le(F2N(CAfile, &
10440 64 73 29 29 3b 0a 09 69 66 20 28 63 65 72 74 4e ds));..if (certN
10450 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a ames != NULL) {.
10460 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
10470 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 _client_CA_list(
10480 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b ctx, certNames);
10490 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 ..}. }.. T
104a0 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
104b0 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ds);. Tcl_DSt
104c0 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a ringFree(&ds1);.
104d0 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a return ctx;.
104e0 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
104f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
10530 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 * StatusObjCmd
10540 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 -- return certif
10550 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 icate for connec
10560 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 ted peer.. *. *
10570 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
10580 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
10590 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
105a0 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
105b0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
105c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
105d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
105e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
105f0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
10600 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 tic int.StatusOb
10610 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
10620 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
10630 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
10640 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
10650 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
10660 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
10670 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 atePtr;. X509
10680 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f *peer;. Tcl_
10690 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 Obj *objPtr;.
106a0 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
106b0 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 n;. char *cha
106c0 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 nnelName, *ciphe
106d0 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 rs;. int mode
106e0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 ;. const unsi
106f0 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f gned char *proto
10700 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 ;. unsigned i
10710 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 nt len;. int
10720 6e 69 64 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 nid, res;.. d
10730 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
10740 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
10750 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 < 2 || objc > 3
10760 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 || (objc == 3 &&
10770 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 !strcmp(Tcl_Get
10780 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c String(objv[1]),
10790 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 "-local"))) {..
107a0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
107b0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
107c0 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e , "?-local? chan
107d0 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 nel");..return T
107e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
107f0 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e . /* Get chan
10800 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 nel Id */. ch
10810 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f annelName = Tcl_
10820 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
10830 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 (objv[(objc == 2
10840 20 3f 20 31 20 3a 20 32 29 5d 2c 20 4e 55 4c 4c ? 1 : 2)], NULL
10850 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 );. chan = Tc
10860 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
10870 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 erp, channelName
10880 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 , &mode);. if
10890 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
108a0 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
108b0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
108c0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
108d0 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
108e0 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
108f0 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a most channel */.
10900 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
10910 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
10920 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f n);. if (Tcl_
10930 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
10940 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
10950 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 nelType()) {..Tc
10960 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
10970 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
10980 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
10990 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
109a0 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
109b0 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
109c0 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 LL);..Tcl_SetErr
109d0 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
109e0 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 TLS", "STATUS",
109f0 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 "CHANNEL", "INVA
10a00 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LID", (char *) N
10a10 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
10a20 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
10a30 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 statePtr = (S
10a40 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 tate *) Tcl_GetC
10a50 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
10a60 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f ta(chan);.. /
10a70 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61 74 * Get certificat
10a80 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 e for peer or se
10a90 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 lf */. if (ob
10aa0 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 jc == 2) {..peer
10ab0 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f = SSL_get_peer_
10ac0 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 certificate(stat
10ad0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
10ae0 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d } else {..peer =
10af0 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 SSL_get_certifi
10b00 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 cate(statePtr->s
10b10 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f sl);. }. /
10b20 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 74 69 * Get X509 certi
10b30 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 ficate info */.
10b40 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 if (peer) {..
10b50 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 objPtr = Tls_New
10b60 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 X509Obj(interp,
10b70 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 peer);..if (objc
10b80 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 == 2) {.. X5
10b90 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 09_free(peer);..
10ba0 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b peer = NULL;
10bb0 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ..}. } else {
10bc0 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e ..objPtr = Tcl_N
10bd0 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
10be0 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f L);. }.. /
10bf0 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 * Peer name */.
10c00 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
10c10 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10c20 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 peername", SSL_g
10c30 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 et0_peername(sta
10c40 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 tePtr->ssl), -1)
10c50 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e ;. LAPPEND_IN
10c60 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
10c70 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 , "sbits", SSL_g
10c80 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 et_cipher_bits(s
10c90 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 tatePtr->ssl, NU
10ca0 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 LL));.. ciphe
10cb0 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f rs = (char*)SSL_
10cc0 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 get_cipher(state
10cd0 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c Ptr->ssl);. L
10ce0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
10cf0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 p, objPtr, "ciph
10d00 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 er", ciphers, -1
10d10 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 );.. /* Verif
10d20 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 y the X509 certi
10d30 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 ficate presented
10d40 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a by the peer */.
10d50 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
10d60 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10d70 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a "verifyResult",.
10d80 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 .X509_verify_cer
10d90 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 t_error_string(S
10da0 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 SL_get_verify_re
10db0 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 sult(statePtr->s
10dc0 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 sl)), -1);..
10dd0 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a /* Verify mode *
10de0 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c /. mode = SSL
10df0 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 _get_verify_mode
10e00 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
10e10 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 . if (mode &&
10e20 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 SSL_VERIFY_NONE
10e30 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 ) {..LAPPEND_STR
10e40 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10e50 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 "verifyMode", "
10e60 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 none", -1);.
10e70 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 } else {..Tcl_Ob
10e80 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 j *listObjPtr =
10e90 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
10ea0 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f , NULL);..if (mo
10eb0 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 de && SSL_VERIFY
10ec0 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 _PEER) {.. Tc
10ed0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10ee0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
10ef0 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e istObjPtr, Tcl_N
10f00 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 ewStringObj("pee
10f10 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 r", -1));..}..if
10f20 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 (mode && SSL_VE
10f30 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f RIFY_FAIL_IF_NO_
10f40 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 PEER_CERT) {..
10f50 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
10f60 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10f70 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 p, listObjPtr, T
10f80 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
10f90 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 "fail if no peer
10fa0 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d cert", -1));..}
10fb0 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 ..if (mode && SS
10fc0 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f L_VERIFY_CLIENT_
10fd0 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c ONCE) {.. Tcl
10fe0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
10ff0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 ement(interp, li
11000 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 stObjPtr, Tcl_Ne
11010 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 wStringObj("clie
11020 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a nt once", -1));.
11030 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 .}..if (mode &&
11040 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f SSL_VERIFY_POST_
11050 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 HANDSHAKE) {..
11060 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
11070 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
11080 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 p, listObjPtr, T
11090 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
110a0 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 "post handshake"
110b0 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 , -1));..}..LAPP
110c0 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
110d0 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d objPtr, "verifyM
110e0 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 ode", listObjPtr
110f0 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ). }.. /*
11100 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 Verify mode dept
11110 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 h */. LAPPEND
11120 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
11130 50 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 Ptr, "verifyDept
11140 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 h", SSL_get_veri
11150 66 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 fy_depth(statePt
11160 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f r->ssl));.. /
11170 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c * Report the sel
11180 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
11190 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 s a result of th
111a0 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f e negotiation */
111b0 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c . SSL_get0_al
111c0 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 pn_selected(stat
111d0 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 ePtr->ssl, &prot
111e0 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 o, &len);. LA
111f0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11200 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 , objPtr, "alpn"
11210 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c , (char *)proto,
11220 20 28 69 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20 (int) len);.
11230 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
11240 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 erp, objPtr, "pr
11250 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 otocol", SSL_get
11260 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 _version(statePt
11270 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 r->ssl), -1);..
11280 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 /* Valid for
11290 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72 non-RSA signatur
112a0 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f e and TLS 1.3 */
112b0 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d . if (objc ==
112c0 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 2) {..res = SSL
112d0 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 _get_peer_signat
112e0 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 ure_nid(statePtr
112f0 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 ->ssl, &nid);.
11300 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 } else {..res
11310 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 = SSL_get_signat
11320 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 ure_nid(statePtr
11330 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 ->ssl, &nid);.
11340 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 }. if (!res
11350 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 ) {nid = 0;}.
11360 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
11370 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 erp, objPtr, "si
11380 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 gnatureHashAlgor
11390 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c ithm", OBJ_nid2l
113a0 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 n(nid), -1);..
113b0 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 if (objc == 2)
113c0 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 {..res = SSL_ge
113d0 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 t_peer_signature
113e0 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 _type_nid(stateP
113f0 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a tr->ssl, &nid);.
11400 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 } else {..re
11410 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e s = SSL_get_sign
11420 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 ature_type_nid(s
11430 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e tatePtr->ssl, &n
11440 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 id);. }. i
11450 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 f (!res) {nid =
11460 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 0;}. LAPPEND_
11470 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11480 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79 tr, "signatureTy
11490 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 pe", OBJ_nid2ln(
114a0 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 nid), -1);..
114b0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
114c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
114d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
114e0 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 _OK;..clientData
114f0 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d = clientData;.}
11500 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
11510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
11550 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f * ConnectionInfo
11560 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
11570 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f connection info
11580 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 from OpenSSL..
11590 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
115a0 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 .A list of conne
115b0 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 ction info. *.
115c0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
115d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
115e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
115f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11600 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
11610 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 int ConnectionI
11620 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 nfoObjCmd(Client
11630 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
11640 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
11650 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
11660 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
11670 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
11680 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f Channel chan;../
11690 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
116a0 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a set a mode on *
116b0 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
116c0 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e tePtr;../* clien
116d0 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
116e0 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 socket */. Tc
116f0 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a l_Obj *objPtr, *
11700 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e listPtr;. con
11710 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 st SSL *ssl;.
11720 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 const SSL_CIPHE
11730 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 R *cipher;. c
11740 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e onst SSL_SESSION
11750 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 *session;. c
11760 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b onst EVP_MD *md;
11770 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
11780 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
11790 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
117a0 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
117b0 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 el");..return(TC
117c0 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a L_ERROR);. }.
117d0 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
117e0 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
117f0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
11800 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
11810 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 NULL), NULL);.
11820 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
11830 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
11840 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c L) {..return(TCL
11850 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a _ERROR);. }..
11860 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
11870 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
11880 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
11890 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
118a0 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
118b0 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 el(chan);. if
118c0 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
118d0 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
118e0 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
118f0 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
11900 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
11910 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
11920 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
11930 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c e(chan),.. "\
11940 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
11950 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 nnel", NULL);..T
11960 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
11970 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
11980 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 CONNECTION", "CH
11990 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 ANNEL", "INVALID
119a0 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
119b0 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 );..return(TCL_E
119c0 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 RROR);. }..
119d0 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
119e0 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
119f0 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e L);.. /* Conn
11a00 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 ection info */.
11a10 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 statePtr = (S
11a20 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
11a30 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
11a40 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c a(chan);. ssl
11a50 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c = statePtr->ssl
11a60 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d ;. if (ssl !=
11a70 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e NULL) {../* con
11a80 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f nection state */
11a90 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
11aa0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
11ab0 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 tate", SSL_state
11ac0 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c _string_long(ssl
11ad0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 ), -1);.../* Get
11ae0 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 SNI requested s
11af0 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c erver name */..L
11b00 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11b10 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 p, objPtr, "serv
11b20 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 ername", SSL_get
11b30 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c _servername(ssl,
11b40 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 TLSEXT_NAMETYPE
11b50 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 _host_name), -1)
11b60 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f ;.../* Get proto
11b70 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f col */..LAPPEND_
11b80 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11b90 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 tr, "protocol",
11ba0 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 SSL_get_version(
11bb0 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 ssl), -1);.../*
11bc0 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c Renegotiation al
11bd0 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e lowed */..LAPPEN
11be0 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
11bf0 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 bjPtr, "renegoti
11c00 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 ation_allowed",
11c10 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 SSL_get_secure_r
11c20 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 enegotiation_sup
11c30 70 6f 72 74 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a port(ssl));.../*
11c40 20 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 Get security le
11c50 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f vel */..LAPPEND_
11c60 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
11c70 74 72 2c 20 22 73 65 63 75 72 69 74 79 6c 65 76 tr, "securitylev
11c80 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 el", SSL_get_sec
11c90 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 urity_level(ssl)
11ca0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
11cb0 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 info */..LAPPEND
11cc0 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
11cd0 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 jPtr, "session_r
11ce0 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 eused", SSL_sess
11cf0 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 ion_reused(ssl))
11d00 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 ;.../* Is server
11d10 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e info */..LAPPEN
11d20 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
11d30 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 bjPtr, "is_serve
11d40 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 r", SSL_is_serve
11d50 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 r(ssl));.../* Is
11d60 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e DTLS */..LAPPEN
11d70 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
11d80 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 bjPtr, "is_dtls"
11d90 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 , SSL_is_dtls(ss
11da0 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 l));. }..
11db0 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a /* Cipher info *
11dc0 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 /. cipher = S
11dd0 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 SL_get_current_c
11de0 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 ipher(ssl);.
11df0 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 if (cipher != NU
11e00 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b LL) {..char buf[
11e10 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 BUFSIZ] = {0};..
11e20 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 int bits, alg_bi
11e30 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 ts;.../* Cipher
11e40 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 name */..LAPPEND
11e50 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11e60 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 Ptr, "cipher", S
11e70 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 SL_CIPHER_get_na
11e80 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b me(cipher), -1);
11e90 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f .../* RFC name o
11ea0 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 f cipher */..LAP
11eb0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11ec0 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 objPtr, "standa
11ed0 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 rd_name", SSL_CI
11ee0 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 PHER_standard_na
11ef0 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b me(cipher), -1);
11f00 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 .../* OpenSSL na
11f10 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a me of cipher */.
11f20 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
11f30 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 erp, objPtr, "op
11f40 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 enssl_name", OPE
11f50 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 NSSL_cipher_name
11f60 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e (SSL_CIPHER_stan
11f70 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 dard_name(cipher
11f80 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 )), -1);.../* nu
11f90 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 mber of secret b
11fa0 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 its used for cip
11fb0 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 her */..bits = S
11fc0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 SL_CIPHER_get_bi
11fd0 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f ts(cipher, &alg_
11fe0 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f bits);..LAPPEND_
11ff0 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
12000 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 tr, "secret_bits
12010 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 ", bits);..LAPPE
12020 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
12030 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 bjPtr, "algorith
12040 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 m_bits", alg_bit
12050 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 s);../* alg_bits
12060 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 is actual key s
12070 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 ecret bits. If u
12080 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 se bits and secr
12090 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 et (algorithm) b
120a0 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 its differ,..
120b0 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 the rest of the
120c0 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 bits are fixed,
120d0 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 i.e. for limited
120e0 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 export ciphers
120f0 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a (bits < 56) */..
12100 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 ./* Indicates wh
12110 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 ich SSL/TLS prot
12120 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 ocol version fir
12130 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 st defined the c
12140 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e ipher */..LAPPEN
12150 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
12160 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 jPtr, "min_versi
12170 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f on", SSL_CIPHER_
12180 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 get_version(ciph
12190 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 er), -1);.../* C
121a0 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 ipher NID */..LA
121b0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
121c0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 , objPtr, "ciphe
121d0 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f rNID", (char *)O
121e0 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
121f0 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f PHER_get_cipher_
12200 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
12210 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
12220 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12230 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 "digestNID", (ch
12240 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 ar *)OBJ_nid2ln(
12250 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 SSL_CIPHER_get_d
12260 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 igest_nid(cipher
12270 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e )), -1);..LAPPEN
12280 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
12290 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e jPtr, "keyExchan
122a0 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 geNID", (char *)
122b0 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 OBJ_nid2ln(SSL_C
122c0 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 IPHER_get_kx_nid
122d0 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
122e0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
122f0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 erp, objPtr, "au
12300 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 thenticationNID"
12310 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 , (char *)OBJ_ni
12320 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f d2ln(SSL_CIPHER_
12330 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 get_auth_nid(cip
12340 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a her)), -1);.../*
12350 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 message authent
12360 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 ication code - C
12370 69 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65 ipher is AEAD (e
12380 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 .g. GCM or ChaCh
12390 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 a20/Poly1305) or
123a0 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 not */../* Auth
123b0 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 enticated Encryp
123c0 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 tion with associ
123d0 61 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29 ated data (AEAD)
123e0 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 check */..LAPPE
123f0 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
12400 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f objPtr, "cipher_
12410 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 is_aead", SSL_CI
12420 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 PHER_is_aead(cip
12430 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 her));.../* Dige
12440 73 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 st used during t
12450 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 he SSL/TLS hands
12460 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 hake when using
12470 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 the cipher. */..
12480 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f md = SSL_CIPHER_
12490 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 get_handshake_di
124a0 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c gest(cipher);..L
124b0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
124c0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 p, objPtr, "hand
124d0 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 shake_digest", (
124e0 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 char *)EVP_MD_na
124f0 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f me(md), -1);.../
12500 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 * Get OpenSSL-sp
12510 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 ecific ID, not I
12520 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 ANA ID */..LAPPE
12530 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
12540 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 bjPtr, "cipher_i
12550 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 d", (int) SSL_CI
12560 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 PHER_get_id(ciph
12570 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 er));.../* Two-b
12580 79 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 yte ID used in t
12590 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 he TLS protocol
125a0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 of the given cip
125b0 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
125c0 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
125d0 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 tr, "protocol_id
125e0 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 ", (int) SSL_CIP
125f0 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c HER_get_protocol
12600 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 _id(cipher));...
12610 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 /* Textual descr
12620 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 iption of the ci
12630 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c pher */..if (SSL
12640 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 _CIPHER_descript
12650 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c ion(cipher, buf,
12660 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d sizeof(buf)) !=
12670 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 NULL) {.. LA
12680 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12690 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 , objPtr, "descr
126a0 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 iption", buf, -1
126b0 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
126c0 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f /* Session info
126d0 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 */. session
126e0 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f = SSL_get_sessio
126f0 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 n(ssl);. if (
12700 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 session != NULL)
12710 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e {..const unsign
12720 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
12730 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 ..size_t len2;..
12740 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 unsigned int ule
12750 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e n;..const unsign
12760 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
12770 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 63 68 _id, *proto;..ch
12780 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 ar buffer[SSL_MA
12790 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e X_MASTER_KEY_LEN
127a0 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 GTH];.../* Repor
127b0 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 t the selected p
127c0 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 rotocol as a res
127d0 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 ult of the ALPN
127e0 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 negotiation */..
127f0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
12800 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 _alpn_selected(s
12810 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 ession, &proto,
12820 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 &len2);..LAPPEND
12830 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12840 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 Ptr, "alpn", (ch
12850 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 69 6e ar *) proto, (in
12860 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 t) len2);.../* R
12870 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 eport the select
12880 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 ed protocol as a
12890 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e result of the N
128a0 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a PN negotiation *
128b0 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e /.#ifdef USE_NPN
128c0 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f ..SSL_get0_next_
128d0 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 proto_negotiated
128e0 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 (ssl, &proto, &u
128f0 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 len);..LAPPEND_S
12900 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12910 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 r, "npn", (char
12920 2a 29 20 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 *) proto, (int)
12930 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 ulen);.#endif...
12940 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 /* Resumable ses
12950 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 sion */..LAPPEND
12960 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
12970 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 jPtr, "resumable
12980 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 ", SSL_SESSION_i
12990 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73 s_resumable(sess
129a0 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 ion));.../* Sess
129b0 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28 ion start time (
129c0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 seconds since ep
129d0 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 och) */..LAPPEND
129e0 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 _LONG(interp, ob
129f0 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74 69 6d jPtr, "start_tim
12a00 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f e", SSL_SESSION_
12a10 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e get_time(session
12a20 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 ));.../* Timeout
12a30 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 value - SSL_CTX
12a40 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e _get_timeout (in
12a50 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 seconds) */..LA
12a60 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 PPEND_LONG(inter
12a70 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 p, objPtr, "time
12a80 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f out", SSL_SESSIO
12a90 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 N_get_timeout(se
12aa0 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 ssion));.../* Se
12ab0 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 ssion id - TLSv1
12ac0 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c .2 and below onl
12ad0 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 y */..session_id
12ae0 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
12af0 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 et_id(session, &
12b00 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f ulen);..LAPPEND_
12b10 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f BARRAY(interp, o
12b20 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f bjPtr, "session_
12b30 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c id", session_id,
12b40 20 28 69 6e 74 29 20 75 6c 65 6e 29 3b 0a 0a 09 (int) ulen);...
12b50 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 /* Session conte
12b60 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 xt */..session_i
12b70 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f d = SSL_SESSION_
12b80 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 get0_id_context(
12b90 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b session, &ulen);
12ba0 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
12bb0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12bc0 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 "session_contex
12bd0 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 t", session_id,
12be0 28 69 6e 74 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f (int) ulen);.../
12bf0 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 * Session ticket
12c00 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a - client only *
12c10 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 /..SSL_SESSION_g
12c20 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 et0_ticket(sessi
12c30 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 on, &ticket, &le
12c40 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 n2);..LAPPEND_BA
12c50 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a RRAY(interp, obj
12c60 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 Ptr, "session_ti
12c70 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 cket", ticket, (
12c80 69 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a int) len2);.../*
12c90 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 Session ticket
12ca0 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69 lifetime hint (i
12cb0 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c n seconds) */..L
12cc0 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 APPEND_LONG(inte
12cd0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66 rp, objPtr, "lif
12ce0 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 etime", SSL_SESS
12cf0 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c ION_get_ticket_l
12d00 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 ifetime_hint(ses
12d10 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 sion));.../* Tic
12d20 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a ket app data */.
12d30 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 .SSL_SESSION_get
12d40 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 0_ticket_appdata
12d50 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 (session, &ticke
12d60 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 t, &len2);..LAPP
12d70 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 END_BARRAY(inter
12d80 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b p, objPtr, "tick
12d90 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69 et_app_data", ti
12da0 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 cket, (int) len2
12db0 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 );.../* Get mast
12dc0 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 er key */..len2
12dd0 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
12de0 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 t_master_key(ses
12df0 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 sion, buffer, SS
12e00 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 L_MAX_MASTER_KEY
12e10 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 _LENGTH);..LAPPE
12e20 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 ND_BARRAY(interp
12e30 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 , objPtr, "maste
12e40 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20 r_key", buffer,
12e50 28 69 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f (int) len2);.../
12e60 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 * Compression id
12e70 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e */..unsigned in
12e80 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 t id = SSL_SESSI
12e90 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f ON_get_compress_
12ea0 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 id(session);..LA
12eb0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12ec0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 , objPtr, "compr
12ed0 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d ession_id", id =
12ee0 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 = 1 ? "zlib" : "
12ef0 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 none", -1);.
12f00 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 }.. /* Compre
12f10 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ssion info */.
12f20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c if (ssl != NUL
12f30 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 L) {.#ifdef HAVE
12f40 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e _SSL_COMPRESSION
12f50 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 ..const COMP_MET
12f60 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e HOD *comp, *expn
12f70 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 ;..comp = SSL_ge
12f80 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 t_current_compre
12f90 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 ssion(ssl);..exp
12fa0 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 n = SSL_get_curr
12fb0 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 ent_expansion(ss
12fc0 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 l);...LAPPEND_ST
12fd0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
12fe0 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c , "compression",
12ff0 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 comp ? SSL_COMP
13000 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 _get_name(comp)
13010 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 : "none", -1);..
13020 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
13030 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 rp, objPtr, "exp
13040 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 ansion", expn ?
13050 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d SSL_COMP_get_nam
13060 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 e(expn) : "none"
13070 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 , -1);.#else..LA
13080 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
13090 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 , objPtr, "compr
130a0 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c ession", "none",
130b0 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 -1);..LAPPEND_S
130c0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
130d0 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 r, "expansion",
130e0 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e "none", -1);.#en
130f0 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f dif. }.. /
13100 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f * Server info */
13110 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 . {..long mod
13120 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f e = SSL_CTX_get_
13130 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f session_cache_mo
13140 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 de(statePtr->ctx
13150 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a );..char *msg;..
13160 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f .if (mode & SSL_
13170 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 SESS_CACHE_OFF)
13180 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 {.. msg = "of
13190 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 f";..} else if (
131a0 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
131b0 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a CACHE_CLIENT) {.
131c0 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 . msg = "clie
131d0 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 nt";..} else if
131e0 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 (mode & SSL_SESS
131f0 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b _CACHE_SERVER) {
13200 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 .. msg = "ser
13210 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 ver";..} else if
13220 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
13230 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a S_CACHE_BOTH) {.
13240 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 . msg = "both
13250 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 ";..} else {..
13260 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e msg = "unknown
13270 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 ";..}..LAPPEND_S
13280 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
13290 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 r, "session_cach
132a0 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 e_mode", msg, -1
132b0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
132c0 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 CA List */.
132d0 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 /* IF not a serv
132e0 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f er, same as SSL_
132f0 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 get0_peer_CA_lis
13300 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 6d t. If server sam
13310 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 e as SSL_CTX_get
13320 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 _client_CA_list
13330 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d */. listPtr =
13340 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
13350 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 0, NULL);. ST
13360 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 ACK_OF(X509_NAME
13370 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 ) *ca_list;.
13380 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 if ((ca_list = S
13390 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 SL_get_client_CA
133a0 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e _list(ssl)) != N
133b0 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 ULL) {..char buf
133c0 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f fer[BUFSIZ];..fo
133d0 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 r (int i = 0; i
133e0 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e < sk_X509_NAME_n
133f0 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b um(ca_list); i++
13400 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 ) {.. X509_NA
13410 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 ME *name = sk_X5
13420 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 09_NAME_value(ca
13430 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 _list, i);..
13440 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 if (name) {...X5
13450 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 09_NAME_oneline(
13460 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 name, buffer, BU
13470 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 FSIZ);...Tcl_Lis
13480 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
13490 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 t(interp, listPt
134a0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
134b0 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 Obj(buffer, -1))
134c0 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 ;.. }..}.
134d0 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 }. LAPPEND_OB
134e0 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 J(interp, objPtr
134f0 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 , "caList", list
13500 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e Ptr);. LAPPEN
13510 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
13520 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 jPtr, "caListCou
13530 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d nt", sk_X509_NAM
13540 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b E_num(ca_list));
13550 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
13560 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
13570 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
13580 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
13590 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
135a0 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
135b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
135c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
135d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
135e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
135f0 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f -. *. * VersionO
13600 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 bjCmd -- return
13610 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 version string f
13620 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a rom OpenSSL.. *.
13630 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
13640 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
13650 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
13660 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
13670 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
13680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
136a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
136b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
136c0 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 static int.Versi
136d0 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 onObjCmd(ClientD
136e0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
136f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
13700 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
13710 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
13720 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f v[]) {. Tcl_O
13730 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 bj *objPtr;..
13740 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
13750 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 ");.. objPtr
13760 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f = Tcl_NewStringO
13770 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 bj(OPENSSL_VERSI
13780 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 ON_TEXT, -1);.
13790 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
137a0 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
137b0 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
137c0 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 TCL_OK;..clientD
137d0 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
137e0 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a ;..objc = objc;.
137f0 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a .objv = objv;.}.
13800 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
13810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
13850 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d MiscObjCmd -- m
13860 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a isc commands. *.
13870 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
13880 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
13890 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
138a0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
138b0 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
138c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
13900 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f static int.MiscO
13910 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
13920 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
13930 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
13940 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
13950 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
13960 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 ) {. static c
13970 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 onst char *comma
13980 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 nds [] = { "req"
13990 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c , "strreq", NULL
139a0 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d };. enum com
139b0 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f mand { C_REQ, C_
139c0 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 STRREQ, C_DUMMY
139d0 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c 20 };. int cmd,
139e0 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 isStr;. char
139f0 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a buffer[16384];..
13a00 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
13a10 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
13a20 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c objc < 2) {..Tcl
13a30 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
13a40 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
13a50 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 subcommand ?args
13a60 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c ?");..return TCL
13a70 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
13a80 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 if (Tcl_GetInd
13a90 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 exFromObj(interp
13aa0 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 , objv[1], comma
13ab0 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 nds, "command",
13ac0 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 0, &cmd) != TCL_
13ad0 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
13ae0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
13af0 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
13b00 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 ror();.. isSt
13b10 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 r = (cmd == C_ST
13b20 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 RREQ);. switc
13b30 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 h ((enum command
13b40 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 ) cmd) {..case C
13b50 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 _REQ:..case C_ST
13b60 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 RREQ: {.. EVP
13b70 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c _PKEY *pkey=NULL
13b80 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 ;.. X509 *cer
13b90 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 t=NULL;.. X50
13ba0 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 9_NAME *name=NUL
13bb0 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 L;.. Tcl_Obj
13bc0 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 69 6e **listv;.. in
13bd0 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 t listc,i;...
13be0 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a BIO *out=NULL;.
13bf0 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d .. char *k_C=
13c00 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c "",*k_ST="",*k_L
13c10 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f ="",*k_O="",*k_O
13c20 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b U="",*k_CN="",*k
13c30 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 _Email="";..
13c40 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 char *keyout,*pe
13c50 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 mout,*str;..
13c60 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 int keysize,seri
13c70 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a al=0,days=365;..
13c80 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
13c90 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
13ca0 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 0000000L.. BI
13cb0 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c GNUM *bne = NULL
13cc0 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 ;.. RSA *rsa
13cd0 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 = NULL;.#else..
13ce0 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 EVP_PKEY_CTX
13cf0 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e *ctx = NULL;.#en
13d00 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f dif... if ((o
13d10 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e bjc<5) || (objc>
13d20 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 6)) {...Tcl_Wron
13d30 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
13d40 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 2, objv, "keysi
13d50 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 ze keyfile certf
13d60 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 ile ?info?");...
13d70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
13d80 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 ;.. }... i
13d90 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
13da0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
13db0 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 v[2], &keysize)
13dc0 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 != TCL_OK) {...r
13dd0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
13de0 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 .. }.. key
13df0 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e out=Tcl_GetStrin
13e00 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 g(objv[3]);..
13e10 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 pemout=Tcl_GetS
13e20 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a tring(objv[4]);.
13e30 09 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 . if (isStr)
13e40 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 {...Tcl_SetVar(i
13e50 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c nterp,keyout,"",
13e60 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 0);...Tcl_SetVar
13e70 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 (interp,pemout,"
13e80 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 ",0);.. }...
13e90 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 if (objc>=6)
13ea0 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 {...if (Tcl_List
13eb0 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 ObjGetElements(i
13ec0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a nterp, objv[5],.
13ed0 09 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 ...&listc, &list
13ee0 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a v) != TCL_OK) {.
13ef0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
13f00 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 _ERROR;...}....i
13f10 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 f ((listc%2) !=
13f20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 0) {... Tcl_S
13f30 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
13f40 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 "Information lis
13f50 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e t must have even
13f60 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d number of argum
13f70 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ents",NULL);...
13f80 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
13f90 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 ROR;...}...for (
13fa0 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b i=0; i<listc; i+
13fb0 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d =2) {... str=
13fc0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
13fd0 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 stv[i]);... i
13fe0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 f (strcmp(str,"d
13ff0 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 ays")==0) {....i
14000 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
14010 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 mObj(interp,list
14020 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 v[i+1],&days)!=T
14030 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 CL_OK).... re
14040 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
14050 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
14060 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 (strcmp(str,"ser
14070 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 ial")==0) {....i
14080 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
14090 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 mObj(interp,list
140a0 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 v[i+1],&serial)!
140b0 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 =TCL_OK)....
140c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
140d0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
140e0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 f (strcmp(str,"C
140f0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d ")==0) {....k_C=
14100 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
14110 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
14120 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
14130 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 mp(str,"ST")==0)
14140 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 {....k_ST=Tcl_G
14150 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
14160 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
14170 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
14180 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 r,"L")==0) {....
14190 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e k_L=Tcl_GetStrin
141a0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
141b0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
141c0 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d strcmp(str,"O")=
141d0 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c =0) {....k_O=Tcl
141e0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
141f0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
14200 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
14210 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a str,"OU")==0) {.
14220 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 ...k_OU=Tcl_GetS
14230 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
14240 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
14250 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
14260 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f CN")==0) {....k_
14270 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 CN=Tcl_GetString
14280 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
14290 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
142a0 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c trcmp(str,"Email
142b0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d ")==0) {....k_Em
142c0 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e ail=Tcl_GetStrin
142d0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
142e0 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
142f0 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
14300 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 nterp,"Unknown p
14310 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b arameter",NULL);
14320 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ....return TCL_E
14330 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 RROR;... }...
14340 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 }.. }..#if OP
14350 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
14360 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
14370 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 0L.. bne = BN
14380 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 _new();.. rsa
14390 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 = RSA_new();..
143a0 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b pkey = EVP_PK
143b0 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 EY_new();.. i
143c0 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c f (bne == NULL |
143d0 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c | rsa == NULL ||
143e0 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c pkey == NULL ||
143f0 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e !BN_set_word(bn
14400 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 e,RSA_F4) ||...!
14410 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 RSA_generate_key
14420 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 _ex(rsa, keysize
14430 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 , bne, NULL) ||
14440 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e !EVP_PKEY_assign
14450 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 _RSA(pkey, rsa))
14460 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 {...EVP_PKEY_fr
14470 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 ee(pkey);.../* R
14480 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 SA_free(rsa); fr
14490 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f eed by EVP_PKEY_
144a0 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 free */...BN_fre
144b0 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 e(bne);.#else..
144c0 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 pkey = EVP_RS
144d0 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 A_gen((unsigned
144e0 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 int) keysize);..
144f0 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b ctx = EVP_PK
14500 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c EY_CTX_new(pkey,
14510 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 NULL);.. if (
14520 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 pkey == NULL ||
14530 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 ctx == NULL || !
14540 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f EVP_PKEY_keygen_
14550 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 init(ctx) ||...!
14560 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 EVP_PKEY_CTX_set
14570 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 _rsa_keygen_bits
14580 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c (ctx, keysize) |
14590 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 | !EVP_PKEY_keyg
145a0 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 en(ctx, &pkey))
145b0 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 {...EVP_PKEY_fre
145c0 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 e(pkey);...EVP_P
145d0 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 KEY_CTX_free(ctx
145e0 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f );.#endif...Tcl_
145f0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
14600 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 ,"Error generati
14610 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c ng private key",
14620 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 NULL);...return
14630 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
14640 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 } else {...if (i
14650 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 sStr) {... ou
14660 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
14670 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 mem());... PE
14680 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 M_write_bio_Priv
14690 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c ateKey(out,pkey,
146a0 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c NULL,NULL,0,NULL
146b0 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d ,NULL);... i=
146c0 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 BIO_read(out,buf
146d0 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 fer,sizeof(buffe
146e0 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 r)-1);... i=(
146f0 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 i<0) ? 0 : i;...
14700 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c buffer[i]='\
14710 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 0';... Tcl_Se
14720 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f tVar(interp,keyo
14730 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 ut,buffer,0);...
14740 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 BIO_flush(ou
14750 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 t);... BIO_fr
14760 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 ee(out);...} els
14770 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 e {... out=BI
14780 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 O_new(BIO_s_file
14790 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 ());... BIO_w
147a0 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 rite_filename(ou
147b0 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 t,keyout);...
147c0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 PEM_write_bio_P
147d0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b rivateKey(out,pk
147e0 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e ey,NULL,NULL,0,N
147f0 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 ULL,NULL);...
14800 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 /* PEM_write_bi
14810 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 o_RSAPrivateKey(
14820 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 out, rsa, NULL,
14830 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e NULL, 0, NULL, N
14840 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 ULL); */... B
14850 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 IO_free_all(out)
14860 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 ;.. .}....if ((c
14870 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d ert=X509_new())=
14880 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 =NULL) {... T
14890 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
148a0 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 erp,"Error gener
148b0 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 ating certificat
148c0 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 e request",NULL)
148d0 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 ;... EVP_PKEY
148e0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 _free(pkey);.#if
148f0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
14900 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
14910 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 0000L... BN_f
14920 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 ree(bne);.#endif
14930 0a 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 ... return(TC
14940 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 L_ERROR);...}...
14950 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f .X509_set_versio
14960 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e n(cert,2);...ASN
14970 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 1_INTEGER_set(X5
14980 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 09_get_serialNum
14990 62 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c ber(cert),serial
149a0 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 );...X509_gmtime
149b0 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e _adj(X509_getm_n
149c0 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 otBefore(cert),0
149d0 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 );...X509_gmtime
149e0 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e _adj(X509_getm_n
149f0 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c otAfter(cert),(l
14a00 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 ong)60*60*24*day
14a10 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 s);...X509_set_p
14a20 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 ubkey(cert,pkey)
14a30 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 ;....name=X509_g
14a40 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 et_subject_name(
14a50 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e cert);....X509_N
14a60 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
14a70 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d _txt(name,"C", M
14a80 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
14a90 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
14aa0 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 r *) k_C, -1, -1
14ab0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
14ac0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
14ad0 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 xt(name,"ST", MB
14ae0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
14af0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
14b00 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 *) k_ST, -1, -1
14b10 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
14b20 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
14b30 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 xt(name,"L", MBS
14b40 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
14b50 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
14b60 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 *) k_L, -1, -1,
14b70 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
14b80 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
14b90 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 (name,"O", MBSTR
14ba0 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
14bb0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
14bc0 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_O, -1, -1, 0)
14bd0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
14be0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
14bf0 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 ame,"OU", MBSTRI
14c00 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
14c10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
14c20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_OU, -1, -1, 0)
14c30 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
14c40 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
14c50 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 ame,"CN", MBSTRI
14c60 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
14c70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
14c80 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_CN, -1, -1, 0)
14c90 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
14ca0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
14cb0 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 ame,"Email", MBS
14cc0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
14cd0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
14ce0 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 *) k_Email, -1,
14cf0 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f -1, 0);....X509_
14d00 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 set_subject_name
14d10 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 (cert,name);....
14d20 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 if (!X509_sign(c
14d30 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 ert,pkey,EVP_sha
14d40 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 256())) {...
14d50 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b X509_free(cert);
14d60 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f ... EVP_PKEY_
14d70 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
14d80 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
14d90 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
14da0 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 000L... BN_fr
14db0 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
14dc0 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 .. Tcl_SetRes
14dd0 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f ult(interp,"Erro
14de0 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 r signing certif
14df0 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 icate",NULL);...
14e00 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
14e10 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 RROR;...}....if
14e20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 (isStr) {...
14e30 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f out=BIO_new(BIO_
14e40 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 s_mem());...
14e50 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 PEM_write_bio_X5
14e60 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 09(out,cert);...
14e70 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f i=BIO_read(o
14e80 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 ut,buffer,sizeof
14e90 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 (buffer)-1);...
14ea0 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a i=(i<0) ? 0 :
14eb0 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 i;... buffer
14ec0 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 [i]='\0';...
14ed0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 Tcl_SetVar(inter
14ee0 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c p,pemout,buffer,
14ef0 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 0);... BIO_fl
14f00 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 ush(out);...
14f10 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 BIO_free(out);..
14f20 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 .} else {...
14f30 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f out=BIO_new(BIO_
14f40 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 s_file());...
14f50 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e BIO_write_filen
14f60 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b ame(out,pemout);
14f70 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 ... PEM_write
14f80 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 _bio_X509(out,ce
14f90 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 rt);... BIO_f
14fa0 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 ree_all(out);...
14fb0 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 }....X509_free(c
14fc0 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 ert);...EVP_PKEY
14fd0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 _free(pkey);.#if
14fe0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
14ff0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
15000 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 0000L...BN_free(
15010 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 bne);.#endif..
15020 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 }..}..break;.
15030 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 default:..bre
15040 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 ak;. }. re
15050 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
15060 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
15070 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a tData;.}.../****
15080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15090 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 /./* Init
150a0 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a */./******
150b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
150c0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
150d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
150e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
150f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15100 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
15110 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 Tls_Free --. *.
15120 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
15130 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 cleans up when
15140 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 a SSL socket bas
15150 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 ed channel. *.is
15160 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 closed and its
15170 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 reference count
15180 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a falls below 1. *
15190 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
151a0 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 none. *. * Side
151b0 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 effects:. *.Free
151c0 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a s all the state.
151d0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
151e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15210 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
15220 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 d.Tls_Free(char
15230 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 *blockPtr) {.
15240 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
15250 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 = (State *)bloc
15260 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e kPtr;.. dprin
15270 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
15280 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 Tls_Clean(sta
15290 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 tePtr);. ckfr
152a0 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a ee(blockPtr);.}.
152b0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
152c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
152d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a ----------. *. *
15300 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a Tls_Clean --. *
15310 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
15320 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 re cleans up whe
15330 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 n a SSL socket b
15340 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 ased channel. *.
15350 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 is closed and it
15360 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e s reference coun
15370 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e t falls below 1.
15380 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a This should. *
15390 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 .be called synch
153a0 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 ronously by the
153b0 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 CloseProc, not i
153c0 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 n the. *.Eventua
153d0 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b llyFree callback
153e0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
153f0 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.none. *. * S
15400 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
15410 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 Frees all the st
15420 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ate. *. *-------
15430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
15470 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 .void Tls_Clean(
15480 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 State *statePtr)
15490 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 {. dprintf("
154a0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f Called");.. /
154b0 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 *. * we're a
154c0 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 ssuming here tha
154d0 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 t we're single-t
154e0 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a hreaded. */.
154f0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
15500 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f ->timer != (Tcl_
15510 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c TimerToken) NULL
15520 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 ) {..Tcl_DeleteT
15530 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 imerHandler(stat
15540 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 ePtr->timer);..s
15550 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
15560 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
15570 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
15580 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 protos) {..ckfre
15590 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 e(statePtr->prot
155a0 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e os);..statePtr->
155b0 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 protos = NULL;.
155c0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
155d0 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f tePtr->bio) {../
155e0 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c * This will call
155f0 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 SSL_shutdown. B
15600 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 ug 1414045 */..d
15610 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 printf("BIO_free
15620 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 _all(%p)", state
15630 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f Ptr->bio);..BIO_
15640 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 free_all(statePt
15650 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 r->bio);..stateP
15660 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a tr->bio = NULL;.
15670 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
15680 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 atePtr->ssl) {..
15690 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 dprintf("SSL_fre
156a0 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 e(%p)", statePtr
156b0 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 ->ssl);..SSL_fre
156c0 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
156d0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ;..statePtr->ssl
156e0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
156f0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
15700 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 >ctx) {..SSL_CTX
15710 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e _free(statePtr->
15720 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ctx);..statePtr-
15730 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 >ctx = NULL;.
15740 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
15750 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b Ptr->callback) {
15760 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 ..Tcl_DecrRefCou
15770 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c nt(statePtr->cal
15780 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 lback);..statePt
15790 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 r->callback = NU
157a0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
157b0 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 (statePtr->pass
157c0 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 word) {..Tcl_Dec
157d0 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
157e0 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 tr->password);..
157f0 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
15800 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d rd = NULL;. }
15810 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
15820 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f r->vcmd) {..Tcl_
15830 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 DecrRefCount(sta
15840 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 tePtr->vcmd);..s
15850 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 tatePtr->vcmd =
15860 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
15870 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e dprintf("Return
15880 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a ing");.}.../*. *
15890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158d0 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e ---. *. * Tls_In
158e0 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 it --. *. *.This
158f0 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e is a package in
15900 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f itialization pro
15910 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 cedure, which is
15920 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 called. *.by Tc
15930 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b l when this pack
15940 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 age is to be add
15950 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 ed to an interpr
15960 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 eter.. *. * Resu
15970 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 lts: Ssl config
15980 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a ured and loaded.
15990 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
159a0 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 ts:. *. create t
159b0 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 he ssl command,
159c0 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 initialize ssl c
159d0 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d ontext. *. *----
159e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
15a20 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e */.DLLEXPORT in
15a30 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 t Tls_Init(Tcl_I
15a40 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b nterp *interp) {
15a50 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
15a60 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 tlsTclInitScript
15a70 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 [] = {.#include
15a80 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 "tls.tcl.h"..0x0
15a90 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 0. };.. dp
15aa0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
15ab0 0a 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f ..#if TCL_MAJOR_
15ac0 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 69 66 64 VERSION > 8.#ifd
15ad0 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 ef USE_TCL_STUBS
15ae0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 . if (Tcl_Ini
15af0 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 tStubs(interp, "
15b00 39 2e 30 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 9.0", 0) == NULL
15b10 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
15b20 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e ERROR;. }.#en
15b30 64 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f dif. if (Tcl_
15b40 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 PkgRequire(inter
15b50 70 2c 20 22 54 63 6c 22 2c 20 22 39 2e 30 2d 22 p, "Tcl", "9.0-"
15b60 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a , 0) == NULL) {.
15b70 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
15b80 52 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 23 R;. }.#else.#
15b90 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 ifdef USE_TCL_ST
15ba0 55 42 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f UBS. if (Tcl_
15bb0 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 InitStubs(interp
15bc0 2c 20 22 38 2e 35 22 2c 20 30 29 20 3d 3d 20 4e , "8.5", 0) == N
15bd0 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
15be0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
15bf0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54 #endif. if (T
15c00 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e cl_PkgRequire(in
15c10 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 22 38 2e terp, "Tcl", "8.
15c20 35 2d 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 5-", 0) == NULL)
15c30 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
15c40 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 RROR;. }.#end
15c50 69 66 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c if.. if (TlsL
15c60 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c ibInit(0) != TCL
15c70 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 _OK) {..Tcl_Appe
15c80 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
15c90 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 "could not init
15ca0 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 ialize SSL libra
15cb0 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ry", NULL);..ret
15cc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
15cd0 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 }.. Tcl_Cr
15ce0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
15cf0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 nterp, "tls::cip
15d00 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 hers", CiphersOb
15d10 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
15d20 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
15d30 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
15d40 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
15d50 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
15d60 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 rp, "tls::connec
15d70 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f tion", Connectio
15d80 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c nInfoObjCmd, (Cl
15d90 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
15da0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
15db0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
15dc0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
15dd0 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
15de0 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e :handshake", Han
15df0 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 dshakeObjCmd, (C
15e00 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
15e10 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
15e20 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
15e30 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
15e40 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
15e50 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 ::import", Impor
15e60 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 tObjCmd, (Client
15e70 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
15e80 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
15e90 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
15ea0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
15eb0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 nterp, "tls::uni
15ec0 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 mport", Unimport
15ed0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
15ee0 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
15ef0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
15f00 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
15f10 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
15f20 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 terp, "tls::stat
15f30 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d us", StatusObjCm
15f40 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
15f50 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
15f60 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
15f70 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
15f80 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
15f90 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c "tls::version",
15fa0 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 VersionObjCmd,
15fb0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
15fc0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
15fd0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
15fe0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
15ff0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
16000 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f ls::misc", MiscO
16010 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
16020 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
16030 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
16040 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
16050 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
16060 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f erp, "tls::proto
16070 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 cols", Protocols
16080 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
16090 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
160a0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
160b0 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 LL);.. Tcl_Cr
160c0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
160d0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 73 nterp, "tls::has
160e0 68 22 2c 20 48 61 73 68 43 6d 64 2c 20 28 43 6c h", HashCmd, (Cl
160f0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
16100 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
16110 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
16120 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
16130 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
16140 3a 68 61 73 68 65 73 22 2c 20 48 61 73 68 4c 69 :hashes", HashLi
16150 73 74 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 stCmd, (ClientDa
16160 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
16170 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
16180 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
16190 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
161a0 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 34 22 2c erp, "tls::md4",
161b0 20 48 61 73 68 4d 44 34 43 6d 64 2c 20 28 43 6c HashMD4Cmd, (Cl
161c0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
161d0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
161e0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
161f0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
16200 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
16210 3a 6d 64 35 22 2c 20 48 61 73 68 4d 44 35 43 6d :md5", HashMD5Cm
16220 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
16230 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
16240 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
16250 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
16260 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
16270 20 22 74 6c 73 3a 3a 73 68 61 31 22 2c 20 48 61 "tls::sha1", Ha
16280 73 68 53 48 41 31 43 6d 64 2c 20 28 43 6c 69 65 shSHA1Cmd, (Clie
16290 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
162a0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
162b0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
162c0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
162d0 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 (interp, "tls::s
162e0 68 61 32 35 36 22 2c 20 48 61 73 68 53 48 41 32 ha256", HashSHA2
162f0 35 36 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 56Cmd, (ClientDa
16300 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
16310 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
16320 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 L);.. if (int
16330 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c erp) {..Tcl_Eval
16340 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 (interp, tlsTclI
16350 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20 20 nitScript);.
16360 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 }.. return Tc
16370 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 l_PkgProvide(int
16380 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d erp, PACKAGE_NAM
16390 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 E, PACKAGE_VERSI
163a0 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d ON);.}../*. *---
163b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163e0 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 ---*. *. *.Tls_S
163f0 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a afeInit --. *. *
16400 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
16410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16430 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 -*. *.Standard p
16440 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65 rocedure require
16450 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 d by 'load'.. *.
16460 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 Initializes this
16470 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 extension for a
16480 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 safe interprete
16490 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d r.. *.----------
164a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
164b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
164c0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 ------*. *. *.Si
164d0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 de effects:. *..
164e0 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 As of 'Tls_Init'
164f0 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 . *. *.Result:.
16500 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *..A standard Tc
16510 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a l error code.. *
16520 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
16530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 ---------*. */.D
16560 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 LLEXPORT int Tls
16570 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e _SafeInit(Tcl_In
16580 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a terp *interp) {.
16590 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
165a0 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 led");. retur
165b0 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 n(Tls_Init(inter
165c0 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d p));.}../*. *---
165d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
165e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
165f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16600 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 ---*. *. *.TlsLi
16610 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d bInit --. *. *.-
16620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
16650 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 . *.Initializes
16660 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 SSL library once
16670 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e per application
16680 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
16690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
166a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
166b0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 ----*. *. *.Side
166c0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e effects:. *..in
166d0 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 itializes SSL li
166e0 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 brary. *. *.Resu
166f0 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a lt:. *..none. *.
16700 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
16710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16730 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 --------*. */.st
16740 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 atic int TlsLibI
16750 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 nit(int uninitia
16760 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 lize) {. stat
16770 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a ic int initializ
16780 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 ed = 0;. int
16790 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b status = TCL_OK;
167a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
167b0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
167c0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
167d0 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 EADS). size_t
167e0 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 num_locks;.#end
167f0 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e if.. if (unin
16800 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 itialize) {..if
16810 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b (!initialized) {
16820 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 .. dprintf("A
16830 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 sked to uninitia
16840 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 lize, but we are
16850 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 not initialized
16860 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e ");... return
16870 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 (TCL_OK);..}...d
16880 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f printf("Asked to
16890 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b uninitialize");
168a0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
168b0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
168c0 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
168d0 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 READS)..Tcl_Mute
168e0 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b xLock(&init_mx);
168f0 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a ...if (locks) {.
16900 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 . free(locks)
16910 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e ;.. locks = N
16920 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 ULL;.. locksC
16930 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e ount = 0;..}.#en
16940 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 dif..initialized
16950 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e = 0;..#if defin
16960 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
16970 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
16980 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c CL_THREADS)..Tcl
16990 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e _MutexUnlock(&in
169a0 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a it_mx);.#endif..
169b0 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b .return(TCL_OK);
169c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
169d0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
169e0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c dprintf("Called,
169f0 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 but using cache
16a00 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 d value");..retu
16a10 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 20 rn(status);.
16a20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 }.. dprintf("
16a30 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 Called");..#if d
16a40 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
16a50 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
16a60 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
16a70 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 Tcl_MutexLoc
16a80 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e k(&init_mx);.#en
16a90 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 dif. initiali
16aa0 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 zed = 1;..#if de
16ab0 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
16ac0 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
16ad0 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 d(TCL_THREADS).
16ae0 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 num_locks = 1
16af0 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 ;. locksCount
16b00 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 = (int) num_loc
16b10 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 ks;. locks =
16b20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c malloc(sizeof(*l
16b30 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b ocks) * num_lock
16b40 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c s);. memset(l
16b50 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 ocks, 0, sizeof(
16b60 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f *locks) * num_lo
16b70 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 cks);.#endif..
16b80 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 /* Initialize
16b90 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 BOTH libcrypto a
16ba0 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 nd libssl. */.
16bb0 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 OPENSSL_init_s
16bc0 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f sl(OPENSSL_INIT_
16bd0 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 LOAD_SSL_STRINGS
16be0 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f | OPENSSL_INIT_
16bf0 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 LOAD_CRYPTO_STRI
16c00 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 NGS..| OPENSSL_I
16c10 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 NIT_ADD_ALL_CIPH
16c20 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e ERS | OPENSSL_IN
16c30 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 IT_ADD_ALL_DIGES
16c40 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 TS, NULL);..
16c50 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c BIO_new_tcl(NULL
16c60 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 , 0);..#if 0.
16c70 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 /*. * XXX:T
16c80 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 ODO: Remove this
16c90 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 code and replac
16ca0 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63 e it with a chec
16cb0 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f k. * for eno
16cc0 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 ugh entropy and
16cd0 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 do not try to cr
16ce0 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 eate our own.
16cf0 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 * terrible ent
16d00 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ropy. */.
16d10 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 /*. * Seed
16d20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 the random numbe
16d30 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 r generator in t
16d40 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a he SSL library,.
16d50 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 * using the
16d60 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 do/while constr
16d70 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 uct because of t
16d80 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 he bug note in t
16d90 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 he. * OpenSS
16da0 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f L FAQ at http://
16db0 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f www.openssl.org/
16dc0 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c support/faq.html
16dd0 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 #USER1. *.
16de0 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 * The crux of
16df0 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 the problem is
16e00 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 that Solaris 7 d
16e10 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 oes not have a.
16e20 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f * /dev/rando
16e30 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f m or /dev/urando
16e40 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 m device so it c
16e50 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f annot gather eno
16e60 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f ugh. * entro
16e70 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 py from the RAND
16e80 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 _seed() when TLS
16e90 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 initializes and
16ea0 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 refuses. *
16eb0 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 to go further. E
16ec0 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 arlier versions
16ed0 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 of OpenSSL carri
16ee0 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 ed on regardless
16ef0 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 .. */. sr
16f00 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e and((unsigned in
16f10 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 t) time((time_t
16f20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 *) NULL));. d
16f30 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b o {..for (i = 0;
16f40 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a i < 16; i++) {.
16f50 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d . rnd_seed[i]
16f60 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 = 1 + (char) (2
16f70 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 55.0 * rand()/(R
16f80 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 AND_MAX+1.0));..
16f90 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 }..RAND_seed(rnd
16fa0 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e _seed, sizeof(rn
16fb0 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 d_seed));. }
16fc0 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 while (RAND_stat
16fd0 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 us() != 1);.#end
16fe0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 if..#if defined(
16ff0 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
17000 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
17010 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 THREADS)..Tcl_Mu
17020 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f texUnlock(&init_
17030 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 mx);.#endif...re
17040 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a turn(status);.}.