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 68 65 78 Return hash hex
6fe0: 20 73 74 72 69 6e 67 20 66 6f 72 20 6d 65 73 73 string for mess
6ff0: 61 67 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a age digest. *. *
7000: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
7010: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
7020: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
7030: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
7040: 0a 20 2a 0a 20 2a 2d 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 0a 20 2a 2f 0a 48 61 ---------. */.Ha
7090: 73 68 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 shCmd(ClientData
70a0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
70b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
70c0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
70d0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
70e0: 29 20 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b ) {. int len;
70f0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
7100: 2a 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 *name;. const
7110: 20 45 56 50 5f 4d 44 20 2a 74 79 70 65 3b 0a 0a EVP_MD *type;..
7120: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 if (objc !=
7130: 33 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 3) {..Tcl_WrongN
7140: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
7150: 2c 20 6f 62 6a 76 2c 20 22 74 79 70 65 20 64 61 , objv, "type da
7160: 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ta");..return TC
7170: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
7180: 20 20 20 20 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 name = Tcl_G
7190: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
71a0: 6f 62 6a 76 5b 31 5d 2c 26 6c 65 6e 29 3b 0a 20 objv[1],&len);.
71b0: 20 20 20 69 66 20 28 6e 61 6d 65 20 3d 3d 20 4e if (name == N
71c0: 55 4c 4c 20 7c 7c 20 28 74 79 70 65 20 3d 20 45 ULL || (type = E
71d0: 56 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79 6e VP_get_digestbyn
71e0: 61 6d 65 28 6e 61 6d 65 29 29 20 3d 3d 20 4e 55 ame(name)) == NU
71f0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
7200: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
7210: 22 49 6e 76 61 6c 69 64 20 64 69 67 65 73 74 20 "Invalid digest
7220: 74 79 70 65 20 5c 22 22 2c 20 6e 61 6d 65 2c 20 type \"", name,
7230: 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 "\"", NULL);..re
7240: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7250: 20 20 20 20 7d 0a 20 20 20 20 6f 62 6a 63 2d 2d }. objc--
7260: 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a 20 20 ;. objv++;.
7270: 20 20 72 65 74 75 72 6e 20 48 61 73 68 43 61 6c return HashCal
7280: 63 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 c(interp, objc,
7290: 6f 62 6a 76 2c 20 74 79 70 65 29 3b 0a 7d 0a 0a objv, type);.}..
72a0: 2f 2a 0a 20 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f /*. * Command to
72b0: 20 43 61 6c 63 75 6c 61 74 65 20 4d 44 34 20 48 Calculate MD4 H
72c0: 61 73 68 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73 68 ash. */.int.Hash
72d0: 4d 44 34 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 MD4Cmd(ClientDat
72e0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
72f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
7300: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
7310: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
7320: 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 ]) {. return
7330: 48 61 73 68 43 61 6c 63 28 69 6e 74 65 72 70 2c HashCalc(interp,
7340: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 objc, objv, EVP
7350: 5f 6d 64 34 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 _md4());.}../*.
7360: 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 20 43 61 6c * Command to Cal
7370: 63 75 6c 61 74 65 20 4d 44 35 20 48 61 73 68 0a culate MD5 Hash.
7380: 20 2a 2f 0a 69 6e 74 0a 48 61 73 68 4d 44 35 43 */.int.HashMD5C
7390: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
73a0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
73b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
73c0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
73d0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
73e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 48 61 73 68 . return Hash
73f0: 43 61 6c 63 28 69 6e 74 65 72 70 2c 20 6f 62 6a Calc(interp, obj
7400: 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 35 c, objv, EVP_md5
7410: 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43 6f ());.}../*. * Co
7420: 6d 6d 61 6e 64 20 74 6f 20 43 61 6c 63 75 6c 61 mmand to Calcula
7430: 74 65 20 53 48 41 2d 31 20 48 61 73 68 0a 20 2a te SHA-1 Hash. *
7440: 2f 0a 69 6e 74 0a 48 61 73 68 53 48 41 31 43 6d /.int.HashSHA1Cm
7450: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
7460: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
7470: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
7480: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
7490: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
74a0: 20 20 20 20 72 65 74 75 72 6e 20 48 61 73 68 43 return HashC
74b0: 61 6c 63 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 alc(interp, objc
74c0: 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 73 68 61 31 , objv, EVP_sha1
74d0: 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43 6f ());.}../*. * Co
74e0: 6d 6d 61 6e 64 20 74 6f 20 43 61 6c 63 75 6c 61 mmand to Calcula
74f0: 74 65 20 53 48 41 2d 32 35 36 20 48 61 73 68 0a te SHA-256 Hash.
7500: 20 2a 2f 0a 69 6e 74 0a 48 61 73 68 53 48 41 32 */.int.HashSHA2
7510: 35 36 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 56Cmd(ClientData
7520: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
7530: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
7540: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
7550: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
7560: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 48 ) {. return H
7570: 61 73 68 43 61 6c 63 28 69 6e 74 65 72 70 2c 20 ashCalc(interp,
7580: 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f objc, objv, EVP_
7590: 73 68 61 32 35 36 28 29 29 3b 0a 7d 0a 0c 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 43 69 -------. *. * Ci
75f0: 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c phersObjCmd -- l
7600: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 ist available ci
7610: 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 phers. *. *.This
7620: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
7630: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 voked to process
7640: 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 the "tls::ciphe
7650: 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 rs" command. *.t
7660: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 o list available
7670: 20 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 ciphers, based
7680: 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 upon protocol se
7690: 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 lected.. *. * Re
76a0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
76b0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 dard Tcl result
76c0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 list.. *. * Side
76d0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e effects:. *.con
76e0: 73 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 structs and dest
76f0: 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 roys SSL context
7700: 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d (CTX). *. *----
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7750: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 */.static const
7760: 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 char *protocols
7770: 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 [] = {.."ssl2",
7780: 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 "ssl3", "tls1",
7790: 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e "tls1.1", "tls1.
77a0: 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 2", "tls1.3", NU
77b0: 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f LL.};.enum proto
77c0: 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 col {. TLS_SS
77d0: 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c L2, TLS_SSL3, TL
77e0: 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 S_TLS1, TLS_TLS1
77f0: 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 _1, TLS_TLS1_2,
7800: 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f TLS_TLS1_3, TLS_
7810: 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 NONE.};..static
7820: 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d int.CiphersObjCm
7830: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
7840: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
7850: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
7860: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
7870: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
7880: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
7890: 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 Ptr = NULL;.
78a0: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e SSL_CTX *ctx = N
78b0: 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 ULL;. SSL *ss
78c0: 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 l = NULL;. ST
78d0: 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 ACK_OF(SSL_CIPHE
78e0: 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 R) *sk;. char
78f0: 20 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 49 5a *cp, buf[BUFSIZ
7900: 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 ];. int index
7910: 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 , verbose = 0, u
7920: 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 se_supported = 0
7930: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f ;. const SSL_
7940: 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a METHOD *method;.
7950: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
7960: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
7970: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 ((objc < 2) || (
7980: 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 objc > 4)) {..Tc
7990: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
79a0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
79b0: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f "protocol ?verbo
79c0: 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 se? ?supported?"
79d0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
79e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
79f0: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
7a00: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
7a10: 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f objv[1], protoco
7a20: 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 ls, "protocol",
7a30: 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 0, &index) != TC
7a40: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
7a50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7a60: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e . if ((objc >
7a70: 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 2) && Tcl_GetBo
7a80: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 oleanFromObj(int
7a90: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 erp, objv[2], &v
7aa0: 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f erbose) != TCL_O
7ab0: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
7ac0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
7ad0: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 if ((objc > 3)
7ae0: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 && Tcl_GetBoole
7af0: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 anFromObj(interp
7b00: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f , objv[3], &use_
7b10: 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 supported) != TC
7b20: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
7b30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7b40: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f .. ERR_clear_
7b50: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 error();.. sw
7b60: 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 itch ((enum prot
7b70: 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 ocol)index) {..c
7b80: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 ase TLS_SSL2:.#i
7b90: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
7ba0: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 N_NUMBER >= 0x10
7bb0: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 100000L || defin
7bc0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 ed(NO_SSL2) || d
7bd0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7be0: 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c O_SSL2).. Tcl
7bf0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
7c00: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
7c10: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
7c20: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
7c30: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 d", NULL);..
7c40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7c50: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 ;.#else.. met
7c60: 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 hod = SSLv2_meth
7c70: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e od(); break;.#en
7c80: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 dif..case TLS_SS
7c90: 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 L3:.#if defined(
7ca0: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 NO_SSL3) || defi
7cb0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
7cc0: 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 SL3) || defined(
7cd0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f OPENSSL_NO_SSL3_
7ce0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c METHOD).. Tcl
7cf0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
7d00: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
7d10: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
7d20: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
7d30: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 d", NULL);..
7d40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7d50: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 ;.#else.. met
7d60: 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 hod = SSLv3_meth
7d70: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e od(); break;.#en
7d80: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c dif..case TLS_TL
7d90: 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 S1:.#if defined(
7da0: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 NO_TLS1) || defi
7db0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
7dc0: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
7dd0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
7de0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c METHOD).. Tcl
7df0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
7e00: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
7e10: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
7e20: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
7e30: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 d", NULL);..
7e40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7e50: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 ;.#else.. met
7e60: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 hod = TLSv1_meth
7e70: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e od(); break;.#en
7e80: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c dif..case TLS_TL
7e90: 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 S1_1:.#if define
7ea0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 d(NO_TLS1_1) ||
7eb0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7ec0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
7ed0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7ee0: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a _TLS1_1_METHOD).
7ef0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
7f00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
7f10: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
7f20: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
7f30: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
7f40: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
7f50: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
7f60: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c . method = TL
7f70: 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20 Sv1_1_method();
7f80: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
7f90: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a ase TLS_TLS1_2:.
7fa0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
7fb0: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
7fc0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
7fd0: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
7fe0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
7ff0: 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 2_METHOD).. T
8000: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8010: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
8020: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
8030: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
8040: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
8050: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
8060: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
8070: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f ethod = TLSv1_2_
8080: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b method(); break;
8090: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
80a0: 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 S_TLS1_3:.#if de
80b0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
80c0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
80d0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 SSL_NO_TLS1_3)..
80e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
80f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
8100: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
8110: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
8120: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
8130: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
8140: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
8150: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 method = TLS
8160: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 _method();..
8170: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f SSL_CTX_set_min_
8180: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
8190: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f x, TLS1_3_VERSIO
81a0: 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 N);.. SSL_CTX
81b0: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 _set_max_proto_v
81c0: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
81d0: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 _3_VERSION);..
81e0: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a break;.#endif.
81f0: 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 6d .default:.. m
8200: 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 ethod = TLS_meth
8210: 6f 64 28 29 3b 0a 09 20 20 20 20 62 72 65 61 6b od();.. break
8220: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 78 ;. }.. ctx
8230: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d = SSL_CTX_new(m
8240: 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 ethod);. if (
8250: 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ctx == NULL) {..
8260: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
8270: 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 (interp, REASON(
8280: 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ), NULL);..retur
8290: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
82a0: 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 }.. ssl = SS
82b0: 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 L_new(ctx);.
82c0: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 if (ssl == NULL)
82d0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
82e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 sult(interp, REA
82f0: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 SON(), NULL);..S
8300: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
8310: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
8320: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
8330: 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 /* Use list and
8340: 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 order as would b
8350: 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 e sent in a Clie
8360: 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 ntHello or all a
8370: 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 vailable ciphers
8380: 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f */. if (use_
8390: 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b supported) {..sk
83a0: 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 = SSL_get1_supp
83b0: 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 orted_ciphers(ss
83c0: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b l);. } else {
83d0: 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 ..sk = SSL_get_c
83e0: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 iphers(ssl);.
83f0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 }.. if (sk !
8400: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 = NULL) {..if (!
8410: 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 verbose) {..
8420: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
8430: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
8440: 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 ;.. for (int
8450: 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 i = 0; i < sk_SS
8460: 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 L_CIPHER_num(sk)
8470: 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 ; i++) {...const
8480: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d SSL_CIPHER *c =
8490: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 sk_SSL_CIPHER_v
84a0: 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 alue(sk, i);...i
84b0: 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f f (c == NULL) co
84c0: 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 ntinue;..../* ci
84d0: 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f pher name or (NO
84e0: 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 NE) */...cp = SS
84f0: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d L_CIPHER_get_nam
8500: 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d e(c);...if (cp =
8510: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 = NULL) break;..
8520: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
8530: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
8540: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
8550: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d wStringObj(cp, -
8560: 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 1));.. }...}
8570: 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 else {.. objP
8580: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 tr = Tcl_NewStri
8590: 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 ngObj("",0);..
85a0: 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 for (int i = 0
85b0: 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 ; i < sk_SSL_CIP
85c0: 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b HER_num(sk); i++
85d0: 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f ) {...const SSL_
85e0: 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 CIPHER *c = sk_S
85f0: 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 SL_CIPHER_value(
8600: 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 sk, i);...if (c
8610: 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 == NULL) continu
8620: 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c e;..../* textual
8630: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 description of
8640: 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 the cipher */...
8650: 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 if (SSL_CIPHER_d
8660: 65 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 escription(c, bu
8670: 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 f, sizeof(buf))
8680: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 != NULL) {...
8690: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a Tcl_AppendToObj
86a0: 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 54 (objPtr, buf, (T
86b0: 63 6c 5f 53 69 7a 65 29 20 73 74 72 6c 65 6e 28 cl_Size) strlen(
86c0: 62 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 buf));...} else
86d0: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {... Tcl_Appe
86e0: 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 ndToObj(objPtr,
86f0: 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b "UNKNOWN\n", 8);
8700: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 ...}.. }..}..
8710: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 if (use_supporte
8720: 64 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c d) {.. sk_SSL
8730: 5f 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 _CIPHER_free(sk)
8740: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 ;..}. }. S
8750: 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 SL_free(ssl);.
8760: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
8770: 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 tx);.. Tcl_Se
8780: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
8790: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
87a0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
87b0: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
87c0: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
87d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
87e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
87f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8810: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 -----. *. * Prot
8820: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c ocolsObjCmd -- l
8830: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 ist available pr
8840: 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 otocols. *. *.Th
8850: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
8860: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
8870: 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f ss the "tls::pro
8880: 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a tocols" command.
8890: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c *.to list avail
88a0: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a able protocols..
88b0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
88c0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
88d0: 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a result list.. *
88e0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
88f0: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d :. *.none. *. *-
8900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8940: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
8950: 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d t.ProtocolsObjCm
8960: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
8970: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
8980: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
8990: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
89a0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
89b0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
89c0: 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 Ptr;.. dprint
89d0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
89e0: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 if (objc != 1)
89f0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
8a00: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
8a10: 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 objv, "");..retu
8a20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
8a30: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
8a40: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
8a50: 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 objPtr = Tcl_Ne
8a60: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
8a70: 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f );..#if OPENSSL_
8a80: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
8a90: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 0x10100000L &&
8aa0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 !defined(NO_SSL2
8ab0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8ac0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 ENSSL_NO_SSL2).
8ad0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
8ae0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
8af0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
8b00: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
8b10: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d tocols[TLS_SSL2]
8b20: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
8b30: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 if !defined(NO_S
8b40: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
8b50: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
8b60: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8b70: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 ENSSL_NO_SSL3_ME
8b80: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 THOD). Tcl_Li
8b90: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
8ba0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
8bb0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
8bc0: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
8bd0: 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 S_SSL3], -1));.#
8be0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
8bf0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 ed(NO_TLS1) && !
8c00: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8c10: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 NO_TLS1) && !def
8c20: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8c30: 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 TLS1_METHOD).
8c40: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
8c50: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
8c60: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
8c70: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
8c80: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 cols[TLS_TLS1],
8c90: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 -1));.#endif.#if
8ca0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
8cb0: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
8cc0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
8cd0: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
8ce0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
8cf0: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 1_METHOD). Tc
8d00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
8d10: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
8d20: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
8d30: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
8d40: 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d s[TLS_TLS1_1], -
8d50: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
8d60: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
8d70: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
8d80: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
8d90: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
8da0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
8db0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c _METHOD). Tcl
8dc0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
8dd0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
8de0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
8df0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
8e00: 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 [TLS_TLS1_2], -1
8e10: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
8e20: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
8e30: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
8e40: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
8e50: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
8e60: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
8e70: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
8e80: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
8e90: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
8ea0: 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e S1_3], -1));.#en
8eb0: 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 dif.. Tcl_Set
8ec0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
8ed0: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 , objPtr);. r
8ee0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
8ef0: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
8f00: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ntData;.}.../*.
8f10: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
8f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f50: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 ----. *. * Hands
8f60: 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a hakeObjCmd --. *
8f70: 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 . *.This command
8f80: 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 is used to veri
8f90: 66 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 fy whether the h
8fa0: 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 andshake is comp
8fb0: 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a lete. *.or not..
8fc0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
8fd0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
8fe0: 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 result. 1 means
8ff0: 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c handshake compl
9000: 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e ete, 0 means pen
9010: 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 ding.. *. * Side
9020: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 effects:. *.May
9030: 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 force SSL negot
9040: 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 iation to take p
9050: 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d lace.. *. *-----
9060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
90a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 */.static int Ha
90b0: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c ndshakeObjCmd(Cl
90c0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
90d0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
90e0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
90f0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
9100: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
9110: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
9120: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 ; /* The
9130: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
9140: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 mode on. */.
9150: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
9160: 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 ; /* clie
9170: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c nt state for ssl
9180: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 socket */. c
9190: 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 onst char *errSt
91a0: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e r = NULL;. in
91b0: 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 t ret = 1;. i
91c0: 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 nt err = 0;..
91d0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
91e0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
91f0: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
9200: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
9210: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
9220: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
9230: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
9240: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 }.. ERR_clea
9250: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 r_error();..
9260: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
9270: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 annel(interp, Tc
9280: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
9290: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c bj(objv[1], NULL
92a0: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 ), NULL);. if
92b0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
92c0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
92d0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
92e0: 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f R);. }.. /
92f0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
9300: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
9310: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
9320: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
9330: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
9340: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c an);. if (Tcl
9350: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
9360: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
9370: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
9380: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
9390: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
93a0: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
93b0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
93c0: 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f n),.. "\": no
93d0: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 t a TLS channel"
93e0: 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 , NULL);..Tcl_Se
93f0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
9400: 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 p, "TLS", "HANDS
9410: 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 HAKE", "CHANNEL"
9420: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
9430: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
9440: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
9450: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 . }. state
9460: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 Ptr = (State *)T
9470: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
9480: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b tanceData(chan);
9490: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
94a0: 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 alling Tls_WaitF
94b0: 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 orConnect");.
94c0: 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 ret = Tls_WaitF
94d0: 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 orConnect(stateP
94e0: 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 tr, &err, 1);.
94f0: 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 dprintf("Tls_W
9500: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 aitForConnect re
9510: 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 turned: %i", ret
9520: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 );.. if (ret
9530: 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74 < 0 && ((statePt
9540: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 r->flags & TLS_T
9550: 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 CL_ASYNC) && (er
9560: 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b r == EAGAIN))) {
9570: 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 ..dprintf("Async
9580: 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 set and err = E
9590: 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 AGAIN");..ret =
95a0: 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 0;. } else if
95b0: 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f (ret < 0) {..lo
95c0: 6e 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 ng result;..errS
95d0: 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 tr = statePtr->e
95e0: 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 rr;..Tcl_ResetRe
95f0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 sult(interp);..T
9600: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 cl_SetErrno(err)
9610: 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 ;...if (!errStr
9620: 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 || (*errStr == 0
9630: 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 )) {.. errStr
9640: 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f = Tcl_PosixErro
9650: 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 r(interp);..}...
9660: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
9670: 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 (interp, "handsh
9680: 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 ake failed: ", e
9690: 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 rrStr, (char *)
96a0: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 NULL);..if ((res
96b0: 75 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 ult = SSL_get_ve
96c0: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 rify_result(stat
96d0: 65 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 ePtr->ssl)) != X
96e0: 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 509_V_OK) {..
96f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
9700: 74 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 t(interp, " due
9710: 74 6f 3a 20 22 2c 20 58 35 30 39 5f 76 65 72 69 to: ", X509_veri
9720: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 fy_cert_error_st
9730: 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 28 63 ring(result), (c
9740: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d har *) NULL);..}
9750: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
9760: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
9770: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 , "HANDSHAKE", "
9780: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
9790: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 ) NULL);..dprint
97a0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c f("Returning TCL
97b0: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 _ERROR with hand
97c0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 shake failed: %s
97d0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 ", errStr);..ret
97e0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
97f0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 } else {..if
9800: 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 (err != 0) {..
9810: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 dprintf("Got
9820: 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 an error with a
9830: 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 completed handsh
9840: 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 ake: err = %i",
9850: 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 err);..}..ret =
9860: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 1;. }.. dp
9870: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
9880: 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 TCL_OK with dat
9890: 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b a \"%i\"", ret);
98a0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
98b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
98c0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 l_NewIntObj(ret)
98d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 );. return(TC
98e0: 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61 L_OK);..clientDa
98f0: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
9900: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
9910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
9950: 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 * ImportObjCmd
9960: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
9970: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
9980: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 ed to process th
9990: 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a e "ssl" command.
99a0: 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f *. *.The ssl co
99b0: 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c mmand pushes SSL
99c0: 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 over a (newly c
99d0: 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f onnected) tcp so
99e0: 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c cket. *. * Resul
99f0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
9a00: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
9a10: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
9a20: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 :. *.May modify
9a30: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 the behavior of
9a40: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 an IO channel..
9a50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
9a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9a90: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
9aa0: 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a ic int.ImportObj
9ab0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
9ac0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
9ad0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
9ae0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
9af0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
9b00: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
9b10: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
9b20: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
9b30: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 mode on. */.
9b40: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
9b50: 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 ;../* client sta
9b60: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 te for ssl socke
9b70: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 t */. SSL_CTX
9b80: 20 2a 63 74 78 09 20 20 20 20 20 20 20 20 3d 20 *ctx. =
9b90: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
9ba0: 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20 20 20 j *script.
9bb0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 = NULL;. Tc
9bc0: 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 l_Obj *password.
9bd0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
9be0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d Tcl_Obj *vcm
9bf0: 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c d. = NULL
9c00: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
9c10: 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 g upperChannelTr
9c20: 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 anslation, upper
9c30: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c ChannelBlocking,
9c40: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 upperChannelEnc
9c50: 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e oding, upperChan
9c60: 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 nelEOFChar;.
9c70: 69 6e 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 int idx, len;.
9c80: 20 20 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 int flags..
9c90: 20 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 = TLS_TCL_I
9ca0: 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 NIT;. int ser
9cb0: 76 65 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 ver.. = 0
9cc0: 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 ;./* is connecti
9cd0: 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f on incoming or o
9ce0: 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 utgoing? */.
9cf0: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 char *keyfile.
9d00: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
9d10: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 char *certfile
9d20: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
9d30: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
9d40: 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c ar *key .= NULL
9d50: 3b 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 ;. int key_le
9d60: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 n
9d70: 20 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 = 0;. unsig
9d80: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 20 20 ned char *cert
9d90: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
9da0: 20 20 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 20 int cert_len
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d =
9dc0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 0;. char *ci
9dd0: 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 phers. =
9de0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
9df0: 63 69 70 68 65 72 73 75 69 74 65 73 09 20 20 20 ciphersuites.
9e00: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
9e10: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 20 20 char *CAfile.
9e20: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
9e30: 20 20 63 68 61 72 20 2a 43 41 64 69 72 09 09 20 char *CAdir..
9e40: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
9e50: 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d char *DHparam
9e60: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c s. = NULL
9e70: 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 ;. char *mode
9e80: 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c l.. = NUL
9e90: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 L;. char *ser
9ea0: 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20 20 20 vername.
9eb0: 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e = NULL;./* hostn
9ec0: 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e ame for Server N
9ed0: 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a ame Indication *
9ee0: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 /. const unsi
9ef0: 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 gned char *sessi
9f00: 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 on_id = NULL;.
9f10: 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 Tcl_Obj *alpn.
9f20: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 .= NULL;. int
9f30: 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 ssl2 = 0, ssl3
9f40: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 = 0;. int tls
9f50: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 1 = 1, tls1_1 =
9f60: 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 1, tls1_2 = 1, t
9f70: 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 ls1_3 = 1;. i
9f80: 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 nt proto = 0, le
9f90: 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e vel = -1;. in
9fa0: 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 t verify = 0, re
9fb0: 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 quire = 0, reque
9fc0: 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e st = 1, post_han
9fd0: 64 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 dshake = 0;..
9fe0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
9ff0: 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 ");..#if defined
a000: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 (NO_TLS1) || def
a010: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
a020: 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d TLS1). tls1 =
a030: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 0;.#endif.#if d
a040: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
a050: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
a060: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a NSSL_NO_TLS1_1).
a070: 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a tls1_1 = 0;.
a080: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
a090: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c ed(NO_TLS1_2) ||
a0a0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
a0b0: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 _NO_TLS1_2).
a0c0: 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 tls1_2 = 0;.#end
a0d0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
a0e0: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 O_TLS1_3) || def
a0f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
a100: 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 TLS1_3). tls1
a110: 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a _3 = 0;.#endif..
a120: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
a130: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
a140: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
a150: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 objv, "channel
a160: 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 ?options?");..re
a170: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
a180: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 }.. ERR_c
a190: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 lear_error();..
a1a0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
a1b0: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
a1c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
a1d0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e omObj(objv[1], N
a1e0: 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 ULL), NULL);.
a1f0: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
a200: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
a210: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
a220: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
a230: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f /* Make sure to
a240: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
a250: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
a260: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
a270: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
a280: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 chan);.. for
a290: 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 (idx = 2; idx <
a2a0: 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 objc; idx++) {..
a2b0: 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f char *opt = Tcl_
a2c0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
a2d0: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c (objv[idx], NULL
a2e0: 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 );...if (opt[0]
a2f0: 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 != '-').. bre
a300: 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 ak;...OPTOBJ("-a
a310: 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 lpn", alpn);..OP
a320: 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43 TSTR("-cadir", C
a330: 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 Adir);..OPTSTR("
a340: 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 -cafile", CAfile
a350: 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 );..OPTBYTE("-ce
a360: 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f rt", cert, cert_
a370: 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d len);..OPTSTR("-
a380: 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 certfile", certf
a390: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
a3a0: 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 cipher", ciphers
a3b0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 );..OPTSTR("-cip
a3c0: 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b hers", ciphers);
a3d0: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 ..OPTSTR("-ciphe
a3e0: 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 rsuites", cipher
a3f0: 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a suites);..OPTOBJ
a400: 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 ("-command", scr
a410: 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ipt);..OPTSTR("-
a420: 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 dhparams", DHpar
a430: 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 ams);..OPTBYTE("
a440: 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f -key", key, key_
a450: 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d len);..OPTSTR("-
a460: 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c keyfile", keyfil
a470: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f e);..OPTSTR("-mo
a480: 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f del", model);..O
a490: 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 PTOBJ("-password
a4a0: 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f ", password);..O
a4b0: 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 PTBOOL("-post_ha
a4c0: 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 ndshake", post_h
a4d0: 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 andshake);..OPTB
a4e0: 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 2c 20 OOL("-request",
a4f0: 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f request);..OPTBO
a500: 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 OL("-require", r
a510: 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 equire);..OPTINT
a520: 28 22 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c ("-securitylevel
a530: 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 ", level);..OPTB
a540: 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 OOL("-server", s
a550: 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 erver);..OPTSTR(
a560: 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 "-servername", s
a570: 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 ervername);..OPT
a580: 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 STR("-session_id
a590: 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a ", session_id);.
a5a0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 .OPTBOOL("-ssl2"
a5b0: 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f , ssl2);..OPTBOO
a5c0: 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 L("-ssl3", ssl3)
a5d0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
a5e0: 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 1", tls1);..OPTB
a5f0: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 OOL("-tls1.1", t
a600: 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c ls1_1);..OPTBOOL
a610: 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 ("-tls1.2", tls1
a620: 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d _2);..OPTBOOL("-
a630: 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 tls1.3", tls1_3)
a640: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 ;..OPTOBJ("-vali
a650: 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 datecommand", vc
a660: 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 md);..OPTOBJ("-v
a670: 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f cmd", vcmd);...O
a680: 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 PTBAD("option",
a690: 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 "-alpn, -cadir,
a6a0: 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 -cafile, -cert,
a6b0: 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 -certfile, -ciph
a6c0: 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 er, -ciphersuite
a6d0: 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 s, -command, -dh
a6e0: 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b params, -key, -k
a6f0: 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 eyfile, -model,
a700: 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 -password, -post
a710: 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 _handshake, -req
a720: 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 uest, -require,
a730: 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c 2c 20 -securitylevel,
a740: 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 -server, -server
a750: 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 name, -session_i
a760: 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c d, -ssl2, -ssl3,
a770: 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c -tls1, -tls1.1,
a780: 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e -tls1.2, -tls1.
a790: 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 3, or -validatec
a7a0: 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 ommand");...retu
a7b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
a7c0: 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 }. if (requ
a7d0: 65 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 est)..verify |=
a7e0: 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e SSL_VERIFY_CLIEN
a7f0: 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 T_ONCE | SSL_VER
a800: 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 IFY_PEER;. if
a810: 20 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71 (request && req
a820: 75 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 uire).verify |=
a830: 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f SSL_VERIFY_FAIL_
a840: 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b IF_NO_PEER_CERT;
a850: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 . if (request
a860: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 && post_handsha
a870: 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 ke).verify |= SS
a880: 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 L_VERIFY_POST_HA
a890: 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 NDSHAKE;. if
a8a0: 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 (verify == 0)..v
a8b0: 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 erify = SSL_VERI
a8c0: 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 FY_NONE;.. pr
a8d0: 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 oto |= (ssl2 ? T
a8e0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 LS_PROTO_SSL2 :
a8f0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
a900: 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f (ssl3 ? TLS_PRO
a910: 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 TO_SSL3 : 0);.
a920: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
a930: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
a940: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 1 : 0);. prot
a950: 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 o |= (tls1_1 ? T
a960: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 LS_PROTO_TLS1_1
a970: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
a980: 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 |= (tls1_2 ? TLS
a990: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 _PROTO_TLS1_2 :
a9a0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
a9b0: 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 (tls1_3 ? TLS_P
a9c0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 ROTO_TLS1_3 : 0)
a9d0: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 ;.. /* reset
a9e0: 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b to NULL if blank
a9f0: 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 string provided
aa00: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 */. if (cert
aa10: 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 && !*cert)..
aa20: 20 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20 cert.
aa30: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
aa40: 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 (key && !*key).
aa50: 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 . key.
aa60: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
aa70: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 if (certfile &&
aa80: 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 !*certfile)
aa90: 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 certfile.=
aaa0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 NULL;. if (ke
aab0: 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 yfile && !*keyfi
aac0: 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 le)..keyfile.
aad0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
aae0: 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20 if (ciphers &&
aaf0: 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20 !*ciphers).
ab00: 20 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20 ciphers.
ab10: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
ab20: 66 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20 f (ciphersuites
ab30: 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 && !*ciphersuite
ab40: 73 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20 s) ciphersuites
ab50: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
ab60: 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 f (CAfile && !*C
ab70: 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 Afile). C
ab80: 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 Afile. =
ab90: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 NULL;. if (CA
aba0: 64 69 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 dir && !*CAdir).
abb0: 20 20 20 20 20 20 20 20 43 41 64 69 72 09 20 20 CAdir.
abc0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
abd0: 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 if (DHparams &
abe0: 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 & !*DHparams).
abf0: 20 20 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 DHparams
ac00: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 = NULL;..
ac10: 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 /* new SSL st
ac20: 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 ate */. state
ac30: 50 74 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 Ptr..= (State *)
ac40: 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e ckalloc((unsign
ac50: 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 ed) sizeof(State
ac60: 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 ));. memset(s
ac70: 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 tatePtr, 0, size
ac80: 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 of(State));..
ac90: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 statePtr->flags
aca0: 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 .= flags;. st
acb0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d atePtr->interp.=
acc0: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 interp;. sta
acd0: 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 tePtr->vflags.=
ace0: 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 verify;. stat
acf0: 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a ePtr->err.= "";.
ad00: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 . /* allocate
ad10: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 script */. i
ad20: 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 f (script) {..(v
ad30: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 oid) Tcl_GetStri
ad40: 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 ngFromObj(script
ad50: 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 , &len);..if (le
ad60: 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 n) {.. stateP
ad70: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 tr->callback = s
ad80: 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f cript;.. Tcl_
ad90: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 IncrRefCount(sta
ada0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
adb0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
adc0: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 /* allocate pass
add0: 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 word */. if (
ade0: 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f password) {..(vo
adf0: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e id) Tcl_GetStrin
ae00: 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 gFromObj(passwor
ae10: 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c d, &len);..if (l
ae20: 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 en) {.. state
ae30: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 Ptr->password =
ae40: 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 password;.. T
ae50: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
ae60: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
ae70: 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 rd);..}. }..
ae80: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 /* allocate v
ae90: 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 alidate command
aea0: 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 */. if (vcmd)
aeb0: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 {..(void) Tcl_G
aec0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
aed0: 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 vcmd, &len);..if
aee0: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 (len) {.. st
aef0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 atePtr->vcmd = v
af00: 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e cmd;.. Tcl_In
af10: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
af20: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 Ptr->vcmd);..}.
af30: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f }.. if (mo
af40: 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 del != NULL) {..
af50: 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 int mode;../* Ge
af60: 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f t the "model" co
af70: 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d ntext */..chan =
af80: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
af90: 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 interp, model, &
afa0: 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e mode);..if (chan
afb0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
afc0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 ) NULL) {.. T
afd0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
afe0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
aff0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
b000: 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d R;..}.../*.. * M
b010: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
b020: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
b030: 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a st channel.. */.
b040: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 .chan = Tcl_GetT
b050: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
b060: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 ..if (Tcl_GetCha
b070: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 nnelType(chan) !
b080: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 = Tls_ChannelTyp
b090: 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f e()) {.. Tcl_
b0a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
b0b0: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
b0c0: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
b0d0: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
b0e0: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c ..."\": not a TL
b0f0: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c S channel", NULL
b100: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
b110: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
b120: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
b130: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e , "CHANNEL", "IN
b140: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 VALID", (char *)
b150: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 NULL);.. Tls
b160: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
b170: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
b180: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
b190: 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 ..}..ctx = ((Sta
b1a0: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
b1b0: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
b1c0: 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 chan))->ctx;.
b1d0: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 } else {..if ((
b1e0: 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 ctx = CTX_Init(s
b1f0: 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c tatePtr, server,
b200: 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c proto, keyfile,
b210: 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 certfile, key,
b220: 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 cert, key_len,..
b230: 20 20 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 cert_len, CA
b240: 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 dir, CAfile, cip
b250: 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 hers, ciphersuit
b260: 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 es, level, DHpar
b270: 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b ams)) == NULL) {
b280: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
b290: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
b2a0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
b2b0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 CL_ERROR;..}.
b2c0: 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 }.. statePtr
b2d0: 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 ->ctx = ctx;..
b2e0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e /*. * We n
b2f0: 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 eed to make sure
b300: 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 that the channe
b310: 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 l works in binar
b320: 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 y (for the.
b330: 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 * encryption not
b340: 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 to get goofed u
b350: 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e p).. * We on
b360: 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 ly want to adjus
b370: 74 20 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 t the buffering
b380: 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 in pre-v2 channe
b390: 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a ls, where. *
b3a0: 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e each channel in
b3b0: 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 the stack maint
b3c0: 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 ained its own bu
b3d0: 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 ffers.. */.
b3e0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
b3f0: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
b400: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 Translation);.
b410: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
b420: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 t(&upperChannelB
b430: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 locking);. Tc
b440: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
b450: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
b460: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ar);. Tcl_DSt
b470: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
b480: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b hannelEncoding);
b490: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
b4a0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
b4b0: 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 , chan, "-eofcha
b4c0: 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 r", &upperChanne
b4d0: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 lEOFChar);. T
b4e0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
b4f0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
b500: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 , "-encoding", &
b510: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
b520: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 ding);. Tcl_G
b530: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
b540: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
b550: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 translation", &u
b560: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
b570: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c lation);. Tcl
b580: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
b590: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
b5a0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 "-blocking", &up
b5b0: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 perChannelBlocki
b5c0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 ng);. Tcl_Set
b5d0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
b5e0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 terp, chan, "-tr
b5f0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e anslation", "bin
b600: 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 ary");. Tcl_S
b610: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
b620: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
b630: 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 blocking", "true
b640: 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ");. dprintf(
b650: 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 "Consuming Tcl c
b660: 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f hannel %s", Tcl_
b670: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
b680: 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 han));. state
b690: 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f Ptr->self = Tcl_
b6a0: 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 StackChannel(int
b6b0: 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c erp, Tls_Channel
b6c0: 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 Type(), (ClientD
b6d0: 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 28 ata) statePtr, (
b6e0: 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 TCL_READABLE | T
b6f0: 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 CL_WRITABLE), ch
b700: 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 an);. dprintf
b710: 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 ("Created channe
b720: 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c l named %s", Tcl
b730: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
b740: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 statePtr->self))
b750: 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 ;. if (stateP
b760: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c tr->self == (Tcl
b770: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
b780: 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 {../*.. * No use
b790: 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c of Tcl_Eventual
b7a0: 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e lyFree because n
b7b0: 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 o possible Tcl_P
b7c0: 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 reserve... */..T
b7d0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
b7e0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 statePtr);..ret
b7f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
b800: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 }.. Tcl_Se
b810: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
b820: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
b830: 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 >self, "-transla
b840: 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 tion", Tcl_DStri
b850: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
b860: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
b870: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ));. Tcl_SetC
b880: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
b890: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
b8a0: 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 elf, "-encoding"
b8b0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
b8c0: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
b8d0: 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 Encoding));.
b8e0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
b8f0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
b900: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 tePtr->self, "-e
b910: 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 ofchar", Tcl_DSt
b920: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
b930: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 ChannelEOFChar))
b940: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
b950: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
b960: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
b970: 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 f, "-blocking",
b980: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
b990: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c (&upperChannelBl
b9a0: 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f ocking));.. /
b9b0: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 *. * SSL Ini
b9c0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 tialization.
b9d0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
b9e0: 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 ->ssl = SSL_new(
b9f0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
ba00: 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 if (!statePt
ba10: 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 r->ssl) {../* SS
ba20: 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 L library error
ba30: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 */..Tcl_AppendRe
ba40: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
ba50: 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 uldn't construct
ba60: 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c ssl session: ",
ba70: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
ba80: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
ba90: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
baa0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
bab0: 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 "IMPORT", "INIT"
bac0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
bad0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 r *) NULL);..Tls
bae0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
baf0: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 tatePtr);..retur
bb00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
bb10: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 }.. /* Set h
bb20: 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 ost server name
bb30: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 */. if (serve
bb40: 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 rname) {../* Set
bb50: 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d s the server nam
bb60: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e e indication (SN
bb70: 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c I) in ClientHell
bb80: 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 o extension */..
bb90: 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 2c /* Per RFC 6066,
bba0: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 hostname is a A
bbb0: 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 SCII encoded str
bbc0: 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20 ing, though RFC
bbd0: 34 33 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e 4366 says UTF-8.
bbe0: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 */..if (!SSL_se
bbf0: 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 t_tlsext_host_na
bc00: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c me(statePtr->ssl
bc10: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 , servername) &&
bc20: 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 require) {..
bc30: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
bc40: 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 t(interp, "setti
bc50: 6e 67 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 ng TLS host name
bc60: 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 extension faile
bc70: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
bc80: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
bc90: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
bca0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
bcb0: 22 2c 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 ", "SNI", "FAILE
bcc0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
bcd0: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
bce0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
bcf0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
bd00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
bd10: 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d ../* Set hostnam
bd20: 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 e for peer certi
bd30: 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 ficate hostname
bd40: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 verification in
bd50: 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e clients... Don
bd60: 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 't use SSL_set1_
bd70: 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68 61 host since it ha
bd80: 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a s limitations. *
bd90: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 /..if (!SSL_add1
bda0: 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e _host(statePtr->
bdb0: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 ssl, servername)
bdc0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
bdd0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
bde0: 2c 20 22 73 65 74 74 69 6e 67 20 44 4e 53 20 68 , "setting DNS h
bdf0: 6f 73 74 20 6e 61 6d 65 20 66 61 69 6c 65 64 22 ost name failed"
be00: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
be10: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
be20: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
be30: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
be40: 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 "HOSTNAME", "FA
be50: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
be60: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
be70: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
be80: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
be90: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
bea0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
beb0: 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 Resume session
bec0: 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 id */. if (se
bed0: 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c ssion_id && strl
bee0: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c en(session_id) <
bef0: 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 = SSL_MAX_SID_CT
bf00: 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 X_LENGTH) {../*
bf10: 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_set_session(
bf20: 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 ) */..if (!SSL_S
bf30: 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 ESSION_set1_id_c
bf40: 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 ontext(SSL_get_s
bf50: 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d ession(statePtr-
bf60: 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 >ssl), session_i
bf70: 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 d, (unsigned int
bf80: 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e ) strlen(session
bf90: 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 _id))) {.. Tc
bfa0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
bfb0: 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 nterp, "Resume s
bfc0: 65 73 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 ession id ", ses
bfd0: 73 69 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 sion_id, " faile
bfe0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
bff0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
c000: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
c010: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
c020: 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 ", "SESSION", "F
c030: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
c040: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 NULL);.. Tls
c050: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
c060: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
c070: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
c080: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
c090: 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 * Enable Applica
c0a0: 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f tion-Layer Proto
c0b0: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e col Negotiation.
c0c0: 20 45 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 Examples are: h
c0d0: 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 ttp/1.0,..http/1
c0e0: 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c .1, h2, h3, ftp,
c0f0: 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 imap, pop3, xmp
c100: 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 p-client, xmpp-s
c110: 65 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 erver, mqtt, irc
c120: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 , etc. */. if
c130: 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f (alpn) {../* Co
c140: 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 nvert a TCL list
c150: 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c into a protocol
c160: 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f -list in wire-fo
c170: 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 rmat */..unsigne
c180: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 d char *protos,
c190: 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e *p;..unsigned in
c1a0: 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 t protos_len = 0
c1b0: 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 6e 2c 20 63 ;..int i, len, c
c1c0: 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c nt;..Tcl_Obj **l
c1d0: 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c ist;...if (Tcl_L
c1e0: 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 istObjGetElement
c1f0: 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 s(interp, alpn,
c200: 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 &cnt, &list) !=
c210: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 TCL_OK) {.. T
c220: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
c230: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
c240: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
c250: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 R;..}.../* Deter
c260: 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 mine the memory
c270: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 required for the
c280: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a protocol-list *
c290: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 /..for (i = 0; i
c2a0: 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 < cnt; i++) {..
c2b0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e Tcl_GetStrin
c2c0: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d gFromObj(list[i]
c2d0: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 , &len);.. if
c2e0: 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 (len > 255) {..
c2f0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
c300: 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 t(interp, "ALPN
c310: 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f protocol name to
c320: 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a o long", (char *
c330: 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 ) NULL);...Tcl_S
c340: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
c350: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
c360: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 RT", "ALPN", "FA
c370: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
c380: 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 NULL);...Tls_Fre
c390: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
c3a0: 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 Ptr);...return T
c3b0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
c3c0: 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e .. protos_len
c3d0: 20 2b 3d 20 31 20 2b 20 6c 65 6e 3b 0a 09 7d 0a += 1 + len;..}.
c3e0: 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63 ../* Build the c
c3f0: 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c omplete protocol
c400: 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 -list */..protos
c410: 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f = ckalloc(proto
c420: 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 s_len);../* prot
c430: 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 ocol-lists consi
c440: 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 st of 8-bit leng
c450: 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74 th-prefixed, byt
c460: 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f e strings */..fo
c470: 72 20 28 69 20 3d 20 30 2c 20 70 20 3d 20 70 72 r (i = 0, p = pr
c480: 6f 74 6f 73 3b 20 69 20 3c 20 63 6e 74 3b 20 69 otos; i < cnt; i
c490: 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 ++) {.. char
c4a0: 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 *str = Tcl_GetSt
c4b0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 ringFromObj(list
c4c0: 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 [i], &len);..
c4d0: 20 2a 70 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 20 20 *p++ = len;..
c4e0: 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c memcpy(p, str,
c4f0: 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d len);.. p +=
c500: 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 len;..}.../* SS
c510: 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f L_set_alpn_proto
c520: 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f s makes a copy o
c530: 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c f the protocol-l
c540: 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a ist */../* Note:
c550: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 This functions
c560: 72 65 76 65 72 73 65 73 20 74 68 65 20 72 65 74 reverses the ret
c570: 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e urn value conven
c580: 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c tion */..if (SSL
c590: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 _set_alpn_protos
c5a0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c5b0: 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c protos, protos_l
c5c0: 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f en)) {.. Tcl_
c5d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
c5e0: 65 72 70 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 erp, "failed to
c5f0: 73 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f set ALPN protoco
c600: 6c 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ls", (char *) NU
c610: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
c620: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
c630: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
c640: 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 T", "ALPN", "FAI
c650: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
c660: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
c670: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
c680: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 tePtr);.. ckf
c690: 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 ree(protos);..
c6a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
c6b0: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 OR;..}.../* Stor
c6c0: 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 e protocols list
c6d0: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 */..statePtr->p
c6e0: 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a rotos = protos;.
c6f0: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
c700: 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c s_len = protos_l
c710: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b en;. } else {
c720: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
c730: 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 os = NULL;..stat
c740: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e ePtr->protos_len
c750: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 = 0;. }..
c760: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 /*. * SSL C
c770: 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f allbacks. */
c780: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 . SSL_set_app
c790: 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e _data(statePtr->
c7a0: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ssl, (void *)sta
c7b0: 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 tePtr);./* point
c7c0: 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 back to us */.
c7d0: 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 SSL_set_verif
c7e0: 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c y(statePtr->ssl,
c7f0: 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 verify, VerifyC
c800: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 allback);. SS
c810: 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 L_set_info_callb
c820: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ack(statePtr->ss
c830: 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 l, InfoCallback)
c840: 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 ;.. /* Callba
c850: 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 ck for observing
c860: 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 protocol messag
c870: 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 es */.#ifndef OP
c880: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 ENSSL_NO_SSL_TRA
c890: 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 CE. /* void S
c8a0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 SL_CTX_set_msg_c
c8b0: 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 allback_arg(stat
c8c0: 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 ePtr->ctx, (void
c8d0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 *)statePtr);.
c8e0: 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 void SSL_CTX_s
c8f0: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 et_msg_callback(
c900: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d statePtr->ctx, M
c910: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b essageCallback);
c920: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f */. SSL_set_
c930: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 msg_callback_arg
c940: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c950: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
c960: 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d );. SSL_set_m
c970: 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 sg_callback(stat
c980: 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 ePtr->ssl, Messa
c990: 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e geCallback);.#en
c9a0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 dif.. /* Crea
c9b0: 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 te Tcl_Channel B
c9c0: 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 IO Handler */.
c9d0: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 statePtr->p_bi
c9e0: 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 o.= BIO_new_tcl(
c9f0: 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f statePtr, BIO_NO
ca00: 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 CLOSE);. stat
ca10: 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f ePtr->bio.= BIO_
ca20: 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 new(BIO_f_ssl())
ca30: 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 ;.. if (serve
ca40: 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 r) {../* Server
ca50: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 callbacks */..SS
ca60: 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 L_CTX_set_tlsext
ca70: 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 _servername_arg(
ca80: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 statePtr->ctx, (
ca90: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
caa0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 ;..SSL_CTX_set_t
cab0: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 lsext_servername
cac0: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 _callback(stateP
cad0: 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c tr->ctx, SNICall
cae0: 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f back);..SSL_CTX_
caf0: 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f set_client_hello
cb00: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
cb10: 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b x, HelloCallback
cb20: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
cb30: 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 tr);..if (stateP
cb40: 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 tr->protos != NU
cb50: 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 LL) {.. SSL_C
cb60: 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 TX_set_alpn_sele
cb70: 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ct_cb(statePtr->
cb80: 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 ctx, ALPNCallbac
cb90: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
cba0: 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45 Ptr);.#ifdef USE
cbb0: 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c _NPN.. if (tl
cbc0: 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 s1_2 == 0 && tls
cbd0: 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 1_3 == 0) {...SS
cbe0: 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 L_CTX_set_next_p
cbf0: 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 rotos_advertised
cc00: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
cc10: 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 x, NPNCallback,
cc20: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
cc30: 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 );.. }.#endif
cc40: 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 ..}.../* Enable
cc50: 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63 server to send c
cc60: 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65 ert request afte
cc70: 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 r handshake (TLS
cc80: 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 1.3 only) */../
cc90: 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 74 * A write operat
cca0: 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c ion must take pl
ccb0: 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 74 ace for the Cert
ccc0: 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74 20 ificate Request
ccd0: 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74 to be.. sent t
cce0: 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 o the client, th
ccf0: 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 is can be done w
cd00: 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 ith SSL_do_hands
cd10: 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 hake(). */..if (
cd20: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f request && post_
cd30: 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c 73 handshake && tls
cd40: 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 1_3) {.. SSL_
cd50: 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f verify_client_po
cd60: 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 st_handshake(sta
cd70: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a tePtr->ssl);..}.
cd80: 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 ../* set automat
cd90: 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 69 ic curve selecti
cda0: 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 on */..SSL_set_e
cdb0: 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50 74 cdh_auto(statePt
cdc0: 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a r->ssl, 1);.../*
cdd0: 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65 Set server mode
cde0: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 */..statePtr->f
cdf0: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f lags |= TLS_TCL_
ce00: 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 SERVER;..SSL_set
ce10: 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 _accept_state(st
ce20: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
ce30: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 } else {../* C
ce40: 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 lient callbacks
ce50: 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 */.#ifdef USE_NP
ce60: 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d N..if (statePtr-
ce70: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 >protos != NULL
ce80: 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 && tls1_2 == 0 &
ce90: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b & tls1_3 == 0) {
cea0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
ceb0: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c t_next_proto_sel
cec0: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d ect_cb(statePtr-
ced0: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 >ctx, ALPNCallba
cee0: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
cef0: 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 ePtr);..}.#endif
cf00: 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 .../* Session ca
cf10: 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 ching */..SSL_CT
cf20: 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 X_set_session_ca
cf30: 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 che_mode(statePt
cf40: 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 r->ctx, SSL_SESS
cf50: 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 _CACHE_CLIENT |
cf60: 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e SSL_SESS_CACHE_N
cf70: 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 O_INTERNAL_STORE
cf80: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 );..SSL_CTX_sess
cf90: 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 _set_new_cb(stat
cfa0: 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 ePtr->ctx, Sessi
cfb0: 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f onCallback);.../
cfc0: 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 * Enable post ha
cfd0: 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 ndshake Authenti
cfe0: 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e cation extension
cff0: 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 . TLS 1.3 only,
d000: 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 not http/2. */..
d010: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 if (request && p
d020: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b ost_handshake) {
d030: 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f .. SSL_set_po
d040: 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 st_handshake_aut
d050: 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c h(statePtr->ssl,
d060: 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 1);..}.../* Set
d070: 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a client mode */.
d080: 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 .SSL_set_connect
d090: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d _state(statePtr-
d0a0: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 >ssl);. }.
d0b0: 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 SSL_set_bio(sta
d0c0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 tePtr->ssl, stat
d0d0: 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 ePtr->p_bio, sta
d0e0: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 tePtr->p_bio);.
d0f0: 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 BIO_set_ssl(s
d100: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 tatePtr->bio, st
d110: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f atePtr->ssl, BIO
d120: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 _NOCLOSE);..
d130: 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 /*. * End of
d140: 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a SSL Init. *
d150: 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 /. dprintf("R
d160: 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 eturning %s", Tc
d170: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
d180: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
d190: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 );. Tcl_SetRe
d1a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 sult(interp, (ch
d1b0: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 ar *) Tcl_GetCha
d1c0: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
d1d0: 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f r->self), TCL_VO
d1e0: 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 LATILE);.. re
d1f0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
d200: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
d210: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a tData;.}.../*. *
d220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d260: 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f ---. *. * Unimpo
d270: 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 rtObjCmd --. *.
d280: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
d290: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 is invoked to r
d2a0: 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 emove the topmos
d2b0: 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 t channel filter
d2c0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
d2d0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
d2e0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
d2f0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
d300: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 *.May modify the
d310: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 behavior of an
d320: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 IO channel.. *.
d330: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
d340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d370: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
d380: 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 int.UnimportObjC
d390: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
d3a0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
d3b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
d3c0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
d3d0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
d3e0: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
d3f0: 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 chan;../* The c
d400: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 hannel to set a
d410: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 mode on. */..
d420: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
d430: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
d440: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
d450: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
d460: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
d470: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
d480: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
d490: 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 }.. chan = Tc
d4a0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
d4b0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 erp, Tcl_GetStri
d4c0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c ng(objv[1]), NUL
d4d0: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
d4e0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
d4f0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
d500: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
d510: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
d520: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
d530: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
d540: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
d550: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
d560: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 hannel(chan);..
d570: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
d580: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
d590: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
d5a0: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
d5b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
d5c0: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
d5d0: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
d5e0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 elName(chan),...
d5f0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
d600: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a hannel", NULL);.
d610: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f . Tcl_SetErro
d620: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
d630: 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c LS", "UNIMPORT",
d640: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
d650: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
d660: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
d670: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
d680: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 . if (Tcl_Uns
d690: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 tackChannel(inte
d6a0: 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c rp, chan) == TCL
d6b0: 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 _ERROR) {..retur
d6c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
d6d0: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }.. return T
d6e0: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
d6f0: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
d700: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
d710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
d750: 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 . * CTX_Init --
d760: 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f construct a SSL_
d770: 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a CTX instance. *.
d780: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
d790: 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 valid SSL_CTX i
d7a0: 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e nstance or NULL.
d7b0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
d7c0: 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 cts:. *.construc
d7d0: 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 ts SSL context (
d7e0: 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d CTX). *. *------
d7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
d830: 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 /.static SSL_CTX
d840: 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 *.CTX_Init(Stat
d850: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 e *statePtr, int
d860: 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 isServer, int p
d870: 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 roto, char *keyf
d880: 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 ile, char *certf
d890: 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 ile,. unsigne
d8a0: 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 d char *key, uns
d8b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 igned char *cert
d8c0: 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 , int key_len, i
d8d0: 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 nt cert_len, cha
d8e0: 72 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 63 68 r *CAdir,. ch
d8f0: 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 ar *CAfile, char
d900: 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 *ciphers, char
d910: 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 *ciphersuites, i
d920: 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a nt level, char *
d930: 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 DHparams) {.
d940: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
d950: 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp = statePtr->i
d960: 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 nterp;. SSL_C
d970: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a TX *ctx = NULL;.
d980: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
d990: 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 ds;. Tcl_DStr
d9a0: 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 ing ds1;. int
d9b0: 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e off = 0;. in
d9c0: 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b t load_private_k
d9d0: 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 ey;. const SS
d9e0: 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 L_METHOD *method
d9f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
da00: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
da10: 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 f (!proto) {..Tc
da20: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
da30: 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 nterp, "no valid
da40: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 protocol select
da50: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
da60: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
da70: 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 . /* create S
da80: 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 SL context */.#i
da90: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
daa0: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 N_NUMBER >= 0x10
dab0: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 100000L || defin
dac0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 ed(NO_SSL2) || d
dad0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
dae0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 O_SSL2). if (
daf0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
db00: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 LS_PROTO_SSL2))
db10: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
db20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c ult(interp, "SSL
db30: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 2 protocol not s
db40: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
db50: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
db60: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
db70: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 defined(NO_SSL3
db80: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
db90: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 NSSL_NO_SSL3).
dba0: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
dbb0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 oto, TLS_PROTO_S
dbc0: 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 SL3)) {..Tcl_App
dbd0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
dbe0: 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c , "SSL3 protocol
dbf0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
dc00: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
dc10: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
dc20: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
dc30: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e O_TLS1) || defin
dc40: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
dc50: 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 S1). if (ENAB
dc60: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
dc70: 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 ROTO_TLS1)) {..T
dc80: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
dc90: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 interp, "TLS 1.0
dca0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
dcb0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
dcc0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
dcd0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
dce0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
dcf0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
dd00: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
dd10: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
dd20: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
dd30: 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 O_TLS1_1)) {..Tc
dd40: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
dd50: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 nterp, "TLS 1.1
dd60: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
dd70: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
dd80: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
dd90: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 }.#endif.#if d
dda0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
ddb0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
ddc0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a NSSL_NO_TLS1_2).
ddd0: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 if (ENABLED(
dde0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
ddf0: 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c _TLS1_2)) {..Tcl
de00: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
de10: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 terp, "TLS 1.2 p
de20: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
de30: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
de40: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
de50: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
de60: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
de70: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
de80: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
de90: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
dea0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
deb0: 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f TLS1_3)) {..Tcl_
dec0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
ded0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 erp, "TLS 1.3 pr
dee0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
def0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 rted", NULL);..r
df00: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
df10: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 }.#endif. if
df20: 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 (proto == 0) {..
df30: 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e 67 /* Use full rang
df40: 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 e */..SSL_CTX_se
df50: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 t_min_proto_vers
df60: 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53 53 ion(ctx, 0);..SS
df70: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 L_CTX_set_max_pr
df80: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
df90: 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 0);. }..
dfa0: 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b switch (proto) {
dfb0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
dfc0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
dfd0: 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 10100000L && !de
dfe0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 fined(NO_SSL2) &
dff0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
e000: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 SL_NO_SSL2).
e010: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 case TLS_PROTO_S
e020: 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 SL2:..method = i
e030: 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 5f sServer ? SSLv2_
e040: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 server_method()
e050: 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d : SSLv2_client_m
e060: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
e070: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
e080: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 ined(NO_SSL3) &&
e090: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
e0a0: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 L_NO_SSL3) && !d
e0b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e0c0: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 O_SSL3_METHOD).
e0d0: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
e0e0: 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 O_SSL3:..method
e0f0: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c = isServer ? SSL
e100: 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 v3_server_method
e110: 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e () : SSLv3_clien
e120: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
e130: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
e140: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
e150: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
e160: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 NSSL_NO_TLS1) &&
e170: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
e180: 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 L_NO_TLS1_METHOD
e190: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
e1a0: 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 ROTO_TLS1:..meth
e1b0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
e1c0: 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 TLSv1_server_met
e1d0: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c hod() : TLSv1_cl
e1e0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
e1f0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
e200: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
e210: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
e220: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
e230: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
e240: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
e250: 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 _1_METHOD). c
e260: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
e270: 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 S1_1:..method =
e280: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 isServer ? TLSv1
e290: 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 _1_server_method
e2a0: 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 () : TLSv1_1_cli
e2b0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
e2c0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
e2d0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
e2e0: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
e2f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
e300: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
e310: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
e320: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 2_METHOD). ca
e330: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
e340: 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 1_2:..method = i
e350: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f sServer ? TLSv1_
e360: 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 2_server_method(
e370: 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 ) : TLSv1_2_clie
e380: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
e390: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
e3a0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
e3b0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
e3c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
e3d0: 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 3). case TLS_
e3e0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f PROTO_TLS1_3:../
e3f0: 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 69 * Use the generi
e400: 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e c method and con
e410: 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66 straint range af
e420: 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63 ter context is c
e430: 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f reated */..metho
e440: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
e450: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 LS_server_method
e460: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f () : TLS_client_
e470: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
e480: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 ;.#endif. def
e490: 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 ault:../* Negoti
e4a0: 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61 69 ate highest avai
e4b0: 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 lable SSL/TLS ve
e4c0: 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 rsion */..method
e4d0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c = isServer ? TL
e4e0: 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 S_server_method(
e4f0: 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d ) : TLS_client_m
e500: 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 ethod();.#if OPE
e510: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
e520: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 BER < 0x10100000
e530: 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f L && !defined(NO
e540: 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e _SSL2) && !defin
e550: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
e560: 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 L2)..off |= (ENA
e570: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
e580: 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 PROTO_SSL2) ?
e590: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 0 : SSL_OP_NO_SS
e5a0: 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 Lv2);.#endif.#if
e5b0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
e5c0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
e5d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a PENSSL_NO_SSL3).
e5e0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
e5f0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
e600: 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 O_SSL3) ? 0 :
e610: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 SSL_OP_NO_SSLv3)
e620: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
e630: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 fined(NO_TLS1) &
e640: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
e650: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 SL_NO_TLS1)..off
e660: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f |= (ENABLED(pro
e670: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
e680: 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f S1) ? 0 : SSL_
e690: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 OP_NO_TLSv1);.#e
e6a0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
e6b0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 d(NO_TLS1_1) &&
e6c0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e6d0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 _NO_TLS1_1)..off
e6e0: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f |= (ENABLED(pro
e6f0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
e700: 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f S1_1) ? 0 : SSL_
e710: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a OP_NO_TLSv1_1);.
e720: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
e730: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 ned(NO_TLS1_2) &
e740: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
e750: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f SL_NO_TLS1_2)..o
e760: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
e770: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
e780: 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 TLS1_2) ? 0 : SS
e790: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 L_OP_NO_TLSv1_2)
e7a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
e7b0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
e7c0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
e7d0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
e7e0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
e7f0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
e800: 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 O_TLS1_3) ? 0 :
e810: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f SSL_OP_NO_TLSv1_
e820: 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 3);.#endif..brea
e830: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 k;. }.. ER
e840: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
e850: 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f .. ctx = SSL_
e860: 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b CTX_new(method);
e870: 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20 7b . if (!ctx) {
e880: 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
e890: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 }.. if (g
e8a0: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 etenv(SSLKEYLOGF
e8b0: 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 ILE)) {..SSL_CTX
e8c0: 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c _set_keylog_call
e8d0: 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 back(ctx, KeyLog
e8e0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d Callback);. }
e8f0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e ..#if !defined(N
e900: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 O_TLS1_3) && !de
e910: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e920: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 _TLS1_3). if
e930: 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 (proto == TLS_PR
e940: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 OTO_TLS1_3) {..S
e950: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 SL_CTX_set_min_p
e960: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
e970: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
e980: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
e990: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f max_proto_versio
e9a0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
e9b0: 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 RSION);. }.#e
e9c0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 ndif.. /* For
e9d0: 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74 ce cipher select
e9e0: 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72 ion order by ser
e9f0: 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 ver */. if (!
ea00: 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c isServer) {..SSL
ea10: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
ea20: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 (ctx, SSL_OP_CIP
ea30: 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45 HER_SERVER_PREFE
ea40: 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 RENCE);. }..
ea50: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 SSL_CTX_set_a
ea60: 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76 6f pp_data(ctx, (vo
ea70: 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 id*)interp);./*
ea80: 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 remember the int
ea90: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 erpreter */.
eaa0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
eab0: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f ons(ctx, SSL_OP_
eac0: 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c ALL);./* all SSL
ead0: 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 bug workarounds
eae0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f */. SSL_CTX_
eaf0: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c set_options(ctx,
eb00: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 SSL_OP_NO_COMPR
eb10: 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 ESSION);./* disa
eb20: 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 ble compression
eb30: 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72 74 65 even if supporte
eb40: 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 d */. SSL_CTX
eb50: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 _set_options(ctx
eb60: 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 , off);../* disa
eb70: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 ble protocol ver
eb80: 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 sions */.#if OPE
eb90: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
eba0: 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 BER < 0x10101000
ebb0: 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 L. SSL_CTX_se
ebc0: 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f t_mode(ctx, SSL_
ebd0: 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 MODE_AUTO_RETRY)
ebe0: 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 ;./* handle new
ebf0: 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61 handshakes in ba
ec00: 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 ckground. On by
ec10: 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 default in OpenS
ec20: 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e SL 1.1.1. */.#en
ec30: 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f dif. SSL_CTX_
ec40: 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 sess_set_cache_s
ec50: 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a ize(ctx, 128);..
ec60: 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 /* Set user
ec70: 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c defined ciphers,
ec80: 20 63 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 cipher suites,
ec90: 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 and security lev
eca0: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 el */. if ((c
ecb0: 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 iphers != NULL)
ecc0: 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f && !SSL_CTX_set_
ecd0: 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c cipher_list(ctx,
ece0: 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 54 63 ciphers)) {..Tc
ecf0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
ed00: 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 nterp, "Set ciph
ed10: 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 ers failed: No v
ed20: 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 alid ciphers", (
ed30: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
ed40: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
ed50: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
ed60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
ed70: 63 69 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 ciphersuites !=
ed80: 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 NULL) && !SSL_CT
ed90: 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 X_set_ciphersuit
eda0: 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 es(ctx, ciphersu
edb0: 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ites)) {..Tcl_Ap
edc0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
edd0: 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 20 73 p, "Set cipher s
ede0: 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f uites failed: No
edf0: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c valid ciphers",
ee00: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
ee10: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
ee20: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
ee30: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a L;. }.. /*
ee40: 20 53 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 Set security le
ee50: 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c vel */. if (l
ee60: 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 evel > -1 && lev
ee70: 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 el < 6) {../* SS
ee80: 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c L_set_security_l
ee90: 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 evel */..SSL_CTX
eea0: 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _set_security_le
eeb0: 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b vel(ctx, level);
eec0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 . }.. /* s
eed0: 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b et some callback
eee0: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 s */. SSL_CTX
eef0: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 _set_default_pas
ef00: 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73 swd_cb(ctx, Pass
ef10: 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 wordCallback);.
ef20: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 SSL_CTX_set_d
ef30: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 efault_passwd_cb
ef40: 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 28 _userdata(ctx, (
ef50: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
ef60: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61 ;.. /* read a
ef70: 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 Diffie-Hellman
ef80: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c parameters file,
ef90: 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 6c or use the buil
efa0: 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 t-in one */.#ifd
efb0: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 ef OPENSSL_NO_DH
efc0: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d . if (DHparam
efd0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 s != NULL) {..Tc
efe0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
eff0: 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d nterp, "DH param
f000: 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 eter support not
f010: 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 available", (ch
f020: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 ar *) NULL);..SS
f030: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
f040: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
f050: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b }.#else. {
f060: 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 ..DH* dh;..if (D
f070: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 Hparams != NULL)
f080: 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f {.. BIO *bio
f090: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 ;.. Tcl_DStri
f0a0: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 ngInit(&ds);..
f0b0: 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f bio = BIO_new_
f0c0: 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d file(F2N(DHparam
f0d0: 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 s, &ds), "r");..
f0e0: 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a if (!bio) {.
f0f0: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
f100: 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 e(&ds);...Tcl_Ap
f110: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f120: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 p, "Could not fi
f130: 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 nd DH parameters
f140: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 file", (char *)
f150: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
f160: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
f170: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
f180: 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45 }... dh = PE
f190: 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 M_read_bio_DHpar
f1a0: 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e ams(bio, NULL, N
f1b0: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ULL, NULL);..
f1c0: 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a BIO_free(bio);.
f1d0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
f1e0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
f1f0: 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c if (!dh) {...Tcl
f200: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
f210: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 terp, "Could not
f220: 20 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 74 read DH paramet
f230: 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 ers from file",
f240: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
f250: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
f260: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
f270: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c LL;.. }..} el
f280: 73 65 20 7b 0a 09 20 20 20 20 64 68 20 3d 20 67 se {.. dh = g
f290: 65 74 5f 64 68 50 61 72 61 6d 73 28 29 3b 0a 09 et_dhParams();..
f2a0: 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 }..SSL_CTX_set_t
f2b0: 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a mp_dh(ctx, dh);.
f2c0: 09 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 20 20 .DH_free(dh);.
f2d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 }.#endif..
f2e0: 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 /* set our certi
f2f0: 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f ficate */. lo
f300: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d ad_private_key =
f310: 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 0;. if (cert
f320: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
f330: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 .load_private_ke
f340: 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 y = 1;...Tcl_DSt
f350: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a ringInit(&ds);..
f360: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 .if (SSL_CTX_use
f370: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c _certificate_fil
f380: 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 e(ctx, F2N(certf
f390: 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 ile, &ds), SSL_F
f3a0: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 ILETYPE_PEM) <=
f3b0: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 0) {.. Tcl_DS
f3c0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
f3d0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
f3e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
f3f0: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 nable to set cer
f400: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c tificate file ",
f410: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c certfile, ": ",
f420: 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 .... REASON(
f430: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
f440: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
f450: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 free(ctx);..
f460: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a return NULL;..}.
f470: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
f480: 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ert != NULL) {..
f490: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 load_private_key
f4a0: 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43 = 1;..if (SSL_C
f4b0: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 TX_use_certifica
f4c0: 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 72 te_ASN1(ctx, cer
f4d0: 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 t_len, cert) <=
f4e0: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 0) {.. Tcl_DS
f4f0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
f500: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
f510: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
f520: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 nable to set cer
f530: 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 09 tificate: ",....
f540: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 REASON(), (
f550: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
f560: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
f570: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 (ctx);.. retu
f580: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 rn NULL;..}.
f590: 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 } else {..certfi
f5a0: 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 le = (char*)X509
f5b0: 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 _get_default_cer
f5c0: 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 t_file();...if (
f5d0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 SSL_CTX_use_cert
f5e0: 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 ificate_file(ctx
f5f0: 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f , certfile, SSL_
f600: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d FILETYPE_PEM) <=
f610: 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 0) {.#if 0..
f620: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
f630: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f (&ds);.. Tcl_
f640: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f650: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
f660: 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 use default cert
f670: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 ificate file ",
f680: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a certfile, ": ",.
f690: 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 ... REASON()
f6a0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
f6b0: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
f6c0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
f6d0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 eturn NULL;.#end
f6e0: 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 if..}. }..
f6f0: 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 /* set our priv
f700: 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 ate key */. i
f710: 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f f (load_private_
f720: 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 key) {..if (keyf
f730: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b ile == NULL && k
f740: 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 ey == NULL) {..
f750: 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 keyfile = cer
f760: 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 tfile;..}...if (
f770: 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 keyfile != NULL)
f780: 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 {.. /* get t
f790: 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 he private key a
f7a0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 ssociated with t
f7b0: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 his certificate
f7c0: 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 */.. if (keyf
f7d0: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile == NULL) {..
f7e0: 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 .keyfile = certf
f7f0: 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ile;.. }...
f800: 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 if (SSL_CTX_us
f810: 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c e_PrivateKey_fil
f820: 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 e(ctx, F2N(keyfi
f830: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 le, &ds), SSL_FI
f840: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 LETYPE_PEM) <= 0
f850: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
f860: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a gFree(&ds);.../*
f870: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
f880: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
f890: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
f8a0: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
f8b0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
f8c0: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
f8d0: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
f8e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
f8f0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
f900: 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 public key file
f910: 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c ", keyfile, " ",
f920: 0a 09 09 09 20 20 20 20 20 20 20 20 20 52 45 41 .... REA
f930: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
f940: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
f950: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
f960: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
f970: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
f980: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d ngFree(&ds);...}
f990: 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d else if (key !=
f9a0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 NULL) {.. if
f9b0: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 (SSL_CTX_use_Pr
f9c0: 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 ivateKey_ASN1(EV
f9d0: 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c P_PKEY_RSA, ctx,
f9e0: 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d key,key_len) <=
f9f0: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 0) {...Tcl_DStr
fa00: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 ingFree(&ds);...
fa10: 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 /* flush the pas
fa20: 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 sphrase which mi
fa30: 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 ght be left in t
fa40: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 he result */...T
fa50: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
fa60: 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 erp, NULL, TCL_S
fa70: 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 TATIC);...Tcl_Ap
fa80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
fa90: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
faa0: 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c t public key: ",
fab0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
fac0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
fad0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
fae0: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
faf0: 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 }..}../* Now
fb00: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 we know that a
fb10: 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 76 key and cert hav
fb20: 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e e been set again
fb30: 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63 st.. * the SSL c
fb40: 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21 ontext */..if (!
fb50: 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 SSL_CTX_check_pr
fb60: 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20 ivate_key(ctx))
fb70: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
fb80: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
fb90: 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f 65 "private key doe
fba0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 s not match the
fbb0: 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62 6c certificate publ
fbc0: 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 20 20 ic key",....
fbd0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
fbe0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
fbf0: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
fc00: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 turn NULL;..}.
fc10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 }.. /* Set
fc20: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 43 41 73 verification CAs
fc30: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 */. Tcl_DStr
fc40: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 20 ingInit(&ds);.
fc50: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
fc60: 74 28 26 64 73 31 29 3b 0a 20 20 20 20 2f 2a 20 t(&ds1);. /*
fc70: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 64 65 66 There is one def
fc80: 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 2c 20 ault directory,
fc90: 6f 6e 65 20 64 65 66 61 75 6c 74 20 66 69 6c 65 one default file
fca0: 2c 20 61 6e 64 20 6f 6e 65 20 64 65 66 61 75 6c , and one defaul
fcb0: 74 20 73 74 6f 72 65 2e 0a 09 54 68 65 20 64 65 t store...The de
fcc0: 66 61 75 6c 74 20 43 41 20 63 65 72 74 69 66 69 fault CA certifi
fcd0: 63 61 74 65 73 20 64 69 72 65 63 74 6f 72 79 20 cates directory
fce0: 28 61 6e 64 20 64 65 66 61 75 6c 74 20 73 74 6f (and default sto
fcf0: 72 65 29 20 69 73 20 69 6e 20 74 68 65 20 4f 70 re) is in the Op
fd00: 65 6e 53 53 4c 0a 09 63 65 72 74 73 20 64 69 72 enSSL..certs dir
fd10: 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 62 ectory. It can b
fd20: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 e overridden by
fd30: 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 the SSL_CERT_DIR
fd40: 20 65 6e 76 20 76 61 72 2e 20 54 68 65 0a 09 64 env var. The..d
fd50: 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 69 66 efault CA certif
fd60: 69 63 61 74 65 73 20 66 69 6c 65 20 69 73 20 63 icates file is c
fd70: 61 6c 6c 65 64 20 63 65 72 74 2e 70 65 6d 20 69 alled cert.pem i
fd80: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 4f 70 n the default Op
fd90: 65 6e 53 53 4c 0a 09 64 69 72 65 63 74 6f 72 79 enSSL..directory
fda0: 2e 20 49 74 20 63 61 6e 20 62 65 20 6f 76 65 72 . It can be over
fdb0: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 ridden by the SS
fdc0: 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e 76 20 L_CERT_FILE env
fdd0: 76 61 72 2e 20 2a 2f 0a 09 2f 2a 20 69 6e 74 20 var. */../* int
fde0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
fdf0: 75 6c 74 5f 76 65 72 69 66 79 5f 64 69 72 28 53 ult_verify_dir(S
fe00: 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 61 6e 64 SL_CTX *ctx) and
fe10: 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65 74 int SSL_CTX_set
fe20: 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f _default_verify_
fe30: 66 69 6c 65 28 53 53 4c 5f 43 54 58 20 2a 63 74 file(SSL_CTX *ct
fe40: 78 29 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 x) */. if (!S
fe50: 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 SL_CTX_load_veri
fe60: 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 fy_locations(ctx
fe70: 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 , F2N(CAfile, &d
fe80: 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 26 s), F2N(CAdir, &
fe90: 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 ds1)) ||..!SSL_C
fea0: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 TX_set_default_v
feb0: 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 erify_paths(ctx)
fec0: 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 ) {.#if 0..Tcl_D
fed0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
fee0: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
fef0: 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e e(&ds1);../* Don
ff00: 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 't currently car
ff10: 65 20 69 66 20 74 68 69 73 20 66 61 69 6c 73 20 e if this fails
ff20: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 */..Tcl_AppendRe
ff30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 sult(interp, "SS
ff40: 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69 66 79 L default verify
ff50: 20 70 61 74 68 73 3a 20 22 2c 20 52 45 41 53 4f paths: ", REASO
ff60: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
ff70: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 LL);..SSL_CTX_fr
ff80: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e ee(ctx);..return
ff90: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 NULL;.#endif.
ffa0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 }.. /* http
ffb0: 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e s://sourceforge.
ffc0: 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 net/p/tls/bugs/5
ffd0: 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 7/ */. /* XXX
ffe0: 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 :TODO: Let the u
fff0: 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 ser supply value
10000 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f s here instead o
10010 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 f something that
10020 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 exists on the f
10030 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 ilesystem */.
10040 20 69 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e if (CAfile != N
10050 55 4c 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 ULL) {..STACK_OF
10060 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 (X509_NAME) *cer
10070 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 tNames = SSL_loa
10080 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 d_client_CA_file
10090 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 (F2N(CAfile, &ds
100a0 29 29 3b 0a 09 69 66 20 28 63 65 72 74 4e 61 6d ));..if (certNam
100b0 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 es != NULL) {..
100c0 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 SSL_CTX_set_c
100d0 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 lient_CA_list(ct
100e0 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 x, certNames);..
100f0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c }. }.. Tcl
10100 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
10110 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
10120 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 20 20 ngFree(&ds1);.
10130 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a return ctx;.}.
10140 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
10150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
10190 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d StatusObjCmd --
101a0 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 return certific
101b0 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 ate for connecte
101c0 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 d peer.. *. * Re
101d0 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
101e0 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
101f0 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
10200 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
10210 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
10220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10250 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
10260 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 c int.StatusObjC
10270 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
10280 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
10290 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
102a0 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
102b0 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
102c0 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
102d0 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a ePtr;. X509 *
102e0 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 peer;. Tcl_Ob
102f0 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 j *objPtr;. T
10300 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
10310 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e . char *chann
10320 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 elName, *ciphers
10330 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a ;. int mode;.
10340 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
10350 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a ed char *proto;.
10360 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
10370 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 len;. int ni
10380 64 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 d, res;.. dpr
10390 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
103a0 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 . if (objc <
103b0 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 2 || objc > 3 ||
103c0 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 (objc == 3 && !
103d0 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 strcmp(Tcl_GetSt
103e0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 ring(objv[1]), "
103f0 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 -local"))) {..Tc
10400 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
10410 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
10420 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 "?-local? channe
10430 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c l");..return TCL
10440 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
10450 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 /* Get channe
10460 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e l Id */. chan
10470 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 nelName = Tcl_Ge
10480 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
10490 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f bjv[(objc == 2 ?
104a0 20 31 20 3a 20 32 29 5d 2c 20 4e 55 4c 4c 29 3b 1 : 2)], NULL);
104b0 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
104c0 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
104d0 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 p, channelName,
104e0 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 &mode);. if (
104f0 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
10500 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
10510 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
10520 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
10530 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
10540 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
10550 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
10560 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
10570 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
10580 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 ;. if (Tcl_Ge
10590 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
105a0 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
105b0 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f lType()) {..Tcl_
105c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
105d0 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
105e0 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
105f0 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
10600 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c ..."\": not a TL
10610 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c S channel", NULL
10620 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
10630 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
10640 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 S", "STATUS", "C
10650 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
10660 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
10670 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
10680 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
10690 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
106a0 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 te *) Tcl_GetCha
106b0 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
106c0 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 (chan);.. /*
106d0 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 Get certificate
106e0 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 for peer or self
106f0 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
10700 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d == 2) {..peer =
10710 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 SSL_get_peer_ce
10720 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 rtificate(stateP
10730 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 tr->ssl);. }
10740 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 else {..peer = S
10750 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 SL_get_certifica
10760 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
10770 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 );. }. /*
10780 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66 69 Get X509 certifi
10790 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 cate info */.
107a0 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 if (peer) {..ob
107b0 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 jPtr = Tls_NewX5
107c0 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 09Obj(interp, pe
107d0 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d er);..if (objc =
107e0 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 = 2) {.. X509
107f0 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 _free(peer);..
10800 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 peer = NULL;..
10810 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 }. } else {..
10820 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
10830 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
10840 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
10850 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 Peer name */.
10860 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
10870 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 erp, objPtr, "pe
10880 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 ername", SSL_get
10890 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 0_peername(state
108a0 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a Ptr->ssl), -1);.
108b0 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 LAPPEND_INT(
108c0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
108d0 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 "sbits", SSL_get
108e0 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 _cipher_bits(sta
108f0 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c tePtr->ssl, NULL
10900 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 ));.. ciphers
10910 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 = (char*)SSL_ge
10920 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 t_cipher(statePt
10930 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 r->ssl);. LAP
10940 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
10950 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 objPtr, "cipher
10960 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b ", ciphers, -1);
10970 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 .. /* Verify
10980 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69 the X509 certifi
10990 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 cate presented b
109a0 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 y the peer */.
109b0 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
109c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 terp, objPtr, "v
109d0 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 erifyResult",..X
109e0 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 509_verify_cert_
109f0 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c error_string(SSL
10a00 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 _get_verify_resu
10a10 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c lt(statePtr->ssl
10a20 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a )), -1);.. /*
10a30 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a Verify mode */.
10a40 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 mode = SSL_g
10a50 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 et_verify_mode(s
10a60 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
10a70 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53 if (mode && S
10a80 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 SL_VERIFY_NONE)
10a90 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 {..LAPPEND_STR(i
10aa0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10ab0 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f verifyMode", "no
10ac0 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 ne", -1);. }
10ad0 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 else {..Tcl_Obj
10ae0 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 *listObjPtr = Tc
10af0 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
10b00 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 NULL);..if (mode
10b10 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 && SSL_VERIFY_P
10b20 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f EER) {.. Tcl_
10b30 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10b40 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
10b50 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
10b60 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 StringObj("peer"
10b70 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
10b80 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
10b90 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
10ba0 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 ER_CERT) {..
10bb0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
10bc0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
10bd0 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c listObjPtr, Tcl
10be0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 _NewStringObj("f
10bf0 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 ail if no peer c
10c00 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ert", -1));..}..
10c10 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f if (mode && SSL_
10c20 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e VERIFY_CLIENT_ON
10c30 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c CE) {.. Tcl_L
10c40 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10c50 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
10c60 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ObjPtr, Tcl_NewS
10c70 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 tringObj("client
10c80 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d once", -1));..}
10c90 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 ..if (mode && SS
10ca0 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 L_VERIFY_POST_HA
10cb0 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 NDSHAKE) {..
10cc0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
10cd0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
10ce0 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c listObjPtr, Tcl
10cf0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 _NewStringObj("p
10d00 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 ost handshake",
10d10 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e -1));..}..LAPPEN
10d20 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 D_OBJ(interp, ob
10d30 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 jPtr, "verifyMod
10d40 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a e", listObjPtr).
10d50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 }.. /* Ve
10d60 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 rify mode depth
10d70 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 */. LAPPEND_I
10d80 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
10d90 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68 22 r, "verifyDepth"
10da0 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 , SSL_get_verify
10db0 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72 2d _depth(statePtr-
10dc0 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 >ssl));.. /*
10dd0 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 Report the selec
10de0 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 ted protocol as
10df0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 a result of the
10e00 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 negotiation */.
10e10 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e SSL_get0_alpn
10e20 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 _selected(stateP
10e30 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c tr->ssl, &proto,
10e40 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 &len);. LAPP
10e50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10e60 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 objPtr, "alpn",
10e70 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 (char *)proto, (
10e80 69 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c int) len);. L
10e90 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
10ea0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 p, objPtr, "prot
10eb0 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 ocol", SSL_get_v
10ec0 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d ersion(statePtr-
10ed0 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 >ssl), -1);..
10ee0 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f /* Valid for no
10ef0 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 n-RSA signature
10f00 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 and TLS 1.3 */.
10f10 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 if (objc == 2
10f20 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 ) {..res = SSL_g
10f30 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 et_peer_signatur
10f40 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
10f50 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
10f60 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
10f70 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 SSL_get_signatur
10f80 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
10f90 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
10fa0 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 }. if (!res)
10fb0 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c {nid = 0;}. L
10fc0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
10fd0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e p, objPtr, "sign
10fe0 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 atureHashAlgorit
10ff0 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 hm", OBJ_nid2ln(
11000 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 nid), -1);..
11010 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b if (objc == 2) {
11020 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
11030 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 peer_signature_t
11040 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 ype_nid(statePtr
11050 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 ->ssl, &nid);.
11060 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 } else {..res
11070 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 = SSL_get_signat
11080 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 ure_type_nid(sta
11090 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
110a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 );. }. if
110b0 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b (!res) {nid = 0;
110c0 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 }. LAPPEND_ST
110d0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
110e0 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79 70 65 , "signatureType
110f0 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 ", OBJ_nid2ln(ni
11100 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 d), -1);.. Tc
11110 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
11120 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
11130 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
11140 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d K;..clientData =
11150 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c clientData;.}..
11160 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
11170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
111a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
111b0 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 ConnectionInfoOb
111c0 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 jCmd -- return c
111d0 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 onnection info f
111e0 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a rom OpenSSL.. *.
111f0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
11200 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 list of connect
11210 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d ion info. *. *-
11220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11260 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 --. */..static i
11270 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 nt ConnectionInf
11280 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 oObjCmd(ClientDa
11290 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
112a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
112b0 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
112c0 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
112d0 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
112e0 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 annel chan;../*
112f0 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
11300 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a et a mode on */.
11310 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
11320 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 Ptr;../* client
11330 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f state for ssl so
11340 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f cket */. Tcl_
11350 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 Obj *objPtr, *li
11360 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 stPtr;. const
11370 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 SSL *ssl;. c
11380 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 onst SSL_CIPHER
11390 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e *cipher;. con
113a0 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a st SSL_SESSION *
113b0 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e session;. con
113c0 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a 0a st EVP_MD *md;..
113d0 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 if (objc !=
113e0 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
113f0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
11400 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c , objv, "channel
11410 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f ");..return(TCL_
11420 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 ERROR);. }..
11430 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
11440 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
11450 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
11460 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e omObj(objv[1], N
11470 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 ULL), NULL);.
11480 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
11490 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
114a0 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 {..return(TCL_E
114b0 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 RROR);. }..
114c0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 /* Make sure t
114d0 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
114e0 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
114f0 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 */. chan = T
11500 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
11510 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 (chan);. if (
11520 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
11530 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
11540 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
11550 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
11560 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 lt(interp, "bad
11570 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c channel \"", Tcl
11580 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
11590 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a chan),.. "\":
115a0 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
115b0 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c el", NULL);..Tcl
115c0 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
115d0 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f terp, "TLS", "CO
115e0 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e NNECTION", "CHAN
115f0 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
11600 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
11610 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
11620 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
11630 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
11640 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
11650 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 ;.. /* Connec
11660 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 tion info */.
11670 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
11680 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
11690 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
116a0 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d chan);. ssl =
116b0 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a statePtr->ssl;.
116c0 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e if (ssl != N
116d0 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 ULL) {../* conne
116e0 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 ction state */..
116f0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11700 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 rp, objPtr, "sta
11710 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 te", SSL_state_s
11720 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c tring_long(ssl),
11730 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 -1);.../* Get S
11740 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72 NI requested ser
11750 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 ver name */..LAP
11760 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11770 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 objPtr, "server
11780 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 name", SSL_get_s
11790 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 ervername(ssl, T
117a0 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 LSEXT_NAMETYPE_h
117b0 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a ost_name), -1);.
117c0 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f ../* Get protoco
117d0 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 l */..LAPPEND_ST
117e0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
117f0 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 , "protocol", SS
11800 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 L_get_version(ss
11810 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 l), -1);.../* Re
11820 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f negotiation allo
11830 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f wed */..LAPPEND_
11840 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
11850 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 Ptr, "renegotiat
11860 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 ion_allowed", SS
11870 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e L_get_secure_ren
11880 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f egotiation_suppo
11890 72 74 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 rt(ssl));.../* G
118a0 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 et security leve
118b0 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e l */..LAPPEND_IN
118c0 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
118d0 2c 20 22 73 65 63 75 72 69 74 79 6c 65 76 65 6c , "securitylevel
118e0 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 ", SSL_get_secur
118f0 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b ity_level(ssl));
11900 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e .../* Session in
11910 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 fo */..LAPPEND_B
11920 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
11930 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 tr, "session_reu
11940 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f sed", SSL_sessio
11950 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b 0a n_reused(ssl));.
11960 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69 ../* Is server i
11970 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f nfo */..LAPPEND_
11980 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
11990 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 22 Ptr, "is_server"
119a0 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 , SSL_is_server(
119b0 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 ssl));.../* Is D
119c0 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f TLS */..LAPPEND_
119d0 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
119e0 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 Ptr, "is_dtls",
119f0 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 SSL_is_dtls(ssl)
11a00 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
11a10 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a Cipher info */.
11a20 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c cipher = SSL
11a30 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 _get_current_cip
11a40 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 her(ssl);. if
11a50 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c (cipher != NULL
11a60 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 ) {..char buf[BU
11a70 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e FSIZ] = {0};..in
11a80 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 t bits, alg_bits
11a90 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e 61 ;.../* Cipher na
11aa0 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 me */..LAPPEND_S
11ab0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11ac0 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 4c r, "cipher", SSL
11ad0 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 _CIPHER_get_name
11ae0 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a (cipher), -1);..
11af0 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 ./* RFC name of
11b00 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 cipher */..LAPPE
11b10 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11b20 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 64 bjPtr, "standard
11b30 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48 _name", SSL_CIPH
11b40 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 ER_standard_name
11b50 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a (cipher), -1);..
11b60 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 ./* OpenSSL name
11b70 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c of cipher */..L
11b80 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11b90 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e p, objPtr, "open
11ba0 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 ssl_name", OPENS
11bb0 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 53 SL_cipher_name(S
11bc0 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 SL_CIPHER_standa
11bd0 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 29 rd_name(cipher))
11be0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 , -1);.../* numb
11bf0 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 74 er of secret bit
11c00 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 65 s used for ciphe
11c10 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c r */..bits = SSL
11c20 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 _CIPHER_get_bits
11c30 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 (cipher, &alg_bi
11c40 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e ts);..LAPPEND_IN
11c50 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
11c60 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c , "secret_bits",
11c70 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 bits);..LAPPEND
11c80 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
11c90 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f Ptr, "algorithm_
11ca0 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 29 bits", alg_bits)
11cb0 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 ;../* alg_bits i
11cc0 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 s actual key sec
11cd0 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 ret bits. If use
11ce0 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 bits and secret
11cf0 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 (algorithm) bit
11d00 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68 s differ,.. th
11d10 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 e rest of the bi
11d20 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e ts are fixed, i.
11d30 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 e. for limited e
11d40 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 xport ciphers (b
11d50 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f its < 56) */.../
11d60 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 63 * Indicates whic
11d70 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 h SSL/TLS protoc
11d80 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 74 ol version first
11d90 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 70 defined the cip
11da0 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
11db0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11dc0 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e tr, "min_version
11dd0 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ", SSL_CIPHER_ge
11de0 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 t_version(cipher
11df0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 ), -1);.../* Cip
11e00 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 her NID */..LAPP
11e10 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11e20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e objPtr, "cipherN
11e30 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a ID", (char *)OBJ
11e40 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 _nid2ln(SSL_CIPH
11e50 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 ER_get_cipher_ni
11e60 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b d(cipher)), -1);
11e70 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
11e80 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 terp, objPtr, "d
11e90 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72 igestNID", (char
11ea0 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 *)OBJ_nid2ln(SS
11eb0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67 L_CIPHER_get_dig
11ec0 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29 est_nid(cipher))
11ed0 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f , -1);..LAPPEND_
11ee0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11ef0 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65 tr, "keyExchange
11f00 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 NID", (char *)OB
11f10 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 J_nid2ln(SSL_CIP
11f20 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 HER_get_kx_nid(c
11f30 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c ipher)), -1);..L
11f40 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11f50 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 p, objPtr, "auth
11f60 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 enticationNID",
11f70 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 (char *)OBJ_nid2
11f80 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ln(SSL_CIPHER_ge
11f90 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65 t_auth_nid(ciphe
11fa0 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d r)), -1);.../* m
11fb0 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 essage authentic
11fc0 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 ation code - Cip
11fd0 68 65 72 20 69 73 20 41 45 41 44 20 28 65 2e 67 her is AEAD (e.g
11fe0 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32 . GCM or ChaCha2
11ff0 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 0/Poly1305) or n
12000 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e ot */../* Authen
12010 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 69 ticated Encrypti
12020 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 74 on with associat
12030 65 64 20 64 61 74 61 20 28 41 45 41 44 29 20 63 ed data (AEAD) c
12040 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 heck */..LAPPEND
12050 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
12060 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73 jPtr, "cipher_is
12070 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 _aead", SSL_CIPH
12080 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65 ER_is_aead(ciphe
12090 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 74 r));.../* Digest
120a0 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 65 used during the
120b0 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61 SSL/TLS handsha
120c0 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 ke when using th
120d0 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 e cipher. */..md
120e0 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 = SSL_CIPHER_ge
120f0 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 t_handshake_dige
12100 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 50 st(cipher);..LAP
12110 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
12120 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 68 objPtr, "handsh
12130 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63 68 ake_digest", (ch
12140 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 ar *)EVP_MD_name
12150 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 (md), -1);.../*
12160 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 Get OpenSSL-spec
12170 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e ific ID, not IAN
12180 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 A ID */..LAPPEND
12190 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
121a0 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 22 Ptr, "cipher_id"
121b0 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 , (int) SSL_CIPH
121c0 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 ER_get_id(cipher
121d0 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 ));.../* Two-byt
121e0 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 65 e ID used in the
121f0 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 TLS protocol of
12200 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 65 the given ciphe
12210 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e r */..LAPPEND_IN
12220 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
12230 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c , "protocol_id",
12240 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 (int) SSL_CIPHE
12250 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 R_get_protocol_i
12260 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a d(cipher));.../*
12270 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 Textual descrip
12280 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 tion of the ciph
12290 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 er */..if (SSL_C
122a0 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f IPHER_descriptio
122b0 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 n(cipher, buf, s
122c0 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e izeof(buf)) != N
122d0 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 ULL) {.. LAPP
122e0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
122f0 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 70 objPtr, "descrip
12300 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b tion", buf, -1);
12310 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
12320 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a * Session info *
12330 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 /. session =
12340 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_get_session(
12350 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65 ssl);. if (se
12360 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b ssion != NULL) {
12370 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
12380 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 char *ticket;..
12390 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e size_t len2;..un
123a0 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b signed int ulen;
123b0 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
123c0 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
123d0 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 63 68 61 72 d, *proto;..char
123e0 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f buffer[SSL_MAX_
123f0 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 MASTER_KEY_LENGT
12400 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 H];.../* Report
12410 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f the selected pro
12420 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c tocol as a resul
12430 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 t of the ALPN ne
12440 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 gotiation */..SS
12450 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 L_SESSION_get0_a
12460 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 lpn_selected(ses
12470 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c sion, &proto, &l
12480 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 en2);..LAPPEND_S
12490 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
124a0 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 r, "alpn", (char
124b0 20 2a 29 20 70 72 6f 74 6f 2c 20 28 69 6e 74 29 *) proto, (int)
124c0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 len2);.../* Rep
124d0 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 ort the selected
124e0 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 protocol as a r
124f0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e esult of the NPN
12500 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a negotiation */.
12510 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 #ifdef USE_NPN..
12520 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 SSL_get0_next_pr
12530 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 oto_negotiated(s
12540 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 sl, &proto, &ule
12550 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 n);..LAPPEND_STR
12560 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12570 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 "npn", (char *)
12580 20 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 75 6c proto, (int) ul
12590 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a en);.#endif.../*
125a0 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 Resumable sessi
125b0 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 on */..LAPPEND_B
125c0 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
125d0 74 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c tr, "resumable",
125e0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f SSL_SESSION_is_
125f0 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f resumable(sessio
12600 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f n));.../* Sessio
12610 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 n start time (se
12620 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 conds since epoc
12630 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c h) */..LAPPEND_L
12640 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ONG(interp, objP
12650 74 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 tr, "start_time"
12660 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 , SSL_SESSION_ge
12670 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 t_time(session))
12680 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 ;.../* Timeout v
12690 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 alue - SSL_CTX_g
126a0 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 et_timeout (in s
126b0 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 econds) */..LAPP
126c0 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c END_LONG(interp,
126d0 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 objPtr, "timeou
126e0 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f t", SSL_SESSION_
126f0 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 get_timeout(sess
12700 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 ion));.../* Sess
12710 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 ion id - TLSv1.2
12720 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 and below only
12730 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d */..session_id =
12740 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
12750 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c _id(session, &ul
12760 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 en);..LAPPEND_BA
12770 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a RRAY(interp, obj
12780 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 Ptr, "session_id
12790 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 ", session_id, (
127a0 69 6e 74 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a int) ulen);.../*
127b0 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 Session context
127c0 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 */..session_id
127d0 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
127e0 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 t0_id_context(se
127f0 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 ssion, &ulen);..
12800 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 LAPPEND_BARRAY(i
12810 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12820 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 session_context"
12830 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 , session_id, (i
12840 6e 74 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 nt) ulen);.../*
12850 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d Session ticket -
12860 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a client only */.
12870 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 .SSL_SESSION_get
12880 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 0_ticket(session
12890 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 , &ticket, &len2
128a0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
128b0 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
128c0 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b r, "session_tick
128d0 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 69 6e et", ticket, (in
128e0 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 t) len2);.../* S
128f0 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 ession ticket li
12900 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 fetime hint (in
12910 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 seconds) */..LAP
12920 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 PEND_LONG(interp
12930 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 , objPtr, "lifet
12940 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f ime", SSL_SESSIO
12950 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 N_get_ticket_lif
12960 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 etime_hint(sessi
12970 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 on));.../* Ticke
12980 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 09 53 t app data */..S
12990 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
129a0 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 73 ticket_appdata(s
129b0 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c ession, &ticket,
129c0 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e &len2);..LAPPEN
129d0 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
129e0 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 objPtr, "ticket
129f0 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b _app_data", tick
12a00 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 3b et, (int) len2);
12a10 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 .../* Get master
12a20 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 key */..len2 =
12a30 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
12a40 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 master_key(sessi
12a50 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f on, buffer, SSL_
12a60 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c MAX_MASTER_KEY_L
12a70 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 ENGTH);..LAPPEND
12a80 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
12a90 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f objPtr, "master_
12aa0 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20 28 69 key", buffer, (i
12ab0 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 nt) len2);.../*
12ac0 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a Compression id *
12ad0 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 /..unsigned int
12ae0 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e id = SSL_SESSION
12af0 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 _get_compress_id
12b00 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 (session);..LAPP
12b10 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12b20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 objPtr, "compres
12b30 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 sion_id", id ==
12b40 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 1 ? "zlib" : "no
12b50 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a ne", -1);. }.
12b60 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 . /* Compress
12b70 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ion info */.
12b80 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 if (ssl != NULL)
12b90 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 {.#ifdef HAVE_S
12ba0 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 SL_COMPRESSION..
12bb0 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f const COMP_METHO
12bc0 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a D *comp, *expn;.
12bd0 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f .comp = SSL_get_
12be0 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 current_compress
12bf0 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 ion(ssl);..expn
12c00 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e = SSL_get_curren
12c10 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 t_expansion(ssl)
12c20 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 ;...LAPPEND_STR(
12c30 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12c40 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 "compression", c
12c50 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 omp ? SSL_COMP_g
12c60 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 et_name(comp) :
12c70 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 "none", -1);..LA
12c80 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12c90 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e , objPtr, "expan
12ca0 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 sion", expn ? SS
12cb0 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 L_COMP_get_name(
12cc0 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 expn) : "none",
12cd0 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 -1);.#else..LAPP
12ce0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12cf0 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 objPtr, "compres
12d00 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d sion", "none", -
12d10 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 1);..LAPPEND_STR
12d20 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12d30 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e "expansion", "n
12d40 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 one", -1);.#endi
12d50 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 f. }.. /*
12d60 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 Server info */.
12d70 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 {..long mode
12d80 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 = SSL_CTX_get_se
12d90 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 ssion_cache_mode
12da0 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b (statePtr->ctx);
12db0 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 ..char *msg;...i
12dc0 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 f (mode & SSL_SE
12dd0 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a SS_CACHE_OFF) {.
12de0 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 . msg = "off"
12df0 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f ;..} else if (mo
12e00 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
12e10 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 CHE_CLIENT) {..
12e20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 msg = "client
12e30 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d ";..} else if (m
12e40 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 ode & SSL_SESS_C
12e50 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 ACHE_SERVER) {..
12e60 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 msg = "serve
12e70 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 r";..} else if (
12e80 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
12e90 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 CACHE_BOTH) {..
12ea0 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b msg = "both";
12eb0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
12ec0 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b msg = "unknown";
12ed0 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 ..}..LAPPEND_STR
12ee0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12ef0 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f "session_cache_
12f00 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b mode", msg, -1);
12f10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
12f20 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a A List */. /*
12f30 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 IF not a server
12f40 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 , same as SSL_ge
12f50 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e t0_peer_CA_list.
12f60 20 49 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 If server same
12f70 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 as SSL_CTX_get_c
12f80 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f lient_CA_list */
12f90 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 . listPtr = T
12fa0 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
12fb0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 NULL);. STAC
12fc0 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 K_OF(X509_NAME)
12fd0 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 *ca_list;. if
12fe0 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c ((ca_list = SSL
12ff0 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c _get_client_CA_l
13000 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c ist(ssl)) != NUL
13010 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 L) {..char buffe
13020 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 r[BUFSIZ];..for
13030 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 (int i = 0; i <
13040 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d sk_X509_NAME_num
13050 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 (ca_list); i++)
13060 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 {.. X509_NAME
13070 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 *name = sk_X509
13080 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c _NAME_value(ca_l
13090 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 ist, i);.. if
130a0 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 (name) {...X509
130b0 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 _NAME_oneline(na
130c0 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 me, buffer, BUFS
130d0 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f IZ);...Tcl_ListO
130e0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
130f0 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c interp, listPtr,
13100 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
13110 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a j(buffer, -1));.
13120 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a . }..}. }.
13130 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 LAPPEND_OBJ(
13140 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
13150 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 "caList", listPt
13160 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f r);. LAPPEND_
13170 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
13180 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 tr, "caListCount
13190 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f ", sk_X509_NAME_
131a0 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a num(ca_list));..
131b0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
131c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
131d0 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
131e0 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
131f0 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
13200 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
13210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
13250 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a *. * VersionObj
13260 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 Cmd -- return ve
13270 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f rsion string fro
13280 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a m OpenSSL.. *. *
13290 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
132a0 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
132b0 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
132c0 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
132d0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
132e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
132f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13310 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
13320 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e atic int.Version
13330 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
13340 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
13350 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
13360 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
13370 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
13380 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ]) {. Tcl_Obj
13390 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 *objPtr;.. d
133a0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
133b0 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 ;.. objPtr =
133c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
133d0 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e (OPENSSL_VERSION
133e0 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 _TEXT, -1);.
133f0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
13400 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
13410 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
13420 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 L_OK;..clientDat
13430 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a a = clientData;.
13440 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f .objc = objc;..o
13450 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a bjv = objv;.}...
13460 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
13470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
134a0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d --------. *. * M
134b0 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 iscObjCmd -- mis
134c0 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a c commands. *. *
134d0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
134e0 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
134f0 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
13500 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
13510 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
13520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13550 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
13560 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a atic int.MiscObj
13570 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
13580 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
13590 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
135a0 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
135b0 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
135c0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e {. static con
135d0 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 st char *command
135e0 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 s [] = { "req",
135f0 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d "strreq", NULL }
13600 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 ;. enum comma
13610 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 nd { C_REQ, C_ST
13620 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b RREQ, C_DUMMY };
13630 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 73 . int cmd, is
13640 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 Str;. char bu
13650 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 ffer[16384];..
13660 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
13670 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
13680 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 jc < 2) {..Tcl_W
13690 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
136a0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 rp, 1, objv, "su
136b0 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 bcommand ?args?"
136c0 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
136d0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
136e0 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
136f0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
13700 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 objv[1], command
13710 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c s, "command", 0,
13720 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b &cmd) != TCL_OK
13730 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
13740 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
13750 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
13760 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 r();.. isStr
13770 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 = (cmd == C_STRR
13780 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 EQ);. switch
13790 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 ((enum command)
137a0 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 cmd) {..case C_R
137b0 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 EQ:..case C_STRR
137c0 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 EQ: {.. EVP_P
137d0 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a KEY *pkey=NULL;.
137e0 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d . X509 *cert=
137f0 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f NULL;.. X509_
13800 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b NAME *name=NULL;
13810 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a .. Tcl_Obj **
13820 6c 69 73 74 76 3b 0a 09 20 20 20 20 69 6e 74 20 listv;.. int
13830 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 listc,i;... B
13840 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 IO *out=NULL;...
13850 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 char *k_C=""
13860 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 ,*k_ST="",*k_L="
13870 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d ",*k_O="",*k_OU=
13880 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 "",*k_CN="",*k_E
13890 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 mail="";.. ch
138a0 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f ar *keyout,*pemo
138b0 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e ut,*str;.. in
138c0 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c t keysize,serial
138d0 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 =0,days=365;..#i
138e0 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
138f0 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
13900 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 00000L.. BIGN
13910 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a UM *bne = NULL;.
13920 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 . RSA *rsa =
13930 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 NULL;.#else..
13940 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 EVP_PKEY_CTX *c
13950 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 tx = NULL;.#endi
13960 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a f... if ((obj
13970 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 c<5) || (objc>6)
13980 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e ) {...Tcl_WrongN
13990 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 umArgs(interp, 2
139a0 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 , objv, "keysize
139b0 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c keyfile certfil
139c0 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 e ?info?");...re
139d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
139e0 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
139f0 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
13a00 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
13a10 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 2], &keysize) !=
13a20 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 TCL_OK) {...ret
13a30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
13a40 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 }.. keyou
13a50 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 t=Tcl_GetString(
13a60 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 objv[3]);.. p
13a70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 emout=Tcl_GetStr
13a80 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 ing(objv[4]);..
13a90 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a if (isStr) {.
13aa0 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 ..Tcl_SetVar(int
13ab0 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 erp,keyout,"",0)
13ac0 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 ;...Tcl_SetVar(i
13ad0 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c nterp,pemout,"",
13ae0 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 0);.. }...
13af0 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a if (objc>=6) {.
13b00 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 ..if (Tcl_ListOb
13b10 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 jGetElements(int
13b20 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 erp, objv[5],...
13b30 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 .&listc, &listv)
13b40 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 != TCL_OK) {...
13b50 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
13b60 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 RROR;...}....if
13b70 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 ((listc%2) != 0)
13b80 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 {... Tcl_Set
13b90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 Result(interp,"I
13ba0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 nformation list
13bb0 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e must have even n
13bc0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e umber of argumen
13bd0 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 ts",NULL);...
13be0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
13bf0 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d R;...}...for (i=
13c00 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 0; i<listc; i+=2
13c10 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 ) {... str=Tc
13c20 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
13c30 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 v[i]);... if
13c40 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 (strcmp(str,"day
13c50 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 s")==0) {....if
13c60 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
13c70 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b bj(interp,listv[
13c80 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c i+1],&days)!=TCL
13c90 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 _OK).... retu
13ca0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
13cb0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
13cc0 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 trcmp(str,"seria
13cd0 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 l")==0) {....if
13ce0 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
13cf0 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b bj(interp,listv[
13d00 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 i+1],&serial)!=T
13d10 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 CL_OK).... re
13d20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13d30 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
13d40 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 (strcmp(str,"C")
13d50 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 ==0) {....k_C=Tc
13d60 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
13d70 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
13d80 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
13d90 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b (str,"ST")==0) {
13da0 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 ....k_ST=Tcl_Get
13db0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
13dc0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
13dd0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
13de0 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "L")==0) {....k_
13df0 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 L=Tcl_GetString(
13e00 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
13e10 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
13e20 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 rcmp(str,"O")==0
13e30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 ) {....k_O=Tcl_G
13e40 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
13e50 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
13e60 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
13e70 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 r,"OU")==0) {...
13e80 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 .k_OU=Tcl_GetStr
13e90 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
13ea0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
13eb0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e (strcmp(str,"CN
13ec0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e ")==0) {....k_CN
13ed0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
13ee0 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
13ef0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
13f00 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 cmp(str,"Email")
13f10 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 ==0) {....k_Emai
13f20 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 l=Tcl_GetString(
13f30 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
13f40 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 } else {....T
13f50 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
13f60 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 erp,"Unknown par
13f70 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 ameter",NULL);..
13f80 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
13f90 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a OR;... }...}.
13fa0 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e . }..#if OPEN
13fb0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
13fc0 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
13fd0 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e .. bne = BN_n
13fe0 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d ew();.. rsa =
13ff0 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 RSA_new();..
14000 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 pkey = EVP_PKEY
14010 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 _new();.. if
14020 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 (bne == NULL ||
14030 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 rsa == NULL || p
14040 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 key == NULL || !
14050 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c BN_set_word(bne,
14060 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 RSA_F4) ||...!RS
14070 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 A_generate_key_e
14080 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 x(rsa, keysize,
14090 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 bne, NULL) || !E
140a0 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 VP_PKEY_assign_R
140b0 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b SA(pkey, rsa)) {
140c0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
140d0 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 (pkey);.../* RSA
140e0 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 _free(rsa); free
140f0 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 d by EVP_PKEY_fr
14100 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 ee */...BN_free(
14110 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 bne);.#else..
14120 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f pkey = EVP_RSA_
14130 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e gen((unsigned in
14140 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 t) keysize);..
14150 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 ctx = EVP_PKEY
14160 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 _CTX_new(pkey,NU
14170 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b LL);.. if (pk
14180 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 ey == NULL || ct
14190 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 x == NULL || !EV
141a0 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e P_PKEY_keygen_in
141b0 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 it(ctx) ||...!EV
141c0 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 P_PKEY_CTX_set_r
141d0 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 sa_keygen_bits(c
141e0 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 tx, keysize) ||
141f0 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e !EVP_PKEY_keygen
14200 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a (ctx, &pkey)) {.
14210 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 ..EVP_PKEY_free(
14220 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 pkey);...EVP_PKE
14230 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b Y_CTX_free(ctx);
14240 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 .#endif...Tcl_Se
14250 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
14260 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 Error generating
14270 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 private key",NU
14280 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 LL);...return TC
14290 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 L_ERROR;.. }
142a0 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 else {...if (isS
142b0 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d tr) {... out=
142c0 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 BIO_new(BIO_s_me
142d0 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f m());... PEM_
142e0 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 write_bio_Privat
142f0 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 eKey(out,pkey,NU
14300 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e LL,NULL,0,NULL,N
14310 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 ULL);... i=BI
14320 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 O_read(out,buffe
14330 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 r,sizeof(buffer)
14340 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c -1);... i=(i<
14350 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 0) ? 0 : i;...
14360 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 buffer[i]='\0'
14370 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 ;... Tcl_SetV
14380 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 ar(interp,keyout
14390 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 ,buffer,0);...
143a0 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 BIO_flush(out)
143b0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 ;... BIO_free
143c0 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 (out);...} else
143d0 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f {... out=BIO_
143e0 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 new(BIO_s_file()
143f0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 );... BIO_wri
14400 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c te_filename(out,
14410 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 keyout);... P
14420 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 EM_write_bio_Pri
14430 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 vateKey(out,pkey
14440 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c ,NULL,NULL,0,NUL
14450 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f L,NULL);... /
14460 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f * PEM_write_bio_
14470 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 RSAPrivateKey(ou
14480 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 t, rsa, NULL, NU
14490 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c LL, 0, NULL, NUL
144a0 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f L); */... BIO
144b0 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a _free_all(out);.
144c0 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 . .}....if ((cer
144d0 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e t=X509_new())==N
144e0 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c ULL) {... Tcl
144f0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
14500 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 p,"Error generat
14510 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20 ing certificate
14520 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a request",NULL);.
14530 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 .. EVP_PKEY_f
14540 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
14550 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
14560 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
14570 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 00L... BN_fre
14580 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 e(bne);.#endif..
14590 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f . return(TCL_
145a0 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 ERROR);...}....X
145b0 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 509_set_version(
145c0 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f cert,2);...ASN1_
145d0 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 INTEGER_set(X509
145e0 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 _get_serialNumbe
145f0 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b r(cert),serial);
14600 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 ...X509_gmtime_a
14610 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 dj(X509_getm_not
14620 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b Before(cert),0);
14630 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 ...X509_gmtime_a
14640 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 dj(X509_getm_not
14650 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e After(cert),(lon
14660 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 g)60*60*24*days)
14670 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 ;...X509_set_pub
14680 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a key(cert,pkey);.
14690 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 ...name=X509_get
146a0 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 _subject_name(ce
146b0 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d rt);....X509_NAM
146c0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
146d0 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 xt(name,"C", MBS
146e0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
146f0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
14700 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 *) k_C, -1, -1,
14710 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
14720 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
14730 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 (name,"ST", MBST
14740 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
14750 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
14760 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 ) k_ST, -1, -1,
14770 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
14780 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
14790 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 (name,"L", MBSTR
147a0 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
147b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
147c0 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_L, -1, -1, 0)
147d0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
147e0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
147f0 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e ame,"O", MBSTRIN
14800 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
14810 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
14820 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a _O, -1, -1, 0);.
14830 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
14840 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
14850 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 e,"OU", MBSTRING
14860 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
14870 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
14880 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a OU, -1, -1, 0);.
14890 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
148a0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
148b0 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 e,"CN", MBSTRING
148c0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
148d0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
148e0 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a CN, -1, -1, 0);.
148f0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
14900 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
14910 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 e,"Email", MBSTR
14920 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
14930 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
14940 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 k_Email, -1, -1
14950 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 , 0);....X509_se
14960 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 t_subject_name(c
14970 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 ert,name);....if
14980 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 (!X509_sign(cer
14990 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 t,pkey,EVP_sha25
149a0 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 6())) {... X5
149b0 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09_free(cert);..
149c0 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 . EVP_PKEY_fr
149d0 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 ee(pkey);.#if OP
149e0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
149f0 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
14a00 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 0L... BN_free
14a10 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 (bne);.#endif...
14a20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
14a30 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
14a40 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 signing certific
14a50 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 ate",NULL);...
14a60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
14a70 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 OR;...}....if (i
14a80 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 sStr) {... ou
14a90 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
14aa0 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 mem());... PE
14ab0 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 M_write_bio_X509
14ac0 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 (out,cert);...
14ad0 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 i=BIO_read(out
14ae0 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 ,buffer,sizeof(b
14af0 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 uffer)-1);...
14b00 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 i=(i<0) ? 0 : i
14b10 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 ;... buffer[i
14b20 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 ]='\0';... Tc
14b30 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
14b40 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 pemout,buffer,0)
14b50 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 ;... BIO_flus
14b60 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 h(out);... BI
14b70 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d O_free(out);...}
14b80 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 else {... ou
14b90 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
14ba0 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 file());... B
14bb0 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d IO_write_filenam
14bc0 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 e(out,pemout);..
14bd0 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
14be0 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
14bf0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
14c00 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a e_all(out);...}.
14c10 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 ...X509_free(cer
14c20 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 t);...EVP_PKEY_f
14c30 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
14c40 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
14c50 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
14c60 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 00L...BN_free(bn
14c70 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 e);.#endif..
14c80 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 }..}..break;.
14c90 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b default:..break
14ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
14cb0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
14cc0 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
14cd0 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a ata;.}.../******
14ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
14cf0 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 /* Init
14d00 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a */./********
14d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f ************/../
14d20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
14d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d60 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
14d70 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 s_Free --. *. *.
14d80 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 This procedure c
14d90 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 leans up when a
14da0 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 SSL socket based
14db0 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 channel. *.is c
14dc0 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 losed and its re
14dd0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 ference count fa
14de0 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 lls below 1. *.
14df0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f * Results:. *.no
14e00 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
14e10 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 fects:. *.Frees
14e20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a all the state. *
14e30 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
14e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e70 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a ------. */.void.
14e80 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a 62 Tls_Free(char *b
14e90 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 lockPtr) {. S
14ea0 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
14eb0 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 (State *)blockP
14ec0 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 tr;.. dprintf
14ed0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
14ee0 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 Tls_Clean(state
14ef0 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 Ptr);. ckfree
14f00 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a (blockPtr);.}...
14f10 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
14f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14f50 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
14f60 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 ls_Clean --. *.
14f70 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
14f80 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 cleans up when
14f90 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 a SSL socket bas
14fa0 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 ed channel. *.is
14fb0 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 closed and its
14fc0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 reference count
14fd0 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 falls below 1.
14fe0 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 This should. *.b
14ff0 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f e called synchro
15000 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c nously by the Cl
15010 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 oseProc, not in
15020 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c the. *.Eventuall
15030 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a yFree callback..
15040 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
15050 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.none. *. * Sid
15060 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 e effects:. *.Fr
15070 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 ees all the stat
15080 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
15090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
150a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
150b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
150c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 ----------. */.v
150d0 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 oid Tls_Clean(St
150e0 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b ate *statePtr) {
150f0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
15100 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a lled");.. /*.
15110 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 * we're ass
15120 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 uming here that
15130 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 we're single-thr
15140 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 eaded. */.
15150 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
15160 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 timer != (Tcl_Ti
15170 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 merToken) NULL)
15180 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d {..Tcl_DeleteTim
15190 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 erHandler(stateP
151a0 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 tr->timer);..sta
151b0 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e tePtr->timer = N
151c0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
151d0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 if (statePtr->pr
151e0 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 otos) {..ckfree(
151f0 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
15200 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 );..statePtr->pr
15210 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 otos = NULL;.
15220 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
15230 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 Ptr->bio) {../*
15240 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 This will call S
15250 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 SL_shutdown. Bug
15260 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 1414045 */..dpr
15270 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 intf("BIO_free_a
15280 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 ll(%p)", statePt
15290 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 r->bio);..BIO_fr
152a0 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d ee_all(statePtr-
152b0 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 >bio);..statePtr
152c0 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->bio = NULL;.
152d0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
152e0 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 ePtr->ssl) {..dp
152f0 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 rintf("SSL_free(
15300 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e %p)", statePtr->
15310 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 ssl);..SSL_free(
15320 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
15330 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d .statePtr->ssl =
15340 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
15350 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
15360 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 tx) {..SSL_CTX_f
15370 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ree(statePtr->ct
15380 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 x);..statePtr->c
15390 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d tx = NULL;. }
153a0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
153b0 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 r->callback) {..
153c0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
153d0 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
153e0 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ack);..statePtr-
153f0 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c >callback = NULL
15400 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
15410 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
15420 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 rd) {..Tcl_DecrR
15430 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
15440 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 ->password);..st
15450 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
15460 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
15470 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
15480 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 >vcmd) {..Tcl_De
15490 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
154a0 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 Ptr->vcmd);..sta
154b0 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 tePtr->vcmd = NU
154c0 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 LL;. }.. d
154d0 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
154e0 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d g");.}.../*. *--
154f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15530 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 -. *. * Tls_Init
15540 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 --. *. *.This i
15550 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 s a package init
15560 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 ialization proce
15570 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 dure, which is c
15580 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 alled. *.by Tcl
15590 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 when this packag
155a0 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 e is to be added
155b0 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 to an interpret
155c0 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
155d0 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 s: Ssl configur
155e0 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a ed and loaded. *
155f0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
15600 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 :. *. create the
15610 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e ssl command, in
15620 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e itialize ssl con
15630 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d text. *. *------
15640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
15680 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 /.DLLEXPORT int
15690 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 Tls_Init(Tcl_Int
156a0 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 erp *interp) {.
156b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c const char tl
156c0 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d sTclInitScript[]
156d0 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 = {.#include "t
156e0 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a ls.tcl.h"..0x00.
156f0 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 };.. dpri
15700 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
15710 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 #if TCL_MAJOR_VE
15720 52 53 49 4f 4e 20 3e 20 38 0a 23 69 66 64 65 66 RSION > 8.#ifdef
15730 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 USE_TCL_STUBS.
15740 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 if (Tcl_InitS
15750 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 39 2e tubs(interp, "9.
15760 30 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 0", 0) == NULL)
15770 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
15780 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ROR;. }.#endi
15790 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b f. if (Tcl_Pk
157a0 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c gRequire(interp,
157b0 20 22 54 63 6c 22 2c 20 22 39 2e 30 2d 22 2c 20 "Tcl", "9.0-",
157c0 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 0) == NULL) {..r
157d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
157e0 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 23 69 66 . }.#else.#if
157f0 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 def USE_TCL_STUB
15800 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e S. if (Tcl_In
15810 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 itStubs(interp,
15820 22 38 2e 35 22 2c 20 30 29 20 3d 3d 20 4e 55 4c "8.5", 0) == NUL
15830 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
15840 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 _ERROR;. }.#e
15850 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c ndif. if (Tcl
15860 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 _PkgRequire(inte
15870 72 70 2c 20 22 54 63 6c 22 2c 20 22 38 2e 35 2d rp, "Tcl", "8.5-
15880 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b ", 0) == NULL) {
15890 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
158a0 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 OR;. }.#endif
158b0 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 .. if (TlsLib
158c0 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f Init(0) != TCL_O
158d0 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 K) {..Tcl_Append
158e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
158f0 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 could not initia
15900 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 lize SSL library
15910 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
15920 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
15930 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 }.. Tcl_Crea
15940 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
15950 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 erp, "tls::ciphe
15960 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 rs", CiphersObjC
15970 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
15980 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
15990 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
159a0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
159b0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
159c0 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 , "tls::connecti
159d0 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 on", ConnectionI
159e0 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 nfoObjCmd, (Clie
159f0 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
15a00 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
15a10 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
15a20 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
15a30 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 (interp, "tls::h
15a40 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 andshake", Hands
15a50 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 hakeObjCmd, (Cli
15a60 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
15a70 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
15a80 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
15a90 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
15aa0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
15ab0 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f import", ImportO
15ac0 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
15ad0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
15ae0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
15af0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
15b00 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
15b10 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 erp, "tls::unimp
15b20 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 ort", UnimportOb
15b30 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
15b40 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
15b50 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
15b60 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
15b70 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
15b80 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 rp, "tls::status
15b90 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c ", StatusObjCmd,
15ba0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
15bb0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
15bc0 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
15bd0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
15be0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
15bf0 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 tls::version", V
15c00 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 ersionObjCmd, (C
15c10 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
15c20 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
15c30 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
15c40 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
15c50 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
15c60 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a ::misc", MiscObj
15c70 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
15c80 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
15c90 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
15ca0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
15cb0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
15cc0 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f p, "tls::protoco
15cd0 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 ls", ProtocolsOb
15ce0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
15cf0 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
15d00 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
15d10 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 );.. Tcl_Crea
15d20 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
15d30 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 73 68 22 erp, "tls::hash"
15d40 2c 20 48 61 73 68 43 6d 64 2c 20 28 43 6c 69 65 , HashCmd, (Clie
15d50 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
15d60 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
15d70 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
15d80 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
15d90 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d (interp, "tls::m
15da0 64 34 22 2c 20 48 61 73 68 4d 44 34 43 6d 64 2c d4", HashMD4Cmd,
15db0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
15dc0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
15dd0 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
15de0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
15df0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
15e00 74 6c 73 3a 3a 6d 64 35 22 2c 20 48 61 73 68 4d tls::md5", HashM
15e10 44 35 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 D5Cmd, (ClientDa
15e20 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
15e30 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
15e40 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
15e50 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
15e60 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 31 22 erp, "tls::sha1"
15e70 2c 20 48 61 73 68 53 48 41 31 43 6d 64 2c 20 28 , HashSHA1Cmd, (
15e80 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
15e90 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
15ea0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
15eb0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
15ec0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
15ed0 73 3a 3a 73 68 61 32 35 36 22 2c 20 48 61 73 68 s::sha256", Hash
15ee0 53 48 41 32 35 36 43 6d 64 2c 20 28 43 6c 69 65 SHA256Cmd, (Clie
15ef0 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
15f00 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
15f10 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 NULL);.. if
15f20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f (interp) {..Tcl_
15f30 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 Eval(interp, tls
15f40 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 3b 0a TclInitScript);.
15f50 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 }.. retur
15f60 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 n Tcl_PkgProvide
15f70 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 45 (interp, PACKAGE
15f80 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 _NAME, PACKAGE_V
15f90 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 ERSION);.}../*.
15fa0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
15fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15fd0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 -------*. *. *.T
15fe0 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 ls_SafeInit --.
15ff0 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.-----------
16000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16020 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 -----*. *.Standa
16030 72 64 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 rd procedure req
16040 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e uired by 'load'.
16050 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 . *.Initializes
16060 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 this extension f
16070 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 72 70 or a safe interp
16080 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d reter.. *.------
16090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
160a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
160b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
160c0 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a *.Side effects:.
160d0 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 *..As of 'Tls_I
160e0 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c nit'. *. *.Resul
160f0 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 t:. *..A standar
16100 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 d Tcl error code
16110 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
16120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
16150 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 */.DLLEXPORT int
16160 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 Tls_SafeInit(Tc
16170 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
16180 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ) {. dprintf(
16190 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 "Called");. r
161a0 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 eturn(Tls_Init(i
161b0 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 nterp));.}../*.
161c0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
161d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
161e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
161f0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 -------*. *. *.T
16200 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a lsLibInit --. *.
16210 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.-------------
16220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16240 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 ---*. *.Initiali
16250 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 zes SSL library
16260 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 once per applica
16270 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d tion. *.--------
16280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
162a0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
162b0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
162c0 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 ..initializes SS
162d0 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 L library. *. *.
162e0 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 Result:. *..none
162f0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
16300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
16330 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 /.static int Tls
16340 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e LibInit(int unin
16350 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 itialize) {.
16360 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 static int initi
16370 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 alized = 0;.
16380 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c int status = TCL
16390 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 _OK;.#if defined
163a0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
163b0 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
163c0 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 73 69 _THREADS). si
163d0 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a ze_t num_locks;.
163e0 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 #endif.. if (
163f0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a uninitialize) {.
16400 09 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 .if (!initialize
16410 64 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 d) {.. dprint
16420 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e f("Asked to unin
16430 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 itialize, but we
16440 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c are not initial
16450 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 ized");... re
16460 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d turn(TCL_OK);..}
16470 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 ...dprintf("Aske
16480 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a d to uninitializ
16490 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 e");..#if define
164a0 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
164b0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
164c0 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f L_THREADS)..Tcl_
164d0 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f MutexLock(&init_
164e0 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 mx);...if (locks
164f0 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28 6c 6f ) {.. free(lo
16500 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 cks);.. locks
16510 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f = NULL;.. lo
16520 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d cksCount = 0;..}
16530 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c .#endif..initial
16540 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 ized = 0;..#if d
16550 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
16560 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
16570 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
16580 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b .Tcl_MutexUnlock
16590 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 (&init_mx);.#end
165a0 69 66 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f if...return(TCL_
165b0 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OK);. }..
165c0 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 if (initialized)
165d0 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c {..dprintf("Cal
165e0 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20 63 led, but using c
165f0 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a 09 ached value");..
16600 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a return(status);.
16610 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
16620 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 tf("Called");..#
16630 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
16640 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
16650 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
16660 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 DS). Tcl_Mute
16670 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b xLock(&init_mx);
16680 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 .#endif. init
16690 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 ialized = 1;..#i
166a0 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
166b0 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
166c0 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
166d0 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 S). num_locks
166e0 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 = 1;. locksC
166f0 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d ount = (int) num
16700 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b _locks;. lock
16710 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f s = malloc(sizeo
16720 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f f(*locks) * num_
16730 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 locks);. mems
16740 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a et(locks, 0, siz
16750 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 eof(*locks) * nu
16760 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 m_locks);.#endif
16770 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c .. /* Initial
16780 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 ize BOTH libcryp
16790 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a to and libssl. *
167a0 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e /. OPENSSL_in
167b0 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 it_ssl(OPENSSL_I
167c0 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 NIT_LOAD_SSL_STR
167d0 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 INGS | OPENSSL_I
167e0 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f NIT_LOAD_CRYPTO_
167f0 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 STRINGS..| OPENS
16800 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f SL_INIT_ADD_ALL_
16810 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 CIPHERS | OPENSS
16820 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 L_INIT_ADD_ALL_D
16830 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a IGESTS, NULL);..
16840 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 BIO_new_tcl(
16850 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30 NULL, 0);..#if 0
16860 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 58 . /*. * X
16870 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 XX:TODO: Remove
16880 74 68 69 73 20 63 6f 64 65 20 61 6e 64 20 72 65 this code and re
16890 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20 place it with a
168a0 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f 72 check. * for
168b0 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79 20 enough entropy
168c0 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 and do not try t
168d0 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e o create our own
168e0 0a 20 20 20 20 20 2a 20 74 65 72 72 69 62 6c 65 . * terrible
168f0 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a 2f entropy. */
16900 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 . /*. * S
16910 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e eed the random n
16920 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 umber generator
16930 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 in the SSL libra
16940 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e 67 ry,. * using
16950 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f the do/while co
16960 6e 73 74 72 75 63 74 20 62 65 63 61 75 73 65 20 nstruct because
16970 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74 65 20 of the bug note
16980 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 4f 70 in the. * Op
16990 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68 74 74 enSSL FAQ at htt
169a0 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e p://www.openssl.
169b0 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e org/support/faq.
169c0 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20 20 20 html#USER1.
169d0 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63 72 75 *. * The cru
169e0 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c 65 6d x of the problem
169f0 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72 69 73 is that Solaris
16a00 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 7 does not have
16a10 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f 72 a. * /dev/r
16a20 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72 andom or /dev/ur
16a30 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 73 6f 20 andom device so
16a40 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 68 65 72 it cannot gather
16a50 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20 65 enough. * e
16a60 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 ntropy from the
16a70 52 41 4e 44 5f 73 65 65 64 28 29 20 77 68 65 6e RAND_seed() when
16a80 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65 73 TLS initializes
16a90 20 61 6e 64 20 72 65 66 75 73 65 73 0a 20 20 20 and refuses.
16aa0 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 * to go furthe
16ab0 72 2e 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 r. Earlier versi
16ac0 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63 ons of OpenSSL c
16ad0 61 72 72 69 65 64 20 6f 6e 20 72 65 67 61 72 64 arried on regard
16ae0 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 less.. */.
16af0 20 20 73 72 61 6e 64 28 28 75 6e 73 69 67 6e 65 srand((unsigne
16b00 64 20 69 6e 74 29 20 74 69 6d 65 28 28 74 69 6d d int) time((tim
16b10 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 e_t *) NULL));.
16b20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20 do {..for (i
16b30 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b = 0; i < 16; i++
16b40 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65 65 ) {.. rnd_see
16b50 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 d[i] = 1 + (char
16b60 29 20 28 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 ) (255.0 * rand(
16b70 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 )/(RAND_MAX+1.0)
16b80 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64 );..}..RAND_seed
16b90 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f (rnd_seed, sizeo
16ba0 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20 f(rnd_seed));.
16bb0 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e 44 5f } while (RAND_
16bc0 73 74 61 74 75 73 28 29 20 21 3d 20 31 29 3b 0a status() != 1);.
16bd0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 #endif..#if defi
16be0 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
16bf0 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
16c00 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 TCL_THREADS)..Tc
16c10 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 l_MutexUnlock(&i
16c20 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a nit_mx);.#endif.
16c30 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 ..return(status)
16c40 3b 0a 7d 0a ;.}.