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 0a 20 2a 2d ADS */..../*. *-
0990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09d0: 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c --. *. * InfoCal
09e0: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 6d lback --. *. *.m
09f0: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f 6e 6e onitors SSL conn
0a00: 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 ection process.
0a10: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
0a20: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
0a30: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
0a40: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
0a50: 64 65 66 69 6e 65 64 29 0a 20 2a 2d 2d 2d 2d 2d defined). *-----
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
0aa0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 49 */.static void.I
0ab0: 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 nfoCallback(cons
0ac0: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 t SSL *ssl, int
0ad0: 77 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 20 where, int ret)
0ae0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
0af0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
0b00: 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 SSL_get_app_data
0b10: 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 ((SSL *)ssl);.
0b20: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
0b30: 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 6a r;. char *maj
0b40: 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 3b or; char *minor;
0b50: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
0b60: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
0b70: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
0b80: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
0b90: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b *)NULL)..return;
0ba0: 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 .. cmdPtr = T
0bb0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
0bc0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
0bd0: 63 6b 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 ck);..#if 0.
0be0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
0bf0: 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65 76 CB_ALERT) {..sev
0c00: 20 3d 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 = SSL_alert_typ
0c10: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 e_string_long(re
0c20: 74 29 3b 0a 09 69 66 20 28 73 74 72 63 6d 70 28 t);..if (strcmp(
0c30: 73 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d 30 sev, "fatal")==0
0c40: 29 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65 72 ) {./* Map to er
0c50: 72 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73 5f ror */.. Tls_
0c60: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 Error(statePtr,
0c70: 53 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20 30 SSL_ERROR(ssl, 0
0c80: 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 3b ));.. return;
0c90: 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 ..}. }.#endif
0ca0: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 . if (where &
0cb0: 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b SSL_CB_HANDSHAK
0cc0: 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f E_START) {..majo
0cd0: 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b r = "handshake";
0ce0: 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 ..minor = "start
0cf0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ";. } else if
0d00: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 (where & SSL_CB
0d10: 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 _HANDSHAKE_DONE)
0d20: 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e {..major = "han
0d30: 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 dshake";..minor
0d40: 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 = "done";. }
0d50: 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 72 else {..if (wher
0d60: 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 e & SSL_CB_ALERT
0d70: 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 )..major = "aler
0d80: 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 t";..else if (wh
0d90: 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e ere & SSL_ST_CON
0da0: 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 NECT).major = "c
0db0: 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 onnect";..else i
0dc0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 f (where & SSL_S
0dd0: 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 T_ACCEPT)..major
0de0: 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 6c = "accept";..el
0df0: 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 se.....major = "
0e00: 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 unknown";...if (
0e10: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 where & SSL_CB_R
0e20: 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 EAD)..minor = "r
0e30: 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 ead";..else if (
0e40: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 where & SSL_CB_W
0e50: 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 RITE)..minor = "
0e60: 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 write";..else if
0e70: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 (where & SSL_CB
0e80: 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 _LOOP)..minor =
0e90: 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 "loop";..else if
0ea0: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 (where & SSL_CB
0eb0: 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 _EXIT)..minor =
0ec0: 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 "exit";..else...
0ed0: 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f ..minor = "unkno
0ee0: 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 wn";. }..
0ef0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
0f00: 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 dElement(statePt
0f10: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 r->interp, cmdPt
0f20: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
0f30: 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 Obj("info", -1))
0f40: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
0f50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 jAppendElement(s
0f60: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
0f70: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
0f80: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 l_NewStringObj(T
0f90: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
0fa0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
0fb0: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ), -1));. Tcl
0fc0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
0fd0: 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e ement(statePtr->
0fe0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
0ff0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1000: 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 (major, -1));.
1010: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1020: 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 endElement(state
1030: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 Ptr->interp, cmd
1040: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
1050: 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 ngObj(minor, -1)
1060: 29 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 );.. if (wher
1070: 65 20 26 20 28 53 53 4c 5f 43 42 5f 4c 4f 4f 50 e & (SSL_CB_LOOP
1080: 7c 53 53 4c 5f 43 42 5f 45 58 49 54 29 29 20 7b |SSL_CB_EXIT)) {
1090: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
10a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 endElement(state
10b0: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 Ptr->interp, cmd
10c0: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
10d0: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 wStringObj(SSL_s
10e0: 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 tate_string_long
10f0: 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 (ssl), -1));.
1100: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 } else if (wher
1110: 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 e & SSL_CB_ALERT
1120: 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 ) {..const char
1130: 2a 63 70 20 3d 20 28 63 68 61 72 20 2a 29 20 53 *cp = (char *) S
1140: 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 SL_alert_desc_st
1150: 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a ring_long(ret);.
1160: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
1170: 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 endElement(state
1180: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 Ptr->interp, cmd
1190: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
11a0: 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a ngObj(cp, -1));.
11b0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
11c0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
11d0: 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d lement(statePtr-
11e0: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c >interp, cmdPtr,
11f0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
1200: 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 ingObj(SSL_state
1210: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c _string_long(ssl
1220: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 ), -1));. }.
1230: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
1240: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
1250: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a tePtr->interp);.
1260: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
1270: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
1280: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 atePtr);.. Tc
1290: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
12a0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 28 76 6f 69 mdPtr);. (voi
12b0: 64 29 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 d) Tcl_EvalObjEx
12c0: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 (statePtr->inter
12d0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 p, cmdPtr, TCL_E
12e0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 VAL_GLOBAL);.
12f0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
1300: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 t(cmdPtr);..
1310: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
1320: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
1330: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 r);. Tcl_Rele
1340: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
1350: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
1360: 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d p);.}.../*. *---
1370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b0: 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c . *. * VerifyCal
13c0: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d lback --. *. *.M
13d0: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 74 onitors SSL cert
13e0: 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 ificate validati
13f0: 6f 6e 20 70 72 6f 63 65 73 73 2e 0a 20 2a 09 54 on process.. *.T
1400: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 his is called wh
1410: 65 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 enever a certifi
1420: 63 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 cate is inspecte
1430: 64 0a 20 2a 09 6f 72 20 64 65 63 69 64 65 64 20 d. *.or decided
1440: 69 6e 76 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20 52 invalid.. *. * R
1450: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c esults:. *.A cal
1460: 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 lback bound to t
1470: 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 he socket may re
1480: 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 turn one of:. *.
1490: 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 0...- the ce
14a0: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 rtificate is dee
14b0: 6d 65 64 20 69 6e 76 61 6c 69 64 0a 20 2a 09 20 med invalid. *.
14c0: 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 72 1...- the cer
14d0: 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d tificate is deem
14e0: 65 64 20 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 ed valid. *.
14f0: 65 6d 70 74 79 20 73 74 72 69 6e 67 09 2d 20 6e empty string.- n
1500: 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 65 72 74 o change to cert
1510: 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 ificate validati
1520: 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 on. *. * Side ef
1530: 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 fects:. *.The er
1540: 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 r field of the c
1550: 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 urrently operati
1560: 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a ve State is set.
1570: 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 *. to a string
1580: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 describing the
1590: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 SSL negotiation
15a0: 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 failure reason.
15b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
1600: 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 int.VerifyCallba
1610: 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f ck(int ok, X509_
1620: 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20 STORE_CTX *ctx)
1630: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 {. Tcl_Obj *c
1640: 6d 64 50 74 72 2c 20 2a 72 65 73 75 6c 74 3b 0a mdPtr, *result;.
1650: 20 20 20 20 63 68 61 72 20 2a 65 72 72 53 74 72 char *errStr
1660: 2c 20 2a 73 74 72 69 6e 67 3b 0a 20 20 20 20 69 , *string;. i
1670: 6e 74 20 6c 65 6e 67 74 68 3b 0a 20 20 20 20 53 nt length;. S
1680: 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 SL *ssl..= (SS
1690: 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 L*)X509_STORE_CT
16a0: 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63 74 X_get_ex_data(ct
16b0: 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 x, SSL_get_ex_da
16c0: 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 ta_X509_STORE_CT
16d0: 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58 35 X_idx());. X5
16e0: 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35 30 09 *cert..= X50
16f0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 9_STORE_CTX_get_
1700: 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74 78 current_cert(ctx
1710: 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 );. State *st
1720: 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 2a atePtr.= (State*
1730: 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 )SSL_get_app_dat
1740: 61 28 73 73 6c 29 3b 0a 20 20 20 20 69 6e 74 20 a(ssl);. int
1750: 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 54 depth..= X509_ST
1760: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f ORE_CTX_get_erro
1770: 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 20 r_depth(ctx);.
1780: 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 30 int err..= X50
1790: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 9_STORE_CTX_get_
17a0: 65 72 72 6f 72 28 63 74 78 29 3b 0a 20 20 20 20 error(ctx);.
17b0: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 int code;.. d
17c0: 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 printf("Verify:
17d0: 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 %d", ok);.. i
17e0: 66 20 28 21 6f 6b 29 20 7b 0a 09 65 72 72 53 74 f (!ok) {..errSt
17f0: 72 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f r = (char*)X509_
1800: 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f verify_cert_erro
1810: 72 5f 73 74 72 69 6e 67 28 65 72 72 29 3b 0a 20 r_string(err);.
1820: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 65 72 72 } else {..err
1830: 53 74 72 20 3d 20 28 63 68 61 72 20 2a 29 30 3b Str = (char *)0;
1840: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
1850: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
1860: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 ck == (Tcl_Obj*)
1870: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 NULL) {..if (sta
1880: 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 tePtr->vflags &
1890: 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f SSL_VERIFY_FAIL_
18a0: 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 IF_NO_PEER_CERT)
18b0: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f {.. return o
18c0: 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 k;..} else {..
18d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 return 1;..}.
18e0: 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 }. cmdPtr
18f0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
1900: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
1910: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c lback);.. Tcl
1920: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1930: 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e ement(statePtr->
1940: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1950: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1960: 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b ("verify", -1));
1970: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1980: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 AppendElement(st
1990: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 atePtr->interp,
19a0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
19b0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
19c0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
19d0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
19e0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
19f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1a00: 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 ment(statePtr->i
1a10: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1a20: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 70 cl_NewIntObj(dep
1a30: 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 th));. Tcl_Li
1a40: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1a50: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 nt(statePtr->int
1a60: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 erp, cmdPtr, Tls
1a70: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 73 74 61 74 _NewX509Obj(stat
1a80: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 65 ePtr->interp, ce
1a90: 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 rt));. Tcl_Li
1aa0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1ab0: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 nt(statePtr->int
1ac0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
1ad0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b _NewIntObj(ok));
1ae0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1af0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 AppendElement(st
1b00: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 atePtr->interp,
1b10: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
1b20: 74 72 69 6e 67 4f 62 6a 28 65 72 72 53 74 72 20 tringObj(errStr
1b30: 3f 20 65 72 72 53 74 72 20 3a 20 22 22 2c 20 2d ? errStr : "", -
1b40: 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 1));.. Tcl_Pr
1b50: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
1b60: 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e ta) statePtr->in
1b70: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 terp);. Tcl_P
1b80: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
1b90: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
1ba0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 . statePtr->f
1bb0: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f lags |= TLS_TCL_
1bc0: 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 20 20 20 54 CALLBACK;.. T
1bd0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
1be0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 cmdPtr);. cod
1bf0: 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 e = Tcl_EvalObjE
1c00: 78 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 x(statePtr->inte
1c10: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f rp, cmdPtr, TCL_
1c20: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 EVAL_GLOBAL);.
1c30: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 if (code != TC
1c40: 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 49 74 20 67 L_OK) {../* It g
1c50: 6f 74 20 61 6e 20 65 72 72 6f 72 20 2d 20 72 65 ot an error - re
1c60: 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66 69 ject the certifi
1c70: 63 61 74 65 2e 09 09 2a 2f 0a 23 69 66 20 28 54 cate...*/.#if (T
1c80: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
1c90: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d == 8) && (TCL_M
1ca0: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 INOR_VERSION < 6
1cb0: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e )..Tcl_Backgroun
1cc0: 64 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d dError(statePtr-
1cd0: 3e 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a >interp);.#else.
1ce0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
1cf0: 78 63 65 70 74 69 6f 6e 28 73 74 61 74 65 50 74 xception(statePt
1d00: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 r->interp, code)
1d10: 3b 0a 23 65 6e 64 69 66 0a 09 6f 6b 20 3d 20 30 ;.#endif..ok = 0
1d20: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
1d30: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 result = Tcl_Get
1d40: 4f 62 6a 52 65 73 75 6c 74 28 73 74 61 74 65 50 ObjResult(stateP
1d50: 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 09 73 74 tr->interp);..st
1d60: 72 69 6e 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 ring = Tcl_GetSt
1d70: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75 ringFromObj(resu
1d80: 6c 74 2c 20 26 6c 65 6e 67 74 68 29 3b 0a 09 2f lt, &length);../
1d90: 2a 20 41 6e 20 65 6d 70 74 79 20 72 65 73 75 6c * An empty resul
1da0: 74 20 6c 65 61 76 65 73 20 76 65 72 69 66 69 63 t leaves verific
1db0: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e ation unchanged.
1dc0: 09 2a 2f 0a 09 69 66 20 28 73 74 72 69 6e 67 20 .*/..if (string
1dd0: 21 3d 20 4e 55 4c 4c 20 26 26 20 6c 65 6e 67 74 != NULL && lengt
1de0: 68 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 63 6f h > 0) {.. co
1df0: 64 65 20 3d 20 54 63 6c 5f 47 65 74 49 6e 74 46 de = Tcl_GetIntF
1e00: 72 6f 6d 4f 62 6a 28 73 74 61 74 65 50 74 72 2d romObj(statePtr-
1e10: 3e 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 2c >interp, result,
1e20: 20 26 6f 6b 29 3b 0a 09 20 20 20 20 69 66 20 28 &ok);.. if (
1e30: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 code != TCL_OK)
1e40: 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 {.#if (TCL_MAJOR
1e50: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 _VERSION == 8) &
1e60: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 & (TCL_MINOR_VER
1e70: 53 49 4f 4e 20 3c 20 36 29 0a 09 09 54 63 6c 5f SION < 6)...Tcl_
1e80: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 BackgroundError(
1e90: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
1ea0: 29 3b 0a 23 65 6c 73 65 0a 09 09 54 63 6c 5f 42 );.#else...Tcl_B
1eb0: 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 ackgroundExcepti
1ec0: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 on(statePtr->int
1ed0: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 erp, code);.#end
1ee0: 69 66 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20 20 if...ok = 0;..
1ef0: 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 }..}. }.
1f00: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
1f10: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 t(cmdPtr);..
1f20: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
1f30: 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c &= ~(TLS_TCL_CAL
1f40: 4c 42 41 43 4b 29 3b 0a 0a 20 20 20 20 54 63 6c LBACK);.. Tcl
1f50: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
1f60: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
1f70: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 . Tcl_Release
1f80: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
1f90: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b atePtr->interp);
1fa0: 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 3b . return(ok);
1fb0: 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 ./* By default,
1fc0: 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69 leave verificati
1fd0: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f on unchanged..*/
1fe0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
2030: 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d . * Tls_Error --
2040: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c . *. *.Calls cal
2050: 6c 62 61 63 6b 20 77 69 74 68 20 24 66 64 20 61 lback with $fd a
2060: 6e 64 20 24 6d 73 67 20 2d 20 73 6f 20 74 68 65 nd $msg - so the
2070: 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65 callback can de
2080: 63 69 64 65 0a 20 2a 09 77 68 61 74 20 74 6f 20 cide. *.what to
2090: 64 6f 20 77 69 74 68 20 65 72 72 6f 72 73 2e 0a do with errors..
20a0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
20b0: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 ts:. *.The err f
20c0: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 ield of the curr
20d0: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 ently operative
20e0: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 State is set. *.
20f0: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 to a string de
2100: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c scribing the SSL
2110: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 negotiation fai
2120: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d lure reason. *--
2130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2170: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 -. */.void.Tls_E
2180: 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 rror(State *stat
2190: 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 ePtr, char *msg)
21a0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
21b0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 cmdPtr;. int
21c0: 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e code;.. dprin
21d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
21e0: 20 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d if (msg && *m
21f0: 73 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 sg) {..Tcl_SetEr
2200: 72 6f 72 43 6f 64 65 28 73 74 61 74 65 50 74 72 rorCode(statePtr
2210: 2d 3e 69 6e 74 65 72 70 2c 20 22 53 53 4c 22 2c ->interp, "SSL",
2220: 20 6d 73 67 2c 20 28 63 68 61 72 20 2a 29 4e 55 msg, (char *)NU
2230: 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 LL);. } else
2240: 7b 0a 09 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 {..msg = Tcl_Get
2250: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
2260: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 73 l_GetObjResult(s
2270: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 tatePtr->interp)
2280: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 , NULL);. }.
2290: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 statePtr->err
22a0: 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 69 66 20 = msg;.. if
22b0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
22c0: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a ack == (Tcl_Obj*
22d0: 29 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 )NULL) {..char b
22e0: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 09 73 70 72 uf[BUFSIZ];..spr
22f0: 69 6e 74 66 28 62 75 66 2c 20 22 53 53 4c 20 63 intf(buf, "SSL c
2300: 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 3a 20 65 hannel \"%s\": e
2310: 72 72 6f 72 3a 20 25 73 22 2c 0a 09 20 20 20 20 rror: %s",..
2320: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
2330: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
2340: 66 29 2c 20 6d 73 67 29 3b 0a 09 54 63 6c 5f 53 f), msg);..Tcl_S
2350: 65 74 52 65 73 75 6c 74 28 73 74 61 74 65 50 74 etResult(statePt
2360: 72 2d 3e 69 6e 74 65 72 70 2c 20 62 75 66 2c 20 r->interp, buf,
2370: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 23 TCL_VOLATILE);.#
2380: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
2390: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
23a0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
23b0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
23c0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 73 74 61 74 groundError(stat
23d0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 23 ePtr->interp);.#
23e0: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 else..Tcl_Backgr
23f0: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 73 74 oundException(st
2400: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 atePtr->interp,
2410: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 23 65 6e 64 TCL_ERROR);.#end
2420: 69 66 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 if..return;.
2430: 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 }. cmdPtr = T
2440: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
2450: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
2460: 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 ck);.. Tcl_Li
2470: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2480: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 nt(statePtr->int
2490: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
24a0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
24b0: 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 bj("error", -1))
24c0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ;.. Tcl_ListO
24d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
24e0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
24f0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
2500: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2510: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
2520: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
2530: 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 f), -1));.. T
2540: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2550: 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 Element(statePtr
2560: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
2570: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
2580: 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 ringObj(msg, -1)
2590: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
25a0: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
25b0: 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ) statePtr->inte
25c0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 rp);. Tcl_Pre
25d0: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 serve((ClientDat
25e0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
25f0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
2600: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
2610: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c code = Tcl_Eval
2620: 4f 62 6a 45 78 28 73 74 61 74 65 50 74 72 2d 3e ObjEx(statePtr->
2630: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2640: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
2650: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 ;. if (code !
2660: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 = TCL_OK) {.#if
2670: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
2680: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
2690: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
26a0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
26b0: 75 6e 64 45 72 72 6f 72 28 73 74 61 74 65 50 74 undError(statePt
26c0: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 r->interp);.#els
26d0: 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e e..Tcl_Backgroun
26e0: 64 45 78 63 65 70 74 69 6f 6e 28 73 74 61 74 65 dException(state
26f0: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6f 64 Ptr->interp, cod
2700: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d e);.#endif. }
2710: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
2720: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
2730: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
2740: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
2750: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 ePtr);. Tcl_R
2760: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
2770: 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e ta) statePtr->in
2780: 74 65 72 70 29 3b 0a 7d 0a 0c 0a 76 6f 69 64 20 terp);.}...void
2790: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 KeyLogCallback(c
27a0: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 onst SSL *ssl, c
27b0: 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 onst char *line)
27c0: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 {. char *str
27d0: 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 = getenv(SSLKEY
27e0: 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 LOGFILE);. FI
27f0: 4c 45 20 2a 66 64 3b 0a 20 20 20 20 69 66 20 28 LE *fd;. if (
2800: 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 str) {..fd = fop
2810: 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 en(str, "a");..f
2820: 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e printf(fd, "%s\n
2830: 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 ",line);..fclose
2840: 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a (fd);. }.}...
2850: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 --------. *. * P
28a0: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 20 asswordCallback
28b0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
28c0: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 when a password
28d0: 69 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e 70 is needed to unp
28e0: 61 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d 20 ack RSA and PEM
28f0: 6b 65 79 73 2e 0a 20 2a 09 45 76 61 6c 73 20 61 keys.. *.Evals a
2900: 6e 79 20 62 6f 75 6e 64 20 70 61 73 73 77 6f 72 ny bound passwor
2910: 64 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 d script and ret
2920: 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 urns the result
2930: 61 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77 6f as. *.the passwo
2940: 72 64 20 73 74 72 69 6e 67 2e 0a 20 2a 2d 2d 2d rd string.. *---
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2990: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
29a0: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b PasswordCallback
29b0: 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 (char *buf, int
29c0: 73 69 7a 65 2c 20 69 6e 74 20 76 65 72 69 66 79 size, int verify
29d0: 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b , void *udata) {
29e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
29f0: 65 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 ePtr.= (State *)
2a00: 20 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f udata;. Tcl_
2a10: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d Interp *interp.=
2a20: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
2a30: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
2a40: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 cmdPtr;. int
2a50: 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e code;.. dprin
2a60: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
2a70: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
2a80: 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c >password == NUL
2a90: 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 L) {..if (Tcl_Ev
2aa0: 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c alEx(interp, "tl
2ab0: 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 s::password", -1
2ac0: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 , TCL_EVAL_GLOBA
2ad0: 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a L) == TCL_OK) {.
2ae0: 09 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d . char *ret =
2af0: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 (char *) Tcl_Ge
2b00: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e tStringResult(in
2b10: 74 65 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e terp);.. strn
2b20: 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 cpy(buf, ret, (s
2b30: 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 ize_t) size);..
2b40: 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 return (int)s
2b50: 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 trlen(ret);..} e
2b60: 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 lse {.. retur
2b70: 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a n -1;..}. }..
2b80: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
2b90: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
2ba0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
2bb0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
2bc0: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
2bd0: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 ) interp);. T
2be0: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
2bf0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
2c00: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 r);.. Tcl_Inc
2c10: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
2c20: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 );. code = Tc
2c30: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 l_EvalObjEx(inte
2c40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f rp, cmdPtr, TCL_
2c50: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 EVAL_GLOBAL);.
2c60: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 if (code != TC
2c70: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c L_OK) {.#if (TCL
2c80: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d _MAJOR_VERSION =
2c90: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e = 8) && (TCL_MIN
2ca0: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a OR_VERSION < 6).
2cb0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
2cc0: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 rror(interp);.#e
2cd0: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f lse..Tcl_Backgro
2ce0: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 undException(int
2cf0: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 erp, code);.#end
2d00: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c if. }. Tcl
2d10: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
2d20: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f dPtr);.. Tcl_
2d30: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
2d40: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
2d50: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d . if (code ==
2d60: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 TCL_OK) {..char
2d70: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 *ret = (char *)
2d80: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 Tcl_GetStringRe
2d90: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 sult(interp);..i
2da0: 66 20 28 73 74 72 6c 65 6e 28 72 65 74 29 20 3c f (strlen(ret) <
2db0: 20 73 69 7a 65 20 2d 20 31 29 20 7b 0a 09 20 20 size - 1) {..
2dc0: 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 strncpy(buf, r
2dd0: 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a et, (size_t) siz
2de0: 65 29 3b 0a 09 20 20 20 20 54 63 6c 5f 52 65 6c e);.. Tcl_Rel
2df0: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 ease((ClientData
2e00: 29 20 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 ) interp);..
2e10: 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72 6c return (int)strl
2e20: 65 6e 28 72 65 74 29 3b 0a 09 7d 0a 20 20 20 20 en(ret);..}.
2e30: 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 }. Tcl_Releas
2e40: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
2e50: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 nterp);. retu
2e60: 72 6e 20 2d 31 3b 0a 09 76 65 72 69 66 79 20 3d rn -1;..verify =
2e70: 20 76 65 72 69 66 79 3b 0a 7d 0a 0c 0a 2f 2a 0a verify;.}.../*.
2e80: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ec0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 -----. *. * Sess
2ed0: 69 6f 6e 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 ionCallback for
2ee0: 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a Clients --. *. *
2ef0: 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e .Called when a n
2f00: 65 77 20 73 65 73 73 69 6f 6e 20 74 69 63 6b 65 ew session ticke
2f10: 74 20 68 61 73 20 62 65 65 6e 20 72 65 63 65 69 t has been recei
2f20: 76 65 64 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a ved. In TLS 1.3.
2f30: 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20 72 *.this may be r
2f40: 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 eceived multiple
2f50: 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 68 65 times after the
2f60: 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a handshake. For.
2f70: 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73 69 *.earlier versi
2f80: 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 ons, this will b
2f90: 65 20 72 65 63 65 69 76 65 64 20 64 75 72 69 6e e received durin
2fa0: 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e g the handshake.
2fb0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
2fc0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
2fd0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
2fe0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
2ff0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 2d 2d 2d f defined). *---
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3040: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
3050: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 SessionCallback(
3060: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 const SSL *ssl,
3070: 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 SSL_SESSION *ses
3080: 73 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 sion) {. Stat
3090: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
30a0: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 tate*)SSL_get_ap
30b0: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 p_data((SSL *)ss
30c0: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 l);. Tcl_Inte
30d0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
30e0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
30f0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
3100: 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e tr;. const un
3110: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 signed char *tic
3120: 6b 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 ket;. const u
3130: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 nsigned char *se
3140: 73 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 69 6e ssion_id;. in
3150: 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 63 t len;. int c
3160: 6f 64 65 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 ode;. size_t
3170: 6c 65 6e 32 3b 0a 0a 20 20 20 20 64 70 72 69 6e len2;.. dprin
3180: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
3190: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
31a0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 >callback == (Tc
31b0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 l_Obj*)NULL)..re
31c0: 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 63 6d 64 turn 0;.. cmd
31d0: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
31e0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
31f0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 >callback);..
3200: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3210: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3220: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
3230: 77 53 74 72 69 6e 67 4f 62 6a 28 20 22 73 65 73 wStringObj( "ses
3240: 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 sion", -1));..
3250: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 /* Session id
3260: 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d */. session =
3270: 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e SSL_get_session
3280: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
3290: 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 . session_id
32a0: 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
32b0: 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 t0_id_context(se
32c0: 73 73 69 6f 6e 2c 20 26 6c 65 6e 29 3b 0a 20 20 ssion, &len);.
32d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
32e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
32f0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
3300: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 73 73 ewStringObj(sess
3310: 69 6f 6e 5f 69 64 2c 20 6c 65 6e 29 29 3b 0a 0a ion_id, len));..
3320: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 /* Session t
3330: 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c icket */. SSL
3340: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 _SESSION_get0_ti
3350: 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 cket(session, &t
3360: 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 icket, &len2);.
3370: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3380: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3390: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
33a0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 69 63 NewStringObj(tic
33b0: 6b 65 74 2c 20 28 69 6e 74 29 6c 65 6e 32 29 29 ket, (int)len2))
33c0: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 ;.. /* Lifeti
33d0: 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 me - number of s
33e0: 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 econds */. Tc
33f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3400: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3410: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c mdPtr,..Tcl_NewL
3420: 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 ongObj((long) SS
3430: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
3440: 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 cket_lifetime_hi
3450: 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a nt(session)));..
3460: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
3470: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
3480: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 terp);. Tcl_P
3490: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
34a0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
34b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
34c0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
34d0: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 code = Tcl_Ev
34e0: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 alObjEx(interp,
34f0: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c cmdPtr, TCL_EVAL
3500: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 _GLOBAL);. if
3510: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b (code != TCL_OK
3520: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ) {.#if (TCL_MAJ
3530: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
3540: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
3550: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
3560: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
3570: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
3580: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
3590: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
35a0: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 code);.#endif.
35b0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
35c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
35d0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 );.. Tcl_Rele
35e0: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
35f0: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 statePtr);.
3600: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
3610: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
3620: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a ;. return 1;.
3630: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
3680: 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 * CiphersObjCmd
3690: 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 -- list availab
36a0: 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a le ciphers. *. *
36b0: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
36c0: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 is invoked to pr
36d0: 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a ocess the "tls::
36e0: 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 ciphers" command
36f0: 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 . *.to list avai
3700: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 lable ciphers, b
3710: 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 ased upon protoc
3720: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a ol selected.. *.
3730: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
3740: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
3750: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a sult list.. *. *
3760: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
3770: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 *.constructs and
3780: 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f destroys SSL co
3790: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 ntext (CTX). *.
37a0: 2a 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 2d ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37e0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
37f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 const char *prot
3800: 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 ocols[] = {.."ss
3810: 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c l2", "ssl3", "tl
3820: 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 s1", "tls1.1", "
3830: 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 tls1.2", "tls1.3
3840: 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 ", NULL.};.enum
3850: 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 protocol {. T
3860: 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c LS_SSL2, TLS_SSL
3870: 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 3, TLS_TLS1, TLS
3880: 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 _TLS1_1, TLS_TLS
3890: 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 1_2, TLS_TLS1_3,
38a0: 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 TLS_NONE.};..st
38b0: 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 atic int.Ciphers
38c0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
38d0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
38e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
38f0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
3900: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
3910: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ]) {. Tcl_Obj
3920: 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b *objPtr = NULL;
3930: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 . SSL_CTX *ct
3940: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 x = NULL;. SS
3950: 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 L *ssl = NULL;.
3960: 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f STACK_OF(SSL_
3970: 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 CIPHER) *sk;.
3980: 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b 42 char *cp, buf[B
3990: 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 UFSIZ];. int
39a0: 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20 3d index, verbose =
39b0: 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 65 0, use_supporte
39c0: 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 d = 0;.. dpri
39d0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
39e0: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 if ((objc <
39f0: 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 2) || (objc > 4)
3a00: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
3a10: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
3a20: 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c objv, "protocol
3a30: 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 ?verbose? ?supp
3a40: 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 orted?");..retur
3a50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
3a60: 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 }. if (Tcl_G
3a70: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 etIndexFromObj(i
3a80: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 nterp, objv[1],
3a90: 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 protocols, "prot
3aa0: 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 ocol", 0, &index
3ab0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
3ac0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
3ad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
3ae0: 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 (objc > 2) && Tc
3af0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d l_GetBooleanFrom
3b00: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
3b10: 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 [2], &verbose) !
3b20: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
3b30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
3b40: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 }. if ((ob
3b50: 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 jc > 3) && Tcl_G
3b60: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a etBooleanFromObj
3b70: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d (interp, objv[3]
3b80: 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 , &use_supported
3b90: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
3ba0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
3bb0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 ;. }.. swi
3bc0: 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f tch ((enum proto
3bd0: 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 col)index) {..ca
3be0: 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 se TLS_SSL2:.#if
3bf0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
3c00: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 _NUMBER >= 0x101
3c10: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 00000L || define
3c20: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 d(NO_SSL2) || de
3c30: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
3c40: 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f _SSL2).. Tcl_
3c50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
3c60: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
3c70: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
3c80: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
3c90: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
3ca0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
3cb0: 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 .#else.. ctx
3cc0: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 = SSL_CTX_new(SS
3cd0: 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 Lv2_method()); b
3ce0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
3cf0: 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 se TLS_SSL3:.#if
3d00: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 defined(NO_SSL3
3d10: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
3d20: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c NSSL_NO_SSL3) ||
3d30: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
3d40: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 _NO_SSL3_METHOD)
3d50: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
3d60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
3d70: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
3d80: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
3d90: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
3da0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
3db0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
3dc0: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f .. ctx = SSL_
3dd0: 43 54 58 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65 CTX_new(SSLv3_me
3de0: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a thod()); break;.
3df0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 #endif..case TLS
3e00: 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e _TLS1:.#if defin
3e10: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 ed(NO_TLS1) || d
3e20: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
3e30: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e O_TLS1) || defin
3e40: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
3e50: 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 S1_METHOD)..
3e60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
3e70: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
3e80: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
3e90: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
3ea0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
3eb0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
3ec0: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
3ed0: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
3ee0: 77 28 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 w(TLSv1_method()
3ef0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
3f00: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f ..case TLS_TLS1_
3f10: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 1:.#if defined(N
3f20: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 O_TLS1_1) || def
3f30: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
3f40: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
3f50: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
3f60: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 S1_1_METHOD)..
3f70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
3f80: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f lt(interp, proto
3f90: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 cols[index], ":
3fa0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
3fb0: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
3fc0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
3fd0: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
3fe0: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ctx = SSL_CTX_
3ff0: 6e 65 77 28 54 4c 53 76 31 5f 31 5f 6d 65 74 68 new(TLSv1_1_meth
4000: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 od()); break;.#e
4010: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
4020: 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e LS1_2:.#if defin
4030: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c ed(NO_TLS1_2) ||
4040: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
4050: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 _NO_TLS1_2) || d
4060: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
4070: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 O_TLS1_2_METHOD)
4080: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
4090: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
40a0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
40b0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
40c0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
40d0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
40e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
40f0: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f .. ctx = SSL_
4100: 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 32 5f CTX_new(TLSv1_2_
4110: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b method()); break
4120: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 ;.#endif..case T
4130: 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 LS_TLS1_3:.#if d
4140: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
4150: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
4160: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
4170: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
4180: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
4190: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
41a0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
41b0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
41c0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
41d0: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
41e0: 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 . ctx = SSL_C
41f0: 54 58 5f 6e 65 77 28 54 4c 53 5f 6d 65 74 68 6f TX_new(TLS_metho
4200: 64 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 d());.
4210: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 SSL_CTX_set_mi
4220: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 n_proto_version(
4230: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 ctx, TLS1_3_VERS
4240: 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ION);.. SSL_C
4250: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f TX_set_max_proto
4260: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
4270: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 S1_3_VERSION);..
4280: 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 break;.#endi
4290: 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 f..default:..
42a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
42b0: 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c if (ctx == NUL
42c0: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
42d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 Result(interp, R
42e0: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a EASON(), NULL);.
42f0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
4300: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 R;. }.. ss
4310: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 l = SSL_new(ctx)
4320: 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d ;. if (ssl ==
4330: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
4340: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
4350: 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c p, REASON(), NUL
4360: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
4370: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
4380: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
4390: 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 .. /* Use lis
43a0: 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77 t and order as w
43b0: 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20 ould be sent in
43c0: 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 a ClientHello or
43d0: 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 all available c
43e0: 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 iphers */. if
43f0: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 (use_supported)
4400: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 {..sk = SSL_get
4410: 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68 1_supported_ciph
4420: 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 ers(ssl);. }
4430: 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c else {..sk = SSL
4440: 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c _get_ciphers(ssl
4450: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
4460: 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (sk != NULL) {.
4470: 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b .if (!verbose) {
4480: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
4490: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
44a0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 NULL);.. for
44b0: 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c (int i = 0; i <
44c0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e sk_SSL_CIPHER_n
44d0: 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 um(sk); i++) {..
44e0: 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 .const SSL_CIPHE
44f0: 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 R *c = sk_SSL_CI
4500: 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 PHER_value(sk, i
4510: 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 );...if (c == NU
4520: 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 LL) continue;...
4530: 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65 20 ./* cipher name
4540: 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 or (NONE) */...c
4550: 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 p = SSL_CIPHER_g
4560: 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 et_name(c);...if
4570: 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 (cp == NULL) br
4580: 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f eak;...Tcl_ListO
4590: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
45a0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
45b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
45c0: 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 (cp, -1));..
45d0: 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 }...} else {..
45e0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
45f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 ewStringObj("",0
4600: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 );.. for (int
4610: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 i = 0; i < sk_S
4620: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b SL_CIPHER_num(sk
4630: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 ); i++) {...cons
4640: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 t SSL_CIPHER *c
4650: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f = sk_SSL_CIPHER_
4660: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 value(sk, i);...
4670: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 if (c == NULL) c
4680: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 ontinue;..../* t
4690: 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 extual descripti
46a0: 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 on of the cipher
46b0: 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 */...if (SSL_CI
46c0: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e PHER_description
46d0: 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 (c, buf, sizeof(
46e0: 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b buf)) != NULL) {
46f0: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ... Tcl_Appen
4700: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 dToObj(objPtr, b
4710: 75 66 2c 20 28 69 6e 74 29 20 73 74 72 6c 65 6e uf, (int) strlen
4720: 28 62 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 (buf));...} else
4730: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 {... Tcl_App
4740: 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c endToObj(objPtr,
4750: 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 "UNKNOWN\n", 8)
4760: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a ;...}.. }..}.
4770: 09 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 .if (use_support
4780: 65 64 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 ed) {.. sk_SS
4790: 4c 5f 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b L_CIPHER_free(sk
47a0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 );..}. }.
47b0: 53 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 SSL_free(ssl);.
47c0: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 SSL_CTX_free(
47d0: 63 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 ctx);.. Tcl_S
47e0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
47f0: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
4800: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
4810: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
4820: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
4830: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4870: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f ------. *. * Pro
4880: 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 tocolsObjCmd --
4890: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 list available p
48a0: 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 rotocols. *. *.T
48b0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
48c0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 invoked to proc
48d0: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 ess the "tls::pr
48e0: 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 otocols" command
48f0: 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 . *.to list avai
4900: 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e lable protocols.
4910: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
4920: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
4930: 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 l result list..
4940: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
4950: 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.none. *. *
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49a0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
49b0: 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 nt.ProtocolsObjC
49c0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
49d0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
49e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
49f0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
4a00: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
4a10: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
4a20: 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e jPtr;.. dprin
4a30: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
4a40: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 if (objc != 1
4a50: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
4a60: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
4a70: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 objv, "");..ret
4a80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
4a90: 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 }.. objPtr
4aa0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
4ab0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 j(0, NULL);..#if
4ac0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
4ad0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
4ae0: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 0000L && !define
4af0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 d(NO_SSL2) && !d
4b00: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
4b10: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f O_SSL2). Tcl_
4b20: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
4b30: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
4b40: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
4b50: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
4b60: 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b TLS_SSL2], -1));
4b70: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
4b80: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 ined(NO_SSL3) &&
4b90: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
4ba0: 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 54 L_NO_SSL3). T
4bb0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
4bc0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
4bd0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
4be0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
4bf0: 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 ls[TLS_SSL3], -1
4c00: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
4c10: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
4c20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
4c30: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 NSSL_NO_TLS1).
4c40: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
4c50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
4c60: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
4c70: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
4c80: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c ocols[TLS_TLS1],
4c90: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 -1));.#endif.#i
4ca0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
4cb0: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
4cc0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
4cd0: 31 5f 31 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1_1). Tcl_Lis
4ce0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4cf0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
4d00: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
4d10: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
4d20: 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a _TLS1_1], -1));.
4d30: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
4d40: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 ned(NO_TLS1_2) &
4d50: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
4d60: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 SL_NO_TLS1_2).
4d70: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
4d80: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
4d90: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
4da0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
4db0: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 ocols[TLS_TLS1_2
4dc0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
4dd0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
4de0: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
4df0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
4e00: 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c LS1_3). Tcl_L
4e10: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4e20: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
4e30: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
4e40: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
4e50: 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 LS_TLS1_3], -1))
4e60: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 ;.#endif.. Tc
4e70: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
4e80: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
4e90: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
4ea0: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d K;..clientData =
4eb0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c clientData;.}..
4ec0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
4ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
4f10: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 HandshakeObjCmd
4f20: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f --. *. *.This co
4f30: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f mmand is used to
4f40: 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20 verify whether
4f50: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 the handshake is
4f60: 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 complete. *.or
4f70: 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c not.. *. * Resul
4f80: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
4f90: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 d Tcl result. 1
4fa0: 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 means handshake
4fb0: 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e complete, 0 mean
4fc0: 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a s pending.. *. *
4fd0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
4fe0: 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 *.May force SSL
4ff0: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 negotiation to t
5000: 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a ake place.. *. *
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5050: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
5060: 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 nt HandshakeObjC
5070: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
5080: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
5090: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
50a0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
50b0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
50c0: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
50d0: 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a chan; /*
50e0: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
50f0: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
5100: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
5110: 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a tePtr; /*
5120: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f client state fo
5130: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a r ssl socket */.
5140: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
5150: 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 errStr = NULL;.
5160: 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a int ret = 1;.
5170: 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b int err = 0;
5180: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
5190: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
51a0: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
51b0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
51c0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
51d0: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
51e0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
51f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 ;. }.. cha
5200: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
5210: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
5220: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
5230: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 objv[1], NULL),
5240: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
5250: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
5260: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
5270: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
5280: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
5290: 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 * Make sure
52a0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
52b0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
52c0: 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 l. */. ch
52d0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
52e0: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 hannel(chan);.
52f0: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 if (Tcl_GetCha
5300: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 nnelType(chan) !
5310: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 = Tls_ChannelTyp
5320: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 e()) {..Tcl_Appe
5330: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
5340: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
5350: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
5360: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22 lName(chan), "\"
5370: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
5380: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 nel", NULL);..re
5390: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
53a0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 . }. state
53b0: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 Ptr = (State *)T
53c0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
53d0: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b tanceData(chan);
53e0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
53f0: 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 alling Tls_WaitF
5400: 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 orConnect");.
5410: 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 ret = Tls_WaitF
5420: 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 orConnect(stateP
5430: 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 tr, &err, 1);.
5440: 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 dprintf("Tls_W
5450: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 aitForConnect re
5460: 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 turned: %i", ret
5470: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 );.. if (ret
5480: 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74 < 0 && ((statePt
5490: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 r->flags & TLS_T
54a0: 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 CL_ASYNC) && (er
54b0: 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b r == EAGAIN))) {
54c0: 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 ..dprintf("Async
54d0: 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 set and err = E
54e0: 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 AGAIN");..ret =
54f0: 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 0;. } else if
5500: 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 65 72 (ret < 0) {..er
5510: 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d rStr = statePtr-
5520: 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 >err;..Tcl_Reset
5530: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
5540: 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 .Tcl_SetErrno(er
5550: 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 r);...if (!errSt
5560: 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d r || (*errStr ==
5570: 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 0)) {.. errS
5580: 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 tr = Tcl_PosixEr
5590: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a ror(interp);..}.
55a0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
55b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 lt(interp, "hand
55c0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c shake failed: ",
55d0: 20 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a errStr, (char *
55e0: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 ) NULL);..dprint
55f0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c f("Returning TCL
5600: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 _ERROR with hand
5610: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 shake failed: %s
5620: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 ", errStr);..ret
5630: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
5640: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 } else {..if
5650: 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 (err != 0) {..
5660: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 dprintf("Got
5670: 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 an error with a
5680: 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 completed handsh
5690: 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 ake: err = %i",
56a0: 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 err);..}..ret =
56b0: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 1;. }.. dp
56c0: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
56d0: 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 TCL_OK with dat
56e0: 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b a \"%i\"", ret);
56f0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
5700: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
5710: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 l_NewIntObj(ret)
5720: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 );. return(TC
5730: 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61 L_OK);..clientDa
5740: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
5750: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5770: 2d 2d 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 0a 20 2a 0a ------------. *.
57a0: 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 * ImportObjCmd
57b0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
57c0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
57d0: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 ed to process th
57e0: 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a e "ssl" command.
57f0: 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f *. *.The ssl co
5800: 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c mmand pushes SSL
5810: 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 over a (newly c
5820: 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f onnected) tcp so
5830: 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c cket. *. * Resul
5840: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
5850: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
5860: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
5870: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 :. *.May modify
5880: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 the behavior of
5890: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 an IO channel..
58a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
58b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58e0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
58f0: 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a ic int.ImportObj
5900: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
5910: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
5920: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
5930: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
5940: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
5950: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
5960: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
5970: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
5980: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 mode on. */.
5990: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
59a0: 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 ;../* client sta
59b0: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 te for ssl socke
59c0: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 t */. SSL_CTX
59d0: 20 2a 63 74 78 09 20 20 20 20 20 20 20 20 3d 20 *ctx. =
59e0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
59f0: 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20 20 20 j *script.
5a00: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 = NULL;. Tc
5a10: 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 l_Obj *password.
5a20: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
5a30: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
5a40: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
5a50: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 slation, upperCh
5a60: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 annelBlocking, u
5a70: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
5a80: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ing, upperChanne
5a90: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e lEOFChar;. in
5aa0: 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 t idx, len;.
5ab0: 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20 20 int flags..
5ac0: 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 = TLS_TCL_INI
5ad0: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 T;. int serve
5ae0: 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b 09 r.. = 0;.
5af0: 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e /* is connection
5b00: 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 incoming or out
5b10: 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 going? */. ch
5b20: 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 20 ar *keyfile.
5b30: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
5b40: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 20 char *certfile.
5b50: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
5b60: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
5b70: 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a *key .= NULL;.
5b80: 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 int key_len
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5ba0: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 = 0;. unsigne
5bb0: 64 20 63 68 61 72 20 2a 63 65 72 74 20 20 20 20 d char *cert
5bc0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
5bd0: 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 20 20 20 int cert_len
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 = 0
5bf0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ;. char *ciph
5c00: 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ers. = NU
5c10: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 LL;. char *ci
5c20: 70 68 65 72 73 75 69 74 65 73 09 20 20 20 20 20 phersuites.
5c30: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 = NULL;. c
5c40: 68 61 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20 har *CAfile.
5c50: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
5c60: 63 68 61 72 20 2a 43 41 64 69 72 09 09 20 20 20 char *CAdir..
5c70: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
5c80: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 char *DHparams.
5c90: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
5ca0: 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 char *model.
5cb0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
5cc0: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 . char *serve
5cd0: 72 6e 61 6d 65 09 20 20 20 20 20 20 20 20 3d 20 rname. =
5ce0: 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d NULL;./* hostnam
5cf0: 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d e for Server Nam
5d00: 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a e Indication */.
5d10: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
5d20: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
5d30: 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 _id = NULL;.
5d40: 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d Tcl_Obj *alpn..=
5d50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 NULL;. int s
5d60: 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 sl2 = 0, ssl3 =
5d70: 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 0;. int tls1
5d80: 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c = 1, tls1_1 = 1,
5d90: 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 tls1_2 = 1, tls
5da0: 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 1_3 = 1;. int
5db0: 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 proto = 0, leve
5dc0: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 l = -1;. int
5dd0: 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 verify = 0, requ
5de0: 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 ire = 0, request
5df0: 20 3d 20 31 3b 0a 0a 20 20 20 20 64 70 72 69 6e = 1;.. dprin
5e00: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 tf("Called");..#
5e10: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
5e20: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
5e30: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 100000L && !defi
5e40: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
5e50: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL2) && !defined
5e60: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 (NO_SSL2) && def
5e70: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 ined(NO_SSL3) &&
5e80: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
5e90: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f ) && defined(NO_
5ea0: 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66 69 6e TLS1_1) && defin
5eb0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 ed(NO_TLS1_2) &&
5ec0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
5ed0: 5f 33 29 0a 20 20 20 20 73 73 6c 32 20 3d 20 31 _3). ssl2 = 1
5ee0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
5ef0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
5f00: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
5f10: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 ed(NO_SSL3) && d
5f20: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
5f30: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
5f40: 53 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e S1) && defined(N
5f50: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66 O_TLS1_1) && def
5f60: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
5f70: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
5f80: 53 31 5f 33 29 0a 20 20 20 20 73 73 6c 33 20 3d S1_3). ssl3 =
5f90: 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 1;.#endif.#if d
5fa0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
5fb0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
5fc0: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 SL_NO_TLS1).
5fd0: 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 tls1 = 0;.#endif
5fe0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
5ff0: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
6000: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
6010: 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 S1_1). tls1_1
6020: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
6030: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
6040: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
6050: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
6060: 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 ). tls1_2 = 0
6070: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
6080: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
6090: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
60a0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
60b0: 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 tls1_3 = 0;.#e
60c0: 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 ndif.. if (ob
60d0: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 jc < 2) {..Tcl_W
60e0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
60f0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
6100: 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 annel ?options?"
6110: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
6120: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
6130: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
6140: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
6150: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
6160: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c Obj(objv[1], NUL
6170: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 L), NULL);. i
6180: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
6190: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
61a0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
61b0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
61c0: 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 *. * Make su
61d0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
61e0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
61f0: 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20 nnel. */.
6200: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
6210: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
6220: 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d .. for (idx =
6230: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 2; idx < objc;
6240: 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a idx++) {..char *
6250: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 opt = Tcl_GetStr
6260: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
6270: 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 idx], NULL);...i
6280: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 f (opt[0] != '-'
6290: 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ).. break;...
62a0: 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c OPTSTR("-cadir",
62b0: 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52 CAdir);..OPTSTR
62c0: 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 ("-cafile", CAfi
62d0: 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 le);..OPTSTR("-c
62e0: 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 ertfile", certfi
62f0: 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 le);..OPTSTR("-c
6300: 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 ipher", ciphers)
6310: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 ;..OPTSTR("-ciph
6320: 65 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a ers", ciphers);.
6330: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 .OPTSTR("-cipher
6340: 73 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 suites", ciphers
6350: 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 uites);..OPTOBJ(
6360: 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 "-command", scri
6370: 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 pt);..OPTSTR("-d
6380: 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 hparams", DHpara
6390: 6d 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b ms);..OPTSTR("-k
63a0: 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 eyfile", keyfile
63b0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 );..OPTSTR("-mod
63c0: 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 el", model);..OP
63d0: 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 TOBJ("-password"
63e0: 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 , password);..OP
63f0: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 TBOOL("-require"
6400: 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 , require);..OPT
6410: 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 2c BOOL("-request",
6420: 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 49 request);..OPTI
6430: 4e 54 28 22 2d 73 65 63 75 72 69 74 79 6c 65 76 NT("-securitylev
6440: 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 el", level);..OP
6450: 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c TBOOL("-server",
6460: 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 server);..OPTST
6470: 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c R("-servername",
6480: 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f servername);..O
6490: 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f PTSTR("-session_
64a0: 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 id", session_id)
64b0: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e ;..OPTOBJ("-alpn
64c0: 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 42 4f ", alpn);..OPTBO
64d0: 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 OL("-ssl2", ssl2
64e0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 );..OPTBOOL("-ss
64f0: 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 l3", ssl3);..OPT
6500: 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c BOOL("-tls1", tl
6510: 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d s1);..OPTBOOL("-
6520: 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 tls1.1", tls1_1)
6530: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
6540: 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 1.2", tls1_2);..
6550: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 OPTBOOL("-tls1.3
6560: 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 ", tls1_3);..OPT
6570: 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65 BYTE("-cert", ce
6580: 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 rt, cert_len);..
6590: 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 OPTBYTE("-key",
65a0: 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 0a key, key_len);..
65b0: 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 .OPTBAD("option"
65c0: 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 , "-alpn, -cadir
65d0: 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 , -cafile, -cert
65e0: 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 , -certfile, -ci
65f0: 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 pher, -ciphersui
6600: 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d tes, -command, -
6610: 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 dhparams, -key,
6620: 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c -keyfile, -model
6630: 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 72 65 , -password, -re
6640: 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73 74 2c quire, -request,
6650: 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c 2c -securitylevel,
6660: 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 -server, -serve
6670: 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f rname, -session_
6680: 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 id, -ssl2, -ssl3
6690: 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 , -tls1, -tls1.1
66a0: 2c 20 2d 74 6c 73 31 2e 32 2c 20 6f 72 20 2d 74 , -tls1.2, or -t
66b0: 6c 73 31 2e 33 22 29 3b 0a 0a 09 72 65 74 75 72 ls1.3");...retur
66c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
66d0: 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 }. if (reque
66e0: 73 74 29 09 20 20 20 20 76 65 72 69 66 79 20 7c st). verify |
66f0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 = SSL_VERIFY_CLI
6700: 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 ENT_ONCE | SSL_V
6710: 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 ERIFY_PEER;.
6720: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72 if (request && r
6730: 65 71 75 69 72 65 29 20 76 65 72 69 66 79 20 7c equire) verify |
6740: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 = SSL_VERIFY_FAI
6750: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 L_IF_NO_PEER_CER
6760: 54 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 T;. if (verif
6770: 79 20 3d 3d 20 30 29 09 76 65 72 69 66 79 20 3d y == 0).verify =
6780: 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 SSL_VERIFY_NONE
6790: 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 ;.. proto |=
67a0: 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 (ssl2 ? TLS_PROT
67b0: 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 O_SSL2 : 0);.
67c0: 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 proto |= (ssl3
67d0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 ? TLS_PROTO_SSL3
67e0: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f : 0);. proto
67f0: 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f |= (tls1 ? TLS_
6800: 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b PROTO_TLS1 : 0);
6810: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 . proto |= (t
6820: 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 ls1_1 ? TLS_PROT
6830: 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 O_TLS1_1 : 0);.
6840: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 proto |= (tls
6850: 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 1_2 ? TLS_PROTO_
6860: 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 TLS1_2 : 0);.
6870: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f proto |= (tls1_
6880: 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 3 ? TLS_PROTO_TL
6890: 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 S1_3 : 0);..
68a0: 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c /* reset to NULL
68b0: 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 if blank string
68c0: 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 provided */.
68d0: 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 if (cert && !*c
68e0: 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63 65 ert).. ce
68f0: 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c rt. = NUL
6900: 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 L;. if (key &
6910: 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 & !*key)..
6920: 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 key. =
6930: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 NULL;. if (ce
6940: 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 rtfile && !*cert
6950: 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 file) ce
6960: 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 rtfile.= NULL;.
6970: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 if (keyfile &
6980: 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 & !*keyfile)..ke
6990: 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 yfile. =
69a0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 NULL;. if (ci
69b0: 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 phers && !*ciphe
69c0: 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70 68 rs). ciph
69d0: 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ers. = NU
69e0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 LL;. if (ciph
69f0: 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 69 ersuites && !*ci
6a00: 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70 68 phersuites) ciph
6a10: 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55 ersuites = NU
6a20: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 LL;. if (CAfi
6a30: 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 le && !*CAfile).
6a40: 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 CAfile.
6a50: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
6a60: 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26 20 if (CAdir &&
6a70: 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 20 20 !*CAdir).
6a80: 20 43 41 64 69 72 09 20 20 20 20 20 20 20 20 3d CAdir. =
6a90: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 NULL;. if (D
6aa0: 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 Hparams && !*DHp
6ab0: 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 arams). D
6ac0: 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d Hparams =
6ad0: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e NULL;.. /* n
6ae0: 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a ew SSL state */.
6af0: 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 statePtr..=
6b00: 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f (State *) ckallo
6b10: 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a c((unsigned) siz
6b20: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 eof(State));.
6b30: 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 memset(statePtr
6b40: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 , 0, sizeof(Stat
6b50: 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 e));.. stateP
6b60: 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 tr->flags.= flag
6b70: 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d s;. statePtr-
6b80: 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 >interp.= interp
6b90: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
6ba0: 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b vflags.= verify;
6bb0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 . statePtr->e
6bc0: 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a rr.= "";.. /*
6bd0: 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 allocate script
6be0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 */. if (scri
6bf0: 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 pt) {..(void) Tc
6c00: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
6c10: 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 bj(script, &len)
6c20: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 ;..if (len) {..
6c30: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c statePtr->cal
6c40: 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a lback = script;.
6c50: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
6c60: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
6c70: 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 callback);..}.
6c80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f }.. /* allo
6c90: 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f cate password */
6ca0: 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 . if (passwor
6cb0: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c d) {..(void) Tcl
6cc0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
6cd0: 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e j(password, &len
6ce0: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
6cf0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 statePtr->pa
6d00: 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 ssword = passwor
6d10: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 d;.. Tcl_Incr
6d20: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
6d30: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d r->password);..}
6d40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
6d50: 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b model != NULL) {
6d60: 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 ..int mode;../*
6d70: 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 Get the "model"
6d80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e context */..chan
6d90: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
6da0: 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c l(interp, model,
6db0: 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 &mode);..if (ch
6dc0: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
6dd0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 el) NULL) {..
6de0: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
6df0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
6e00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
6e10: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a ROR;..}.../*.. *
6e20: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
6e30: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
6e40: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a most channel.. *
6e50: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
6e60: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
6e70: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 );..if (Tcl_GetC
6e80: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
6e90: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
6ea0: 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 ype()) {.. Tc
6eb0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
6ec0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
6ed0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
6ee0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
6ef0: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
6f00: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
6f10: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
6f20: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
6f30: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
6f40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
6f50: 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20 ..ctx = ((State
6f60: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c *)Tcl_GetChannel
6f70: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
6f80: 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 n))->ctx;. }
6f90: 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 else {..if ((ctx
6fa0: 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74 = CTX_Init(stat
6fb0: 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72 ePtr, server, pr
6fc0: 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 oto, keyfile, ce
6fd0: 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 rtfile, key, cer
6fe0: 74 2c 0a 09 20 20 20 20 6b 65 79 5f 6c 65 6e 2c t,.. key_len,
6ff0: 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 cert_len, CAdir
7000: 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 , CAfile, cipher
7010: 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c s, ciphersuites,
7020: 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 level, DHparams
7030: 29 29 20 3d 3d 20 28 53 53 4c 5f 43 54 58 2a 29 )) == (SSL_CTX*)
7040: 30 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 0) {.. Tls_Fr
7050: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
7060: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
7070: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
7080: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 . }.. stat
7090: 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b ePtr->ctx = ctx;
70a0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
70b0: 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 We need to make
70c0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 68 sure that the ch
70d0: 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 annel works in b
70e0: 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 inary (for the.
70f0: 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e * encryption
7100: 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 not to get goof
7110: 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 ed up).. * W
7120: 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 e only want to a
7130: 64 6a 75 73 74 20 74 68 65 20 62 75 66 66 65 72 djust the buffer
7140: 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 ing in pre-v2 ch
7150: 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 annels, where.
7160: 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 * each channe
7170: 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d l in the stack m
7180: 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 aintained its ow
7190: 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 n buffers..
71a0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 */. Tcl_DStri
71b0: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
71c0: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 nnelTranslation)
71d0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
71e0: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e gInit(&upperChan
71f0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 nelBlocking);.
7200: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
7210: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 t(&upperChannelE
7220: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c OFChar);. Tcl
7230: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
7240: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
7250: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ng);. Tcl_Get
7260: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
7270: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f terp, chan, "-eo
7280: 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 fchar", &upperCh
7290: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 annelEOFChar);.
72a0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
72b0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
72c0: 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 chan, "-encoding
72d0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
72e0: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 Encoding);. T
72f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
7300: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
7310: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
7320: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 , &upperChannelT
7330: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 ranslation);.
7340: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
7350: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
7360: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c an, "-blocking",
7370: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c &upperChannelBl
7380: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c ocking);. Tcl
7390: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
73a0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
73b0: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 "-translation",
73c0: 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 "binary");. T
73d0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
73e0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
73f0: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 , "-blocking", "
7400: 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 true");. dpri
7410: 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 ntf("Consuming T
7420: 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 cl channel %s",
7430: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
7440: 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 me(chan));. s
7450: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 tatePtr->self =
7460: 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c Tcl_StackChannel
7470: 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 (interp, Tls_Cha
7480: 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 nnelType(), (Cli
7490: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
74a0: 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 r, (TCL_READABLE
74b0: 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 | TCL_WRITABLE)
74c0: 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 , chan);. dpr
74d0: 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 63 68 intf("Created ch
74e0: 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c annel named %s",
74f0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
7500: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
7510: 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 lf));. if (st
7520: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 atePtr->self ==
7530: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
7540: 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f LL) {../*.. * No
7550: 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e use of Tcl_Even
7560: 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 tuallyFree becau
7570: 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 se no possible T
7580: 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a cl_Preserve... *
7590: 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 /..Tls_Free((cha
75a0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
75b0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
75c0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 R;. }.. Tc
75d0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
75e0: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 on(interp, state
75f0: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 Ptr->self, "-tra
7600: 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 nslation", Tcl_D
7610: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
7620: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
7630: 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f tion));. Tcl_
7640: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
7650: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
7660: 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 r->self, "-encod
7670: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e ing", Tcl_DStrin
7680: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
7690: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a nnelEncoding));.
76a0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
76b0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
76c0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
76d0: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c "-eofchar", Tcl
76e0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
76f0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
7700: 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ar));. Tcl_Se
7710: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
7720: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
7730: 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e >self, "-blockin
7740: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 g", Tcl_DStringV
7750: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
7760: 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 elBlocking));..
7770: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c /*. * SSL
7780: 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a Initialization.
7790: 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 */. stat
77a0: 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f ePtr->ssl = SSL_
77b0: 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 new(statePtr->ct
77c0: 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 x);. if (!sta
77d0: 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f tePtr->ssl) {../
77e0: 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 * SSL library er
77f0: 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 ror */..Tcl_Appe
7800: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
7810: 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 "couldn't const
7820: 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e ruct ssl session
7830: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 : ", REASON(), (
7840: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
7850: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
7860: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 ) statePtr);..re
7870: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7880: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
7890: 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 t host server na
78a0: 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 me */. if (se
78b0: 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 69 66 20 rvername) {..if
78c0: 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 (!SSL_set_tlsext
78d0: 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 _host_name(state
78e0: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 Ptr->ssl, server
78f0: 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 name) && require
7900: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
7910: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
7920: 2c 20 22 73 65 74 74 69 6e 67 20 54 4c 53 20 68 , "setting TLS h
7930: 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 ost name extensi
7940: 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 on failed", (cha
7950: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 r *) NULL);.
7960: 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 65 65 Tls_Free
7970: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
7980: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 tr);.
7990: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
79a0: 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 R;. }.
79b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d }.. /* Resum
79c0: 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a e session id */.
79d0: 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f if (session_
79e0: 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 id && strlen(ses
79f0: 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f sion_id) <= SSL_
7a00: 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 MAX_SID_CTX_LENG
7a10: 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 TH) {../* SSL_se
7a20: 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 t_session() */..
7a30: 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e if (!SSL_SESSION
7a40: 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 _set1_id_context
7a50: 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e (SSL_get_session
7a60: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c (statePtr->ssl),
7a70: 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e session_id, (un
7a80: 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c signed int) strl
7a90: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 en(session_id)))
7aa0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
7ab0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
7ac0: 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e "Resume session
7ad0: 20 69 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69 id ", session_i
7ae0: 64 2c 20 22 20 66 61 69 6c 65 64 22 2c 20 28 63 d, " failed", (c
7af0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 har *) NULL);.
7b00: 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 Tls_Fr
7b10: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
7b20: 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 ePtr);.
7b30: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
7b40: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ROR;..}. }..
7b50: 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 if (alpn) {..
7b60: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 63 6c /* Convert a Tcl
7b70: 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f list into a pro
7b80: 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 tocol-list in wi
7b90: 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e re-format */..un
7ba0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f signed char *pro
7bb0: 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e tos, *p;..unsign
7bc0: 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 ed int protos_le
7bd0: 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c n = 0;..int i, l
7be0: 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 en, cnt;..Tcl_Ob
7bf0: 6a 20 2a 2a 6c 69 73 74 3b 0a 09 69 66 20 28 54 j **list;..if (T
7c00: 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 cl_ListObjGetEle
7c10: 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c ments(interp, al
7c20: 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 pn, &cnt, &list)
7c30: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 != TCL_OK) {..
7c40: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
7c50: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
7c60: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
7c70: 45 52 52 4f 52 3b 0a 09 7d 0a 09 2f 2a 20 44 65 ERROR;..}../* De
7c80: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f termine the memo
7c90: 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 ry required for
7ca0: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 the protocol-lis
7cb0: 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 t */..for (i = 0
7cc0: 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 ; i < cnt; i++)
7cd0: 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74 {.. Tcl_GetSt
7ce0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 ringFromObj(list
7cf0: 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 [i], &len);..
7d00: 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 if (len > 255)
7d10: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {...Tcl_AppendRe
7d20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 6c sult(interp, "al
7d30: 70 6e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 pn protocol name
7d40: 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 too long", (cha
7d50: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c r *) NULL);...Tl
7d60: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
7d70: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 statePtr);...ret
7d80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
7d90: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f }.. proto
7da0: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e s_len += 1 + len
7db0: 3b 0a 09 7d 0a 09 2f 2a 20 42 75 69 6c 64 20 74 ;..}../* Build t
7dc0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 he complete prot
7dd0: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 ocol-list */..pr
7de0: 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 otos = ckalloc(p
7df0: 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 rotos_len);../*
7e00: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 protocol-lists c
7e10: 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20 onsist of 8-bit
7e20: 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c length-prefixed,
7e30: 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f byte strings */
7e40: 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 70 20 ..for (i = 0, p
7e50: 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63 6e = protos; i < cn
7e60: 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63 t; i++) {.. c
7e70: 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 har *str = Tcl_G
7e80: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
7e90: 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a list[i], &len);.
7ea0: 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e 3b . *p++ = len;
7eb0: 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 .. memcpy(p,
7ec0: 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20 20 str, len);..
7ed0: 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 09 2f 2a p += len;..}../*
7ee0: 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 Note: This func
7ef0: 74 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 tions reverses t
7f00: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 he return value
7f10: 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 convention */..i
7f20: 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f f (SSL_set_alpn_
7f30: 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d protos(statePtr-
7f40: 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 >ssl, protos, pr
7f50: 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 otos_len)) {..
7f60: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
7f70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c lt(interp, "fail
7f80: 65 64 20 74 6f 20 73 65 74 20 61 6c 70 6e 20 70 ed to set alpn p
7f90: 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 rotocols", (char
7fa0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
7fb0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
7fc0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
7fd0: 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 ckfree(protos)
7fe0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
7ff0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 2f 2a 20 L_ERROR;..}../*
8000: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f SSL_set_alpn_pro
8010: 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 tos makes a copy
8020: 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c of the protocol
8030: 2d 6c 69 73 74 20 2a 2f 0a 09 63 6b 66 72 65 65 -list */..ckfree
8040: 28 70 72 6f 74 6f 73 29 3b 0a 20 20 20 20 7d 0a (protos);. }.
8050: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 . /*. * S
8060: 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 SL Callbacks.
8070: 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 */. SSL_set
8080: 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 _app_data(stateP
8090: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a tr->ssl, (void *
80a0: 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 )statePtr);./* p
80b0: 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 oint back to us
80c0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 */. SSL_set_v
80d0: 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e erify(statePtr->
80e0: 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 ssl, verify, Ver
80f0: 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 ifyCallback);.
8100: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 69 6e SSL_CTX_set_in
8110: 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 fo_callback(stat
8120: 65 50 74 72 2d 3e 63 74 78 2c 20 49 6e 66 6f 43 ePtr->ctx, InfoC
8130: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 allback);. SS
8140: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e L_CTX_sess_set_n
8150: 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ew_cb(statePtr->
8160: 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c ctx, SessionCall
8170: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 back);.. /* C
8180: 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 reate Tcl_Channe
8190: 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f l BIO Handler */
81a0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 . statePtr->p
81b0: 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 _bio.= BIO_new_t
81c0: 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f cl(statePtr, BIO
81d0: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 _NOCLOSE);. s
81e0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 tatePtr->bio.= B
81f0: 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c IO_new(BIO_f_ssl
8200: 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 ());.. if (se
8210: 72 76 65 72 29 20 7b 0a 09 73 74 61 74 65 50 74 rver) {..statePt
8220: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
8230: 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c TCL_SERVER;..SSL
8240: 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 _set_accept_stat
8250: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
8260: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
8270: 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f SSL_set_connect_
8280: 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e state(statePtr->
8290: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ssl);. }.
82a0: 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 SSL_set_bio(stat
82b0: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 ePtr->ssl, state
82c0: 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 Ptr->p_bio, stat
82d0: 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 ePtr->p_bio);.
82e0: 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 BIO_set_ssl(st
82f0: 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 atePtr->bio, sta
8300: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f tePtr->ssl, BIO_
8310: 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f NOCLOSE);.. /
8320: 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 *. * End of
8330: 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f SSL Init. */
8340: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 . dprintf("Re
8350: 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c turning %s", Tcl
8360: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
8370: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 statePtr->self))
8380: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 ;. Tcl_SetRes
8390: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 ult(interp, (cha
83a0: 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e r *) Tcl_GetChan
83b0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
83c0: 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c ->self), TCL_VOL
83d0: 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 ATILE);.. ret
83e0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
83f0: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
8400: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
8410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8450: 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 --. *. * Unimpor
8460: 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a tObjCmd --. *. *
8470: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
8480: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 is invoked to re
8490: 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 move the topmost
84a0: 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e channel filter.
84b0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
84c0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
84d0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
84e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
84f0: 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 .May modify the
8500: 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 behavior of an I
8510: 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a O channel.. *. *
8520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8560: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
8570: 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d nt.UnimportObjCm
8580: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
8590: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
85a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
85b0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
85c0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
85d0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
85e0: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 chan;../* The ch
85f0: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
8600: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 ode on. */..
8610: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
8620: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
8630: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 != 2) {..Tcl_Wr
8640: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
8650: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
8660: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 nnel");..return
8670: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
8680: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
8690: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
86a0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
86b0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c g(objv[1]), NULL
86c0: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 );. if (chan
86d0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
86e0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
86f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8700: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
8710: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
8720: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
8730: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20 20 most channel.
8740: 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 */. chan =
8750: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
8760: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 l(chan);.. if
8770: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
8780: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
8790: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
87a0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
87b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
87c0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
87d0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
87e0: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 e(chan),..."\":
87f0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
8800: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 l", NULL);..retu
8810: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
8820: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c }.. if (Tcl
8830: 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 _UnstackChannel(
8840: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d interp, chan) ==
8850: 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 TCL_ERROR) {..r
8860: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8870: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 . }.. retu
8880: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
8890: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
88a0: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
88b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88f0: 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 -. *. * CTX_Init
8900: 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 -- construct a
8910: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 SSL_CTX instance
8920: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
8930: 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 *.A valid SSL_C
8940: 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e TX instance or N
8950: 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ULL.. *. * Side
8960: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 effects:. *.cons
8970: 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 tructs SSL conte
8980: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d xt (CTX). *. *--
8990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
89a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
89b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
89c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
89d0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c -. */.static SSL
89e0: 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 _CTX *.CTX_Init(
89f0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c State *statePtr,
8a00: 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 int isServer, i
8a10: 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a nt proto, char *
8a20: 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 keyfile, char *c
8a30: 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 ertfile,. uns
8a40: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c igned char *key,
8a50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
8a60: 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 cert, int key_le
8a70: 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c n, int cert_len,
8a80: 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 char *CAdir,.
8a90: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 char *CAfile,
8aa0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 char *ciphers, c
8ab0: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
8ac0: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 s, int level, ch
8ad0: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a ar *DHparams) {.
8ae0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
8af0: 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 interp = statePt
8b00: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 r->interp;. S
8b10: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 SL_CTX *ctx = NU
8b20: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 LL;. Tcl_DStr
8b30: 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f ing ds;. Tcl_
8b40: 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 DString ds1;.
8b50: 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 int off = 0;.
8b60: 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 int load_priva
8b70: 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 te_key;. cons
8b80: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 t SSL_METHOD *me
8b90: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e thod;.. dprin
8ba0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
8bb0: 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b if (!proto) {
8bc0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
8bd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 lt(interp, "no v
8be0: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 alid protocol se
8bf0: 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a lected", NULL);.
8c00: 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 .return (SSL_CTX
8c10: 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 *)0;. }..
8c20: 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 /* create SSL c
8c30: 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 ontext */.#if OP
8c40: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
8c50: 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 MBER >= 0x101000
8c60: 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 00L || defined(N
8c70: 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e O_SSL2) || defin
8c80: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
8c90: 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 L2). if (ENAB
8ca0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
8cb0: 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 ROTO_SSL2)) {..T
8cc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8cd0: 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 interp, "SSL2 pr
8ce0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
8cf0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 rted", NULL);..r
8d00: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
8d10: 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 )0;. }.#endif
8d20: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
8d30: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
8d40: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
8d50: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
8d60: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
8d70: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c TO_SSL3)) {..Tcl
8d80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
8d90: 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 terp, "SSL3 prot
8da0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
8db0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
8dc0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
8dd0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
8de0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
8df0: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f S1) || defined(O
8e00: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a PENSSL_NO_TLS1).
8e10: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 if (ENABLED(
8e20: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
8e30: 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 _TLS1)) {..Tcl_A
8e40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
8e50: 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 6f rp, "TLS 1.0 pro
8e60: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
8e70: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ted", NULL);..re
8e80: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 turn (SSL_CTX *)
8e90: 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0;. }.#endif.
8ea0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
8eb0: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_1) || define
8ec0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
8ed0: 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 1_1). if (ENA
8ee0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
8ef0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b PROTO_TLS1_1)) {
8f00: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
8f10: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 lt(interp, "TLS
8f20: 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 1.1 protocol not
8f30: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
8f40: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c L);..return (SSL
8f50: 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a _CTX *)0;. }.
8f60: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
8f70: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c ed(NO_TLS1_2) ||
8f80: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
8f90: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 _NO_TLS1_2).
8fa0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
8fb0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
8fc0: 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 1_2)) {..Tcl_App
8fd0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
8fe0: 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f , "TLS 1.2 proto
8ff0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
9000: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 d", NULL);..retu
9010: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b rn (SSL_CTX *)0;
9020: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 . }.#endif.#i
9030: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
9040: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_3) || defined(
9050: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
9060: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 3). if (ENABL
9070: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
9080: 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 OTO_TLS1_3)) {..
9090: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
90a0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e (interp, "TLS 1.
90b0: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 3 protocol not s
90c0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
90d0: 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 ;..return (SSL_C
90e0: 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 TX *)0;. }.#e
90f0: 6e 64 69 66 0a 0a 20 20 20 20 73 77 69 74 63 68 ndif.. switch
9100: 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f (proto) {.#if O
9110: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
9120: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
9130: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 00L && !defined(
9140: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 NO_SSL2) && !def
9150: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
9160: 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54 SSL2). case T
9170: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 LS_PROTO_SSL2:..
9180: 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d method = SSLv2_m
9190: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
91a0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
91b0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 ined(NO_SSL3) &&
91c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
91d0: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 L_NO_SSL3) && !d
91e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
91f0: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 O_SSL3_METHOD).
9200: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
9210: 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 O_SSL3:..method
9220: 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 = SSLv3_method()
9230: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
9240: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
9250: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
9260: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
9270: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
9280: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
9290: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 METHOD). case
92a0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a TLS_PROTO_TLS1:
92b0: 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 ..method = TLSv1
92c0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
92d0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
92e0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
92f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
9300: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
9310: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
9320: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d NSSL_NO_TLS1_1_M
9330: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 ETHOD). case
9340: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
9350: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 :..method = TLSv
9360: 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 1_1_method();..b
9370: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
9380: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
9390: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
93a0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
93b0: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
93c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
93d0: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 2_METHOD). ca
93e0: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
93f0: 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 1_2:..method = T
9400: 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29 3b LSv1_2_method();
9410: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
9420: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
9430: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
9440: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
9450: 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 LS1_3). case
9460: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
9470: 3a 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 76 65 :../*.. * The ve
9480: 72 73 69 6f 6e 20 72 61 6e 67 65 20 69 73 20 63 rsion range is c
9490: 6f 6e 73 74 72 61 69 6e 65 64 20 62 65 6c 6f 77 onstrained below
94a0: 2c 0a 09 20 2a 20 61 66 74 65 72 20 74 68 65 20 ,.. * after the
94b0: 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 context is creat
94c0: 65 64 2e 20 20 55 73 65 20 74 68 65 0a 09 20 2a ed. Use the.. *
94d0: 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 generic method
94e0: 68 65 72 65 2e 0a 09 20 2a 2f 0a 09 6d 65 74 68 here... */..meth
94f0: 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 od = TLS_method(
9500: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
9510: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 f. default:..
9520: 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 /* Negotiate hig
9530: 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 hest available S
9540: 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a SL/TLS version *
9550: 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f /..method = TLS_
9560: 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 method();.#if OP
9570: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
9580: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
9590: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
95a0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
95b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
95c0: 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e SL2)..off |= (EN
95d0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
95e0: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f _PROTO_SSL2) ?
95f0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 0 : SSL_OP_NO_S
9600: 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 SLv2);.#endif.#i
9610: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
9620: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
9630: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
9640: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
9650: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
9660: 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a TO_SSL3) ? 0 :
9670: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 SSL_OP_NO_SSLv3
9680: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
9690: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
96a0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
96b0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 SSL_NO_TLS1)..of
96c0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
96d0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
96e0: 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c LS1) ? 0 : SSL
96f0: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 _OP_NO_TLSv1);.#
9700: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
9710: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
9720: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
9730: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 L_NO_TLS1_1)..of
9740: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
9750: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
9760: 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c LS1_1) ? 0 : SSL
9770: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b _OP_NO_TLSv1_1);
9780: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
9790: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
97a0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
97b0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 SSL_NO_TLS1_2)..
97c0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
97d0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
97e0: 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 _TLS1_2) ? 0 : S
97f0: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 SL_OP_NO_TLSv1_2
9800: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
9810: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
9820: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
9830: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
9840: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
9850: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
9860: 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a TO_TLS1_3) ? 0 :
9870: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
9880: 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 _3);.#endif..bre
9890: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 ak;. }.. c
98a0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
98b0: 28 6d 65 74 68 6f 64 29 3b 0a 0a 20 20 20 20 69 (method);.. i
98c0: 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75 f (!ctx) {..retu
98d0: 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a rn(NULL);. }.
98e0: 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28 . if (getenv(
98f0: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 SSLKEYLOGFILE))
9900: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b {..SSL_CTX_set_k
9910: 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 eylog_callback(c
9920: 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 tx, KeyLogCallba
9930: 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 ck);. }..#if
9940: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
9950: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
9960: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
9970: 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 3). if (proto
9980: 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c == TLS_PROTO_TL
9990: 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 S1_3) {..SSL_CTX
99a0: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 _set_min_proto_v
99b0: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
99c0: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 _3_VERSION);..SS
99d0: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 L_CTX_set_max_pr
99e0: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
99f0: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 TLS1_3_VERSION)
9a00: 3b 0a 0a 09 69 66 20 28 21 69 73 53 65 72 76 65 ;...if (!isServe
9a10: 72 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 r) {.. SSL_CT
9a20: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
9a30: 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 x, SSL_OP_CIPHER
9a40: 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e _SERVER_PREFEREN
9a50: 43 45 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 CE);..}. }.#e
9a60: 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 ndif.. SSL_CT
9a70: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 X_set_app_data(c
9a80: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 tx, (void*)inter
9a90: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 p);./* remember
9aa0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
9ab0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
9ac0: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
9ad0: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 SSL_OP_ALL);./*
9ae0: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b all SSL bug work
9af0: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 arounds */. S
9b00: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
9b10: 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f ns(ctx, off);../
9b20: 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 * disable protoc
9b30: 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 ol versions */.#
9b40: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
9b50: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
9b60: 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 101000L. SSL_
9b70: 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 CTX_set_mode(ctx
9b80: 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f , SSL_MODE_AUTO_
9b90: 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c RETRY);./* handl
9ba0: 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 e new handshakes
9bb0: 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 20 2a in background *
9bc0: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c /.#endif. SSL
9bd0: 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 _CTX_sess_set_ca
9be0: 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 che_size(ctx, 12
9bf0: 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 8);.. /* Set
9c00: 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 user defined cip
9c10: 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 hers, cipher sui
9c20: 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 tes, and securit
9c30: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 y level */. i
9c40: 66 20 28 28 28 63 69 70 68 65 72 73 20 21 3d 20 f (((ciphers !=
9c50: 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 NULL) && !SSL_CT
9c60: 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 X_set_cipher_lis
9c70: 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 t(ctx, ciphers))
9c80: 20 7c 7c 20 5c 0a 09 28 28 63 69 70 68 65 72 73 || \..((ciphers
9c90: 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 uites != NULL) &
9ca0: 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 & !SSL_CTX_set_c
9cb0: 69 70 68 65 72 73 75 69 74 65 73 28 63 74 78 2c iphersuites(ctx,
9cc0: 20 63 69 70 68 65 72 73 75 69 74 65 73 29 29 29 ciphersuites)))
9cd0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
9ce0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
9cf0: 20 22 53 65 74 20 63 69 70 68 65 72 73 20 66 61 "Set ciphers fa
9d00: 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 iled", (char *)
9d10: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
9d20: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
9d30: 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f return (SSL_
9d40: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a CTX *)0;. }..
9d50: 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 /* Set secur
9d60: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 ity level */.
9d70: 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 if (level > -1
9d80: 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a && level < 6) {.
9d90: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 ./* SSL_set_secu
9da0: 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 rity_level */..S
9db0: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 SL_CTX_set_secur
9dc0: 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c ity_level(ctx, l
9dd0: 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 evel);. }..
9de0: 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 /* set some ca
9df0: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 llbacks */. S
9e00: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 SL_CTX_set_defau
9e10: 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 lt_passwd_cb(ctx
9e20: 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 , PasswordCallba
9e30: 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 ck);. SSL_CTX
9e40: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 _set_default_pas
9e50: 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 swd_cb_userdata(
9e60: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ctx, (void *)sta
9e70: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 tePtr);.. /*
9e80: 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 read a Diffie-He
9e90: 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 llman parameters
9ea0: 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 file, or use th
9eb0: 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a e built-in one *
9ec0: 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c /.#ifdef OPENSSL
9ed0: 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 _NO_DH. if (D
9ee0: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 Hparams != NULL)
9ef0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
9f00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 sult(interp, "DH
9f10: 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f parameter suppo
9f20: 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 rt not available
9f30: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
9f40: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
9f50: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 28 (ctx);..return (
9f60: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 SSL_CTX *)0;.
9f70: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 }.#else. {..
9f80: 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 DH* dh;..if (DHp
9f90: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b arams != NULL) {
9fa0: 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a .. BIO *bio;.
9fb0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
9fc0: 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20 Init(&ds);..
9fd0: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 bio = BIO_new_fi
9fe0: 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c le(F2N(DHparams,
9ff0: 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 &ds), "r");..
a000: 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 if (!bio) {...
a010: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
a020: 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 &ds);...Tcl_Appe
a030: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
a040: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 "Could not find
a050: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 DH parameters f
a060: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ile", (char *) N
a070: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
a080: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
a090: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
a0a0: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 ;.. }... d
a0b0: 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f h = PEM_read_bio
a0c0: 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e _DHparams(bio, N
a0d0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 ULL, NULL, NULL)
a0e0: 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 ;.. BIO_free(
a0f0: 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 bio);.. Tcl_D
a100: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
a110: 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b .. if (!dh) {
a120: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
a130: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 ult(interp, "Cou
a140: 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 ld not read DH p
a150: 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 arameters from f
a160: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ile", (char *) N
a170: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
a180: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
a190: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
a1a0: 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 ;.. }..} else
a1b0: 20 7b 0a 09 20 20 20 20 64 68 20 3d 20 67 65 74 {.. dh = get
a1c0: 5f 64 68 50 61 72 61 6d 73 28 29 3b 0a 09 7d 0a _dhParams();..}.
a1d0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 .SSL_CTX_set_tmp
a1e0: 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 44 _dh(ctx, dh);..D
a1f0: 48 5f 66 72 65 65 28 64 68 29 3b 0a 20 20 20 20 H_free(dh);.
a200: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a }.#endif.. /*
a210: 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 set our certifi
a220: 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 cate */. load
a230: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 _private_key = 0
a240: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 ;. if (certfi
a250: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c le != NULL) {..l
a260: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 oad_private_key
a270: 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 = 1;...Tcl_DStri
a280: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 ngInit(&ds);...i
a290: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
a2a0: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 ertificate_file(
a2b0: 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c ctx, F2N(certfil
a2c0: 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c e, &ds), SSL_FIL
a2d0: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 ETYPE_PEM) <= 0)
a2e0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 {.. Tcl_DStr
a2f0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
a300: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
a310: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
a320: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 ble to set certi
a330: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 ficate file ", c
a340: 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 ertfile, ": ",..
a350: 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c .. REASON(),
a360: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
a370: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
a380: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
a390: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 turn (SSL_CTX *)
a3a0: 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 0;..}. } else
a3b0: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c if (cert != NUL
a3c0: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 L) {..load_priva
a3d0: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 te_key = 1;..if
a3e0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 (SSL_CTX_use_cer
a3f0: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 tificate_ASN1(ct
a400: 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 x, cert_len, cer
a410: 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 t) <= 0) {..
a420: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
a430: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 &ds);.. Tcl_A
a440: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
a450: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
a460: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 et certificate:
a470: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f ",.... REASO
a480: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
a490: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
a4a0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
a4b0: 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 return (SSL_CT
a4c0: 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 X *)0;..}. }
a4d0: 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 else {..certfile
a4e0: 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 = (char*)X509_g
a4f0: 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f et_default_cert_
a500: 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 file();...if (SS
a510: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 L_CTX_use_certif
a520: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 icate_file(ctx,
a530: 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 certfile, SSL_FI
a540: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 LETYPE_PEM) <= 0
a550: 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 ) {.#if 0.. T
a560: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
a570: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 ds);.. Tcl_Ap
a580: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
a590: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 p, "unable to us
a5a0: 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 e default certif
a5b0: 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 icate file ", ce
a5c0: 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 rtfile, ": ",...
a5d0: 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 . REASON(),
a5e0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
a5f0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 . SSL_CTX_fre
a600: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 e(ctx);.. ret
a610: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
a620: 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 ;.#endif..}.
a630: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 }.. /* set ou
a640: 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f r private key */
a650: 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 . if (load_pr
a660: 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 ivate_key) {..if
a670: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c (keyfile == NUL
a680: 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c L && key == NULL
a690: 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 ) {.. keyfile
a6a0: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a = certfile;..}.
a6b0: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d ..if (keyfile !=
a6c0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a NULL) {.. /*
a6d0: 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 get the private
a6e0: 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 key associated
a6f0: 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 with this certif
a700: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 icate */.. if
a710: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c (keyfile == NUL
a720: 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d L) {...keyfile =
a730: 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 certfile;..
a740: 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f }... if (SSL_
a750: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b CTX_use_PrivateK
a760: 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e ey_file(ctx, F2N
a770: 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 (keyfile, &ds),
a780: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
a790: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f ) <= 0) {...Tcl_
a7a0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
a7b0: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 ;.../* flush the
a7c0: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 passphrase whic
a7d0: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 h might be left
a7e0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f in the result */
a7f0: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
a800: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 (interp, NULL, T
a810: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 CL_STATIC);...Tc
a820: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
a830: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
a840: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 o set public key
a850: 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 file ", keyfile
a860: 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20 20 , " ",....
a870: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 REASON(), (ch
a880: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
a890: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
a8a0: 3b 0a 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f ;...return (SSL_
a8b0: 43 54 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a CTX *)0;.. }.
a8c0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
a8d0: 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 Free(&ds);...} e
a8e0: 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e lse if (key != N
a8f0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 ULL) {.. if (
a900: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 SSL_CTX_use_Priv
a910: 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f ateKey_ASN1(EVP_
a920: 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b PKEY_RSA, ctx, k
a930: 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 ey,key_len) <= 0
a940: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
a950: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a gFree(&ds);.../*
a960: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
a970: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
a980: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
a990: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
a9a0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
a9b0: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
a9c0: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
a9d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
a9e0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
a9f0: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 public key: ", R
aa00: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
aa10: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
aa20: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
aa30: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
aa40: 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 *)0;.. }..}..
aa50: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 /* Now we know t
aa60: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 hat a key and ce
aa70: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 rt have been set
aa80: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 against.. * the
aa90: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
aaa0: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 .if (!SSL_CTX_ch
aab0: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 eck_private_key(
aac0: 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c ctx)) {.. Tcl
aad0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
aae0: 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b terp, "private k
aaf0: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 ey does not matc
ab00: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 h the certificat
ab10: 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 e public key",..
ab20: 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 .. (char *)
ab30: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
ab40: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
ab50: 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f return (SSL_
ab60: 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 CTX *)0;..}.
ab70: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 76 65 }.. /* Set ve
ab80: 72 69 66 69 63 61 74 69 6f 6e 20 43 41 73 20 2a rification CAs *
ab90: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e /. Tcl_DStrin
aba0: 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20 gInit(&ds);.
abb0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
abc0: 26 64 73 31 29 3b 0a 20 20 20 20 69 66 20 28 21 &ds1);. if (!
abd0: 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 SSL_CTX_load_ver
abe0: 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 ify_locations(ct
abf0: 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 x, F2N(CAfile, &
ac00: 64 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 ds), F2N(CAdir,
ac10: 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f &ds1)) ||..!SSL_
ac20: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
ac30: 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 verify_paths(ctx
ac40: 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f )) {.#if 0..Tcl_
ac50: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
ac60: 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ;..Tcl_DStringFr
ac70: 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f ee(&ds1);../* Do
ac80: 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63 61 n't currently ca
ac90: 72 65 20 69 66 20 74 68 69 73 20 66 61 69 6c 73 re if this fails
aca0: 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 */..Tcl_AppendR
acb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
acc0: 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69 66 SL default verif
acd0: 79 20 70 61 74 68 73 3a 20 22 2c 20 52 45 41 53 y paths: ", REAS
ace0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
acf0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
ad00: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
ad10: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
ad20: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
ad30: 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 /* https://sou
ad40: 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 rceforge.net/p/t
ad50: 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 ls/bugs/57/ */.
ad60: 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 /* XXX:TODO:
ad70: 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70 Let the user sup
ad80: 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 ply values here
ad90: 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 instead of somet
ada0: 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 hing that exists
adb0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 on the filesyst
adc0: 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 em */. if (CA
add0: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
ade0: 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e .STACK_OF(X509_N
adf0: 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 AME) *certNames
ae00: 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e = SSL_load_clien
ae10: 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 t_CA_file(F2N(CA
ae20: 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 file, &ds));..if
ae30: 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e (certNames != N
ae40: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f ULL) {.. SSL_
ae50: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 CTX_set_client_C
ae60: 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 A_list(ctx, cert
ae70: 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d Names);..}. }
ae80: 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
ae90: 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 gFree(&ds);.
aea0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
aeb0: 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72 &ds1);. retur
aec0: 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a n ctx;.}.../*. *
aed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
af00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
af10: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 ---. *. * Status
af20: 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
af30: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 certificate for
af40: 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e connected peer.
af50: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
af60: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
af70: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
af80: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
af90: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
afa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
afb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
afc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
afd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
afe0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
aff0: 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 tatusObjCmd(Clie
b000: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
b010: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
b020: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
b030: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
b040: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 objv[]) {. St
b050: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 ate *statePtr;.
b060: 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 X509 *peer;.
b070: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
b080: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e tr;. Tcl_Chan
b090: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 nel chan;. ch
b0a0: 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c ar *channelName,
b0b0: 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 *ciphers;. i
b0c0: 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e nt mode;. con
b0d0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
b0e0: 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 *proto;. uns
b0f0: 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 0a igned int len;..
b100: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
b110: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 77 69 74 led");.. swit
b120: 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73 ch (objc) {..cas
b130: 65 20 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65 e 2:.. channe
b140: 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 lName = Tcl_GetS
b150: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
b160: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 v[1], NULL);..
b170: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 break;...case
b180: 33 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 72 3:.. if (!str
b190: 63 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 69 cmp (Tcl_GetStri
b1a0: 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d ng (objv[1]), "-
b1b0: 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 61 local")) {...cha
b1c0: 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 nnelName = Tcl_G
b1d0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
b1e0: 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a objv[2], NULL);.
b1f0: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a ..break;.. }.
b200: 09 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c . /* else fal
b210: 6c 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20 2a 2f l-through ... */
b220: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 .#if defined(__G
b230: 4e 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 74 NUC__).. __at
b240: 74 72 69 62 75 74 65 5f 5f 28 28 66 61 6c 6c 74 tribute__((fallt
b250: 68 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64 69 66 hrough));.#endif
b260: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 ..default:..
b270: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
b280: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
b290: 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e , "?-local? chan
b2a0: 6e 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74 75 nel");.. retu
b2b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
b2c0: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
b2d0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
b2e0: 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 nterp, channelNa
b2f0: 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 me, &mode);.
b300: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
b310: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
b320: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
b330: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f ROR;. }. /
b340: 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 *. * Make su
b350: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
b360: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
b370: 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20 nnel. */.
b380: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
b390: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
b3a0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
b3b0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
b3c0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
b3d0: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
b3e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
b3f0: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
b400: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
b410: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
b420: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 .."\": not a TLS
b430: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 channel", NULL)
b440: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
b450: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 ROR;. }. s
b460: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
b470: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e *) Tcl_GetChann
b480: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 elInstanceData(c
b490: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 han);. if (ob
b4a0: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 jc == 2) {..peer
b4b0: 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f = SSL_get_peer_
b4c0: 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 certificate(stat
b4d0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
b4e0: 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d } else {..peer =
b4f0: 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 SSL_get_certifi
b500: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 cate(statePtr->s
b510: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 sl);. }. i
b520: 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 f (peer) {..objP
b530: 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 tr = Tls_NewX509
b540: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 Obj(interp, peer
b550: 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 );..if (objc ==
b560: 32 29 20 7b 20 58 35 30 39 5f 66 72 65 65 28 70 2) { X509_free(p
b570: 65 65 72 29 3b 20 7d 0a 20 20 20 20 7d 20 65 6c eer); }. } el
b580: 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 se {..objPtr = T
b590: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
b5a0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 NULL);. }..
b5b0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
b5c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
b5d0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
b5e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 62 NewStringObj("sb
b5f0: 69 74 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 its", -1));.
b600: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
b610: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
b620: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
b630: 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 IntObj(SSL_get_c
b640: 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 ipher_bits(state
b650: 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 Ptr->ssl, NULL))
b660: 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 );.. ciphers
b670: 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 = (char*)SSL_get
b680: 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 _cipher(statePtr
b690: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 ->ssl);. if (
b6a0: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c (ciphers != NULL
b6b0: 29 20 26 26 20 28 73 74 72 63 6d 70 28 63 69 70 ) && (strcmp(cip
b6c0: 68 65 72 73 2c 20 22 28 4e 4f 4e 45 29 22 29 20 hers, "(NONE)")
b6d0: 21 3d 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 != 0)) {..Tcl_Li
b6e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
b6f0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
b700: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
b710: 4f 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 Obj("cipher", -1
b720: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
b730: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
b740: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
b750: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 l_NewStringObj(S
b760: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 SL_get_cipher(st
b770: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 atePtr->ssl), -1
b780: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ));. }.. /
b790: 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 * Verify the X50
b7a0: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 9 certificate pr
b7b0: 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 esented by the p
b7c0: 65 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c eer */. Tcl_L
b7d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
b7e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
b7f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
b800: 67 4f 62 6a 28 22 76 61 6c 69 64 61 74 69 6f 6e gObj("validation
b810: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 ", -1));. if
b820: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f (SSL_get_verify_
b830: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d result(statePtr-
b840: 3e 73 73 6c 29 20 21 3d 20 58 35 30 39 5f 56 5f >ssl) != X509_V_
b850: 4f 4b 29 20 7b 0a 09 2f 2a 20 70 72 6f 74 6f 20 OK) {../* proto
b860: 3d 20 22 66 61 69 6c 65 64 22 3b 20 2a 2f 0a 09 = "failed"; */..
b870: 70 72 6f 74 6f 20 3d 20 52 45 41 53 4f 4e 28 29 proto = REASON()
b880: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
b890: 70 72 6f 74 6f 20 3d 20 22 6f 6b 22 3b 0a 20 20 proto = "ok";.
b8a0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 }. Tcl_List
b8b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
b8c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
b8d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
b8e0: 6a 28 70 72 6f 74 6f 2c 20 2d 31 29 29 3b 0a 0a j(proto, -1));..
b8f0: 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 /* Report th
b900: 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
b910: 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
b920: 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 of the negotiati
b930: 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 on */. SSL_ge
b940: 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 t0_alpn_selected
b950: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
b960: 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 &proto, &len);.
b970: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
b980: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
b990: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
b9a0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c NewStringObj("al
b9b0: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 pn", -1));. T
b9c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
b9d0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
b9e0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
b9f0: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a tringObj((char *
ba00: 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 6c 65 6e )proto, (int)len
ba10: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
ba20: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
ba30: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
ba40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
ba50: 6a 28 22 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 j("version", -1)
ba60: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
ba70: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
ba80: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ba90: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
baa0: 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e (SSL_get_version
bab0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c (statePtr->ssl),
bac0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f -1));.. Tcl_
bad0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
bae0: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
baf0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
bb00: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
bb10: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
bb20: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
bb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb60: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f -------. *. * Co
bb70: 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 nnectionInfoObjC
bb80: 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e md -- return con
bb90: 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f nection info fro
bba0: 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a m OpenSSL.. *. *
bbb0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c Results:. *.A l
bbc0: 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f ist of connectio
bbd0: 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d n info. *. *---
bbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc20: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
bc30: 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f ConnectionInfoO
bc40: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
bc50: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
bc60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
bc70: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
bc80: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
bc90: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ) {. Tcl_Chan
bca0: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 nel chan;../* Th
bcb0: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 e channel to set
bcc0: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 a mode on. */.
bcd0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
bce0: 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 tr;../* client s
bcf0: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 tate for ssl soc
bd00: 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f ket */. Tcl_O
bd10: 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 bj *objPtr;.
bd20: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a const SSL *ssl;.
bd30: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 const SSL_CI
bd40: 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 PHER *cipher;.
bd50: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 const SSL_SESS
bd60: 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 ION *session;.
bd70: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
bd80: 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 char *proto;.
bd90: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c unsigned int l
bda0: 65 6e 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 en;.#if defined(
bdb0: 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 HAVE_SSL_COMPRES
bdc0: 53 49 4f 4e 29 0a 20 20 20 20 63 6f 6e 73 74 20 SION). const
bdd0: 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d COMP_METHOD *com
bde0: 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 p;.#endif.. i
bdf0: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
be00: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
be10: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
be20: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
be30: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
be40: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 );. }.. ch
be50: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
be60: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f nel(interp, Tcl_
be70: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
be80: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c (objv[1], NULL),
be90: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
bea0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
beb0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
bec0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
bed0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a ;. }.. /*.
bee0: 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 * Make sure
bef0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
bf00: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
bf10: 65 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 63 el. */. c
bf20: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
bf30: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
bf40: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
bf50: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
bf60: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
bf70: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
bf80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
bf90: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
bfa0: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
bfb0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c elName(chan), "\
bfc0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
bfd0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 nnel", NULL);..r
bfe0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
bff0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a ;. }.. obj
c000: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
c010: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a tObj(0, NULL);..
c020: 20 20 20 20 2f 2a 20 47 65 74 20 63 6f 6e 6e 65 /* Get conne
c030: 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 20 ction state */.
c040: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 statePtr = (S
c050: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
c060: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
c070: 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c a(chan);. ssl
c080: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c = statePtr->ssl
c090: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
c0a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
c0b0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
c0c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
c0d0: 22 73 74 61 74 65 22 2c 20 2d 31 29 29 3b 0a 20 "state", -1));.
c0e0: 20 20 20 69 66 20 28 53 53 4c 5f 69 73 5f 69 6e if (SSL_is_in
c0f0: 69 74 5f 66 69 6e 69 73 68 65 64 28 73 73 6c 29 it_finished(ssl)
c100: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
c110: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
c120: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
c130: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
c140: 65 73 74 61 62 6c 69 73 68 65 64 22 2c 20 2d 31 established", -1
c150: 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 ));. } else i
c160: 66 20 28 53 53 4c 5f 69 6e 5f 69 6e 69 74 28 73 f (SSL_in_init(s
c170: 73 6c 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 sl)) {..Tcl_List
c180: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
c190: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
c1a0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
c1b0: 6a 28 22 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d j("handshake", -
c1c0: 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 1));. } else
c1d0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
c1e0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
c1f0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
c200: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e NewStringObj("in
c210: 69 74 69 61 6c 69 7a 69 6e 67 22 2c 20 2d 31 29 itializing", -1)
c220: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
c230: 20 47 65 74 20 73 65 72 76 65 72 20 6e 61 6d 65 Get server name
c240: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 */. Tcl_List
c250: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
c260: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
c270: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
c280: 6a 28 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 j("servername",
c290: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
c2a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
c2b0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
c2c0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
c2d0: 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 72 76 Obj(SSL_get_serv
c2e0: 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 ername(ssl, TLSE
c2f0: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 XT_NAMETYPE_host
c300: 5f 6e 61 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 20 _name), -1));..
c310: 20 20 20 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 /* Get protoc
c320: 6f 6c 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 ol */. Tcl_Li
c330: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
c340: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
c350: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
c360: 4f 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 Obj("protocol",
c370: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
c380: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
c390: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
c3a0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
c3b0: 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 Obj(SSL_get_vers
c3c0: 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a ion(ssl), -1));.
c3d0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 65 63 75 . /* Get secu
c3e0: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 rity level */.
c3f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
c400: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
c410: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
c420: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 ewStringObj("sec
c430: 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 2d 31 29 uritylevel", -1)
c440: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
c450: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
c460: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
c470: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 Tcl_NewIntObj(SS
c480: 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c L_get_security_l
c490: 65 76 65 6c 28 73 73 6c 29 29 29 3b 0a 0a 20 20 evel(ssl)));..
c4a0: 20 20 2f 2a 20 47 65 74 20 63 69 70 68 65 72 20 /* Get cipher
c4b0: 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 */. cipher =
c4c0: 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f SSL_get_current_
c4d0: 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 cipher(ssl);.
c4e0: 20 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e if (cipher != N
c4f0: 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 ULL) {..char buf
c500: 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a [BUFSIZ] = {0};.
c510: 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 .int bits, alg_b
c520: 69 74 73 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f its;...Tcl_ListO
c530: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
c540: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
c550: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
c560: 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29 29 3b ("cipher", -1));
c570: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
c580: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
c590: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
c5a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
c5b0: 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 CIPHER_get_name(
c5c0: 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 09 cipher), -1));..
c5d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
c5e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
c5f0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
c600: 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 6e 64 StringObj("stand
c610: 61 72 64 5f 6e 61 6d 65 22 2c 20 2d 31 29 29 3b ard_name", -1));
c620: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
c630: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
c640: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
c650: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
c660: 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f CIPHER_standard_
c670: 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 name(cipher), -1
c680: 29 29 3b 0a 0a 09 62 69 74 73 20 3d 20 53 53 4c ));...bits = SSL
c690: 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 _CIPHER_get_bits
c6a0: 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 (cipher, &alg_bi
c6b0: 74 73 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 ts);..Tcl_ListOb
c6c0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
c6d0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
c6e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
c6f0: 22 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 "bits", -1));..T
c700: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
c710: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
c720: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 objPtr, Tcl_NewI
c730: 6e 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a 09 54 ntObj(bits));..T
c740: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
c750: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
c760: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
c770: 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 72 65 74 tringObj("secret
c780: 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 _bits", -1));..T
c790: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
c7a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
c7b0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 objPtr, Tcl_NewI
c7c0: 6e 74 4f 62 6a 28 61 6c 67 5f 62 69 74 73 29 29 ntObj(alg_bits))
c7d0: 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 ;../* alg_bits i
c7e0: 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 s actual key sec
c7f0: 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 ret bits. If use
c800: 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 bits and secret
c810: 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 (algorithm) bit
c820: 73 20 64 69 66 66 65 72 2c 0a 20 20 20 20 20 20 s differ,.
c830: 20 20 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 the rest of
c840: 20 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 the bits are fi
c850: 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 xed, i.e. for li
c860: 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 mited export cip
c870: 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 hers (bits < 56)
c880: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
c890: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
c8a0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
c8b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
c8c0: 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 2d 31 min_version", -1
c8d0: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
c8e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
c8f0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
c900: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 l_NewStringObj(S
c910: 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 SL_CIPHER_get_ve
c920: 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d rsion(cipher), -
c930: 31 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 1));...if (SSL_C
c940: 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f IPHER_descriptio
c950: 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 n(cipher, buf, s
c960: 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e izeof(buf)) != N
c970: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f ULL) {.. Tcl_
c980: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
c990: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
c9a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
c9b0: 6e 67 4f 62 6a 28 22 64 65 73 63 72 69 70 74 69 ngObj("descripti
c9c0: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 on", -1));..
c9d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
c9e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
c9f0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
ca00: 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d StringObj(buf, -
ca10: 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 1));..}. }..
ca20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
ca30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
ca40: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
ca50: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 NewStringObj("re
ca60: 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20 2d 31 negotiation", -1
ca70: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
ca80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
ca90: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
caa0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
cab0: 6a 28 0a 09 53 53 4c 5f 67 65 74 5f 73 65 63 75 j(..SSL_get_secu
cac0: 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e re_renegotiation
cad0: 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 20 3f 20 _support(ssl) ?
cae0: 22 61 6c 6c 6f 77 65 64 22 20 3a 20 22 6e 6f 74 "allowed" : "not
caf0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 2d 31 29 supported", -1)
cb00: 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 );.. /* Repor
cb10: 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 t the selected p
cb20: 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 rotocol as a res
cb30: 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 ult of the negot
cb40: 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 iation */. SS
cb50: 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 L_get0_alpn_sele
cb60: 63 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f cted(ssl, &proto
cb70: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c , &len);. Tcl
cb80: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
cb90: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
cba0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
cbb0: 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d ingObj("alpn", -
cbc0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
cbd0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
cbe0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
cbf0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
cc00: 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f bj((char *)proto
cc10: 2c 20 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 0a 20 , (int)len));..
cc20: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e /* Session in
cc30: 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f fo */. sessio
cc40: 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 n = SSL_get_sess
cc50: 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 ion(ssl);. if
cc60: 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c (session != NUL
cc70: 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 L) {..const unsi
cc80: 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 gned char *ticke
cc90: 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b t;..size_t len2;
cca0: 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
ccb0: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
ccc0: 64 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 d;.../* Session
ccd0: 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 info */..Tcl_Lis
cce0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
ccf0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
cd00: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
cd10: 62 6a 28 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 bj("session_reus
cd20: 65 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f ed", -1));..Tcl_
cd30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
cd40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
cd50: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
cd60: 62 6a 28 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 bj(SSL_session_r
cd70: 65 75 73 65 64 28 73 73 6c 29 29 29 3b 0a 0a 09 eused(ssl)));...
cd80: 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f /* Session id */
cd90: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
cda0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
cdb0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
cdc0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 ewStringObj("ses
cdd0: 73 69 6f 6e 5f 69 64 22 2c 20 2d 31 29 29 3b 0a sion_id", -1));.
cde0: 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 .session_id = SS
cdf0: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 L_SESSION_get0_i
ce00: 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f d_context(sessio
ce10: 6e 2c 20 26 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c n, &len);..Tcl_L
ce20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
ce30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
ce40: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
ce50: 67 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c gObj(session_id,
ce60: 20 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 0a 09 2f (int)len));.../
ce70: 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 * Session ticket
ce80: 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e */..SSL_SESSION
ce90: 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 _get0_ticket(ses
cea0: 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 sion, &ticket, &
ceb0: 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 len2);..Tcl_List
cec0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
ced0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
cee0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
cef0: 6a 28 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 j("session_ticke
cf00: 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c t", -1));..Tcl_L
cf10: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
cf20: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
cf30: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
cf40: 67 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e gObj(ticket, (in
cf50: 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 t) len2));.../*
cf60: 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f Resumable sessio
cf70: 6e 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 n */..Tcl_ListOb
cf80: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
cf90: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
cfa0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
cfb0: 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 2d 31 29 "resumable", -1)
cfc0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
cfd0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
cfe0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
cff0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 53 _NewIntObj(SSL_S
d000: 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 ESSION_is_resuma
d010: 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a ble(session)));.
d020: 0a 09 2f 2a 20 53 74 61 72 74 20 74 69 6d 65 20 ../* Start time
d030: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
d040: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
d050: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
d060: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
d070: 74 61 72 74 5f 74 69 6d 65 22 2c 20 2d 31 29 29 tart_time", -1))
d080: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
d090: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
d0a0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
d0b0: 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 NewLongObj(SSL_S
d0c0: 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 ESSION_get_time(
d0d0: 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a session)));.../*
d0e0: 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2a Timeout value *
d0f0: 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
d100: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
d110: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
d120: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 NewStringObj("ti
d130: 6d 65 6f 75 74 22 2c 20 2d 31 29 29 3b 0a 09 54 meout", -1));..T
d140: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
d150: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
d160: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c objPtr, Tcl_NewL
d170: 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 ongObj(SSL_SESSI
d180: 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 ON_get_timeout(s
d190: 65 73 73 69 6f 6e 29 29 29 3b 0a 20 20 20 20 7d ession)));. }
d1a0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 ..#if defined(HA
d1b0: 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 VE_SSL_COMPRESSI
d1c0: 4f 4e 29 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 ON). /* Compr
d1d0: 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 ession info */.
d1e0: 20 20 20 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 comp = SSL_ge
d1f0: 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 t_current_compre
d200: 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 ssion(ssl);.
d210: 69 66 20 28 63 6f 6d 70 20 21 3d 20 4e 55 4c 4c if (comp != NULL
d220: 29 20 7b 0a 09 65 78 70 61 6e 73 69 6f 6e 20 3d ) {..expansion =
d230: 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 SSL_get_current
d240: 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b _expansion(ssl);
d250: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
d260: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
d270: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
d280: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d ewStringObj("com
d290: 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b pression", -1));
d2a0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
d2b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
d2c0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
d2d0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
d2e0: 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f COMP_get_name(co
d2f0: 6d 70 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f mp), -1));..Tcl_
d300: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
d310: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
d320: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
d330: 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e ngObj("expansion
d340: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
d350: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
d360: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
d370: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
d380: 4f 62 6a 28 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 Obj(SSL_COMP_get
d390: 5f 6e 61 6d 65 28 65 78 70 61 6e 73 69 6f 6e 29 _name(expansion)
d3a0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 23 65 , -1));. }.#e
d3b0: 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 ndif.. Tcl_Se
d3c0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
d3d0: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
d3e0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
d3f0: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
d400: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
d410: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
d420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d450: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 -----. *. * Vers
d460: 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 ionObjCmd -- ret
d470: 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 urn version stri
d480: 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e ng from OpenSSL.
d490: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
d4a0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
d4b0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
d4c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
d4d0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
d4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
d520: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 */.static int.V
d530: 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 ersionObjCmd(Cli
d540: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
d550: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
d560: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
d570: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
d580: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
d590: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a cl_Obj *objPtr;.
d5a0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
d5b0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a lled");.. obj
d5c0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 Ptr = Tcl_NewStr
d5d0: 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 ingObj(OPENSSL_V
d5e0: 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 ERSION_TEXT, -1)
d5f0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a ;. Tcl_SetObj
d600: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
d610: 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 bjPtr);.. ret
d620: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
d630: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
d640: 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 Data;..objc = ob
d650: 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 jc;..objv = objv
d660: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
d670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
d6b0: 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 *. * MiscObjCmd
d6c0: 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 -- misc commands
d6d0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
d6e0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
d6f0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
d700: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
d710: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
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 2d 2d 2d ----------------
d750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
d760: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d */.static int.M
d770: 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 iscObjCmd(Client
d780: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
d790: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
d7a0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
d7b0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
d7c0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 jv[]) {. stat
d7d0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 ic const char *c
d7e0: 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 ommands [] = { "
d7f0: 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 req", "strreq",
d800: 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d NULL };. enum
d810: 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 command { C_REQ
d820: 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 , C_STRREQ, C_DU
d830: 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 MMY };. int c
d840: 6d 64 2c 20 69 73 53 74 72 3b 0a 20 20 20 20 63 md, isStr;. c
d850: 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 har buffer[16384
d860: 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ];.. dprintf(
d870: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
d880: 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a if (objc < 2) {.
d890: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
d8a0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
d8b0: 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f v, "subcommand ?
d8c0: 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e args?");..return
d8d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
d8e0: 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 }. if (Tcl_Ge
d8f0: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e tIndexFromObj(in
d900: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 terp, objv[1], c
d910: 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e ommands, "comman
d920: 64 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 d", 0,&cmd) != T
d930: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
d940: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
d950: 7d 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 }.. isStr = (
d960: 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 cmd == C_STRREQ)
d970: 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 ;. switch ((e
d980: 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 num command) cmd
d990: 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a ) {..case C_REQ:
d9a0: 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a ..case C_STRREQ:
d9b0: 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 {.. EVP_PKEY
d9c0: 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 *pkey=NULL;..
d9d0: 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c X509 *cert=NUL
d9e0: 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d L;.. X509_NAM
d9f0: 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 E *name=NULL;..
da00: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 Tcl_Obj **lis
da10: 74 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 tv;.. int lis
da20: 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 tc,i;... BIO
da30: 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 *out=NULL;...
da40: 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b char *k_C="",*k
da50: 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a _ST="",*k_L="",*
da60: 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c k_O="",*k_OU="",
da70: 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 *k_CN="",*k_Emai
da80: 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 l="";.. char
da90: 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c *keyout,*pemout,
daa0: 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b *str;.. int k
dab0: 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c eysize,serial=0,
dac0: 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f days=365;..#if O
dad0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
dae0: 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
daf0: 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 00L.. BIGNUM
db00: 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 *bne = NULL;..
db10: 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c RSA *rsa = NUL
db20: 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56 L;.#else.. EV
db30: 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 P_PKEY_CTX *ctx
db40: 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a = NULL;.#endif..
db50: 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 . if ((objc<5
db60: 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b ) || (objc>6)) {
db70: 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 ...Tcl_WrongNumA
db80: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f rgs(interp, 2, o
db90: 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 bjv, "keysize ke
dba0: 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f yfile certfile ?
dbb0: 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 info?");...retur
dbc0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
dbd0: 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 }... if (Tc
dbe0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
dbf0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c interp, objv[2],
dc00: 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 &keysize) != TC
dc10: 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e L_OK) {...return
dc20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 TCL_ERROR;..
dc30: 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 }.. keyout=T
dc40: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
dc50: 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f v[3]);.. pemo
dc60: 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ut=Tcl_GetString
dc70: 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 (objv[4]);..
dc80: 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54 if (isStr) {...T
dc90: 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
dca0: 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 ,keyout,"",0);..
dcb0: 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 .Tcl_SetVar(inte
dcc0: 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b rp,pemout,"",0);
dcd0: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 .. }... if
dce0: 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 (objc>=6) {...i
dcf0: 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 f (Tcl_ListObjGe
dd00: 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 tElements(interp
dd10: 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 6c , objv[5],....&l
dd20: 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d istc, &listv) !=
dd30: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 TCL_OK) {...
dd40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
dd50: 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c R;...}....if ((l
dd60: 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a istc%2) != 0) {.
dd70: 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 .. Tcl_SetRes
dd80: 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f ult(interp,"Info
dd90: 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 rmation list mus
dda0: 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 t have even numb
ddb0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 er of arguments"
ddc0: 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 ,NULL);... re
ddd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
dde0: 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 ..}...for (i=0;
ddf0: 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b i<listc; i+=2) {
de00: 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 ... str=Tcl_G
de10: 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
de20: 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 ]);... if (st
de30: 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 rcmp(str,"days")
de40: 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 ==0) {....if (Tc
de50: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
de60: 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 interp,listv[i+1
de70: 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b ],&days)!=TCL_OK
de80: 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 ).... return
de90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
dea0: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
deb0: 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 mp(str,"serial")
dec0: 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 ==0) {....if (Tc
ded0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
dee0: 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 interp,listv[i+1
def0: 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f ],&serial)!=TCL_
df00: 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 OK).... retur
df10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 n TCL_ERROR;...
df20: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
df30: 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 rcmp(str,"C")==0
df40: 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 ) {....k_C=Tcl_G
df50: 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
df60: 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
df70: 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
df80: 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 r,"ST")==0) {...
df90: 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 .k_ST=Tcl_GetStr
dfa0: 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
dfb0: 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
dfc0: 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 (strcmp(str,"L"
dfd0: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 )==0) {....k_L=T
dfe0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
dff0: 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
e000: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
e010: 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b p(str,"O")==0) {
e020: 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 ....k_O=Tcl_GetS
e030: 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
e040: 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
e050: 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
e060: 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f OU")==0) {....k_
e070: 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 OU=Tcl_GetString
e080: 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
e090: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
e0a0: 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d trcmp(str,"CN")=
e0b0: 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 =0) {....k_CN=Tc
e0c0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
e0d0: 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
e0e0: 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
e0f0: 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 (str,"Email")==0
e100: 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 ) {....k_Email=T
e110: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
e120: 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
e130: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f } else {....Tcl_
e140: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
e150: 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 ,"Unknown parame
e160: 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 ter",NULL);....r
e170: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
e180: 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 ... }...}..
e190: 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c }..#if OPENSSL
e1a0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
e1b0: 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 < 0x30000000L..
e1c0: 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 bne = BN_new(
e1d0: 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 );.. rsa = RS
e1e0: 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b A_new();.. pk
e1f0: 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 ey = EVP_PKEY_ne
e200: 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e w();.. if (bn
e210: 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 e == NULL || rsa
e220: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 == NULL || pkey
e230: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f == NULL || !BN_
e240: 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 set_word(bne,RSA
e250: 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 _F4) ||...!RSA_g
e260: 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 enerate_key_ex(r
e270: 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 sa, keysize, bne
e280: 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f , NULL) || !EVP_
e290: 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 PKEY_assign_RSA(
e2a0: 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 pkey, rsa)) {...
e2b0: 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
e2c0: 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 ey);.../* RSA_fr
e2d0: 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 ee(rsa); freed b
e2e0: 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 y EVP_PKEY_free
e2f0: 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 */...BN_free(bne
e300: 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b );.#else.. pk
e310: 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e ey = EVP_RSA_gen
e320: 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 ((unsigned int)
e330: 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 keysize);.. c
e340: 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 tx = EVP_PKEY_CT
e350: 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 X_new(pkey,NULL)
e360: 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 ;.. if (pkey
e370: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d == NULL || ctx =
e380: 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 = NULL || !EVP_P
e390: 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 KEY_keygen_init(
e3a0: 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 ctx) ||...!EVP_P
e3b0: 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f KEY_CTX_set_rsa_
e3c0: 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c keygen_bits(ctx,
e3d0: 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 keysize) || !EV
e3e0: 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 P_PKEY_keygen(ct
e3f0: 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 x, &pkey)) {...E
e400: 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 VP_PKEY_free(pke
e410: 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 y);...EVP_PKEY_C
e420: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 TX_free(ctx);.#e
e430: 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 ndif...Tcl_SetRe
e440: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 sult(interp,"Err
e450: 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 or generating pr
e460: 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 ivate key",NULL)
e470: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
e480: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 RROR;.. } els
e490: 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 e {...if (isStr)
e4a0: 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
e4b0: 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 _new(BIO_s_mem()
e4c0: 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 );... PEM_wri
e4d0: 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 te_bio_PrivateKe
e4e0: 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c y(out,pkey,NULL,
e4f0: 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c NULL,0,NULL,NULL
e500: 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 );... i=BIO_r
e510: 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 ead(out,buffer,s
e520: 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 izeof(buffer)-1)
e530: 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 ;... i=(i<0)
e540: 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 ? 0 : i;... b
e550: 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 uffer[i]='\0';..
e560: 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 . Tcl_SetVar(
e570: 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 interp,keyout,bu
e580: 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 ffer,0);... B
e590: 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 IO_flush(out);..
e5a0: 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 . BIO_free(ou
e5b0: 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 t);...} else {..
e5c0: 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
e5d0: 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a (BIO_s_file());.
e5e0: 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f .. BIO_write_
e5f0: 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 filename(out,key
e600: 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f out);... PEM_
e610: 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 write_bio_Privat
e620: 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 eKey(out,pkey,NU
e630: 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e LL,NULL,0,NULL,N
e640: 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 ULL);... /* P
e650: 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 EM_write_bio_RSA
e660: 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 PrivateKey(out,
e670: 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c rsa, NULL, NULL,
e680: 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0, NULL, NULL);
e690: 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 */... BIO_fr
e6a0: 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 ee_all(out);.. .
e6b0: 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 }....if ((cert=X
e6c0: 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 509_new())==NULL
e6d0: 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 ) {... Tcl_Se
e6e0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
e6f0: 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 Error generating
e700: 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 certificate req
e710: 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 uest",NULL);...
e720: 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 EVP_PKEY_free
e730: 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e (pkey);.#if OPEN
e740: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
e750: 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
e760: 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 ... BN_free(b
e770: 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 ne);.#endif...
e780: 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 return(TCL_ERR
e790: 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 OR);...}....X509
e7a0: 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 _set_version(cer
e7b0: 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 t,2);...ASN1_INT
e7c0: 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 EGER_set(X509_ge
e7d0: 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 t_serialNumber(c
e7e0: 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 ert),serial);...
e7f0: 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 X509_gmtime_adj(
e800: 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 X509_getm_notBef
e810: 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 ore(cert),0);...
e820: 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 X509_gmtime_adj(
e830: 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 X509_getm_notAft
e840: 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 er(cert),(long)6
e850: 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 0*60*24*days);..
e860: 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 .X509_set_pubkey
e870: 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 (cert,pkey);....
e880: 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 name=X509_get_su
e890: 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 bject_name(cert)
e8a0: 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 ;....X509_NAME_a
e8b0: 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
e8c0: 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 name,"C", MBSTRI
e8d0: 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
e8e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
e8f0: 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b k_C, -1, -1, 0);
e900: 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
e910: 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
e920: 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e me,"ST", MBSTRIN
e930: 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
e940: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
e950: 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _ST, -1, -1, 0);
e960: 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
e970: 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
e980: 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 me,"L", MBSTRING
e990: 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
e9a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
e9b0: 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 L, -1, -1, 0);..
e9c0: 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
e9d0: 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
e9e0: 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 ,"O", MBSTRING_A
e9f0: 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
ea00: 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c ned char *) k_O,
ea10: 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
ea20: 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
ea30: 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
ea40: 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 OU", MBSTRING_AS
ea50: 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
ea60: 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c ed char *) k_OU,
ea70: 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
ea80: 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
ea90: 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
eaa0: 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 CN", MBSTRING_AS
eab0: 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
eac0: 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c ed char *) k_CN,
ead0: 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
eae0: 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
eaf0: 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
eb00: 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 Email", MBSTRING
eb10: 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
eb20: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
eb30: 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 Email, -1, -1, 0
eb40: 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 );....X509_set_s
eb50: 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 ubject_name(cert
eb60: 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 ,name);....if (!
eb70: 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 X509_sign(cert,p
eb80: 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 key,EVP_sha256()
eb90: 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f )) {... X509_
eba0: 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 free(cert);...
ebb0: 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 EVP_PKEY_free(
ebc0: 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 pkey);.#if OPENS
ebd0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
ebe0: 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
ebf0: 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e .. BN_free(bn
ec00: 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 e);.#endif...
ec10: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
ec20: 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 nterp,"Error sig
ec30: 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ning certificate
ec40: 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 ",NULL);... r
ec50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
ec60: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 ...}....if (isSt
ec70: 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 r) {... out=B
ec80: 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d IO_new(BIO_s_mem
ec90: 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ());... PEM_w
eca0: 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 rite_bio_X509(ou
ecb0: 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 t,cert);... i
ecc0: 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 =BIO_read(out,bu
ecd0: 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 ffer,sizeof(buff
ece0: 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d er)-1);... i=
ecf0: 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 (i<0) ? 0 : i;..
ed00: 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 . buffer[i]='
ed10: 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 \0';... Tcl_S
ed20: 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d etVar(interp,pem
ed30: 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 out,buffer,0);..
ed40: 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f . BIO_flush(o
ed50: 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 ut);... BIO_f
ed60: 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c ree(out);...} el
ed70: 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 se {... out=B
ed80: 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c IO_new(BIO_s_fil
ed90: 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f e());... BIO_
eda0: 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f write_filename(o
edb0: 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 ut,pemout);...
edc0: 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
edd0: 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a X509(out,cert);.
ede0: 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 .. BIO_free_a
edf0: 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 ll(out);...}....
ee00: 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b X509_free(cert);
ee10: 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
ee20: 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e (pkey);.#if OPEN
ee30: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
ee40: 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
ee50: 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b ...BN_free(bne);
ee60: 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 .#endif.. }..
ee70: 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 }..break;. de
ee80: 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 fault:..break;.
ee90: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
eea0: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 TCL_OK;..clientD
eeb0: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
eec0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
eed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ef00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
ef10: 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d *. * Tls_Free --
ef20: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
ef30: 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 edure cleans up
ef40: 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
ef50: 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
ef60: 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 *.is closed and
ef70: 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 its reference c
ef80: 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 ount falls below
ef90: 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 1. *. * Results
efa0: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.none. *. *
efb0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
efc0: 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 .Frees all the s
efd0: 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d tate. *. *------
efe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
f020: 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 /.void.Tls_Free(
f030: 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 char *blockPtr)
f040: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
f050: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
f060: 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 )blockPtr;..
f070: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
f080: 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 );.. Tls_Clea
f090: 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 n(statePtr);.
f0a0: 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 ckfree(blockPtr
f0b0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
f0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
f100: 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 *. * Tls_Clean
f110: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
f120: 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 ocedure cleans u
f130: 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 p when a SSL soc
f140: 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
f150: 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 l. *.is closed a
f160: 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 nd its reference
f170: 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c count falls bel
f180: 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 ow 1. This shou
f190: 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 ld. *.be called
f1a0: 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 synchronously by
f1b0: 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 the CloseProc,
f1c0: 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 not in the. *.Ev
f1d0: 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c entuallyFree cal
f1e0: 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
f1f0: 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ults:. *.none. *
f200: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
f210: 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 :. *.Frees all t
f220: 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d he state. *. *--
f230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f270: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 -. */.void Tls_C
f280: 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 lean(State *stat
f290: 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 ePtr) {. dpri
f2a0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
f2b0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 /*. * we
f2c0: 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 're assuming her
f2d0: 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e e that we're sin
f2e0: 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 gle-threaded.
f2f0: 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 */. if (sta
f300: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 tePtr->timer !=
f310: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
f320: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 NULL) {..Tcl_De
f330: 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 leteTimerHandler
f340: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
f350: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 );..statePtr->ti
f360: 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 mer = NULL;.
f370: 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
f380: 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 Ptr->bio) {../*
f390: 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 This will call S
f3a0: 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 SL_shutdown. Bug
f3b0: 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 1414045 */..dpr
f3c0: 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 intf("BIO_free_a
f3d0: 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 ll(%p)", statePt
f3e0: 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 r->bio);..BIO_fr
f3f0: 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d ee_all(statePtr-
f400: 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 >bio);..statePtr
f410: 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->bio = NULL;.
f420: 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
f430: 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 ePtr->ssl) {..dp
f440: 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 rintf("SSL_free(
f450: 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e %p)", statePtr->
f460: 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 ssl);..SSL_free(
f470: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
f480: 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d .statePtr->ssl =
f490: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
f4a0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
f4b0: 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 tx) {..SSL_CTX_f
f4c0: 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ree(statePtr->ct
f4d0: 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 x);..statePtr->c
f4e0: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d tx = NULL;. }
f4f0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
f500: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 r->callback) {..
f510: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
f520: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
f530: 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ack);..statePtr-
f540: 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c >callback = NULL
f550: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
f560: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
f570: 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 rd) {..Tcl_DecrR
f580: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
f590: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 ->password);..st
f5a0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
f5b0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a = NULL;. }..
f5c0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
f5d0: 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a urning");.}.../*
f5e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
f5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f620: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
f630: 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 _Init --. *. *.T
f640: 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 his is a package
f650: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 initialization
f660: 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 procedure, which
f670: 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 is called. *.by
f680: 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 Tcl when this p
f690: 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 ackage is to be
f6a0: 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 added to an inte
f6b0: 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 rpreter.. *. * R
f6c0: 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e esults: Ssl con
f6d0: 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 figured and load
f6e0: 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ed. *. * Side ef
f6f0: 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 fects:. *. creat
f700: 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e e the ssl comman
f710: 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 d, initialize ss
f720: 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d l context. *. *-
f730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f770: 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 --. */.DLLEXPORT
f780: 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 int Tls_Init(Tc
f790: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
f7a0: 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 ) {. const ch
f7b0: 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 ar tlsTclInitScr
f7c0: 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 ipt[] = {.#inclu
f7d0: 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 de "tls.tcl.h"..
f7e0: 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 0x00. };..
f7f0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
f800: 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 ");.. /*.
f810: 20 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f * We only suppo
f820: 72 74 20 54 63 6c 20 38 2e 34 20 6f 72 20 6e 65 rt Tcl 8.4 or ne
f830: 77 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 wer. */.
f840: 69 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 5f if (.#ifdef USE_
f850: 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c 5f 49 TCL_STUBS..Tcl_I
f860: 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c nitStubs(interp,
f870: 20 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c 73 65 "8.4", 0).#else
f880: 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 ..Tcl_PkgRequire
f890: 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 (interp, "Tcl",
f8a0: 22 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e 64 69 "8.4-", 0).#endi
f8b0: 66 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 f.. == NULL) {..
f8c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
f8d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
f8e0: 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 (TlsLibInit(0) !
f8f0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c = TCL_OK) {..Tcl
f900: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
f910: 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 terp, "could not
f920: 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 initialize SSL
f930: 6c 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 3b library", NULL);
f940: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
f950: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
f960: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
f970: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
f980: 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 ::ciphers", Ciph
f990: 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 ersObjCmd, (Clie
f9a0: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
f9b0: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
f9c0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
f9d0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
f9e0: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 (interp, "tls::c
f9f0: 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e onnection", Conn
fa00: 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 ectionInfoObjCmd
fa10: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
fa20: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
fa30: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
fa40: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
fa50: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
fa60: 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 "tls::handshake"
fa70: 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d , HandshakeObjCm
fa80: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
fa90: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
faa0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
fab0: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
fac0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
fad0: 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 "tls::import",
fae0: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 ImportObjCmd, (C
faf0: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
fb00: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
fb10: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
fb20: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
fb30: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
fb40: 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 ::unimport", Uni
fb50: 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c mportObjCmd, (Cl
fb60: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
fb70: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
fb80: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
fb90: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
fba0: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
fbb0: 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 :status", Status
fbc0: 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
fbd0: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
fbe0: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
fbf0: 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
fc00: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
fc10: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 terp, "tls::vers
fc20: 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a ion", VersionObj
fc30: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
fc40: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
fc50: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
fc60: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
fc70: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
fc80: 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 p, "tls::misc",
fc90: 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 MiscObjCmd, (Cli
fca0: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
fcb0: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
fcc0: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
fcd0: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
fce0: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
fcf0: 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 protocols", Prot
fd00: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c ocolsObjCmd, (Cl
fd10: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
fd20: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
fd30: 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 *) NULL);.. i
fd40: 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 63 f (interp) {..Tc
fd50: 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 l_Eval(interp, t
fd60: 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 lsTclInitScript)
fd70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 ;. }.. ret
fd80: 75 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f 76 69 urn(Tcl_PkgProvi
fd90: 64 65 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 22 de(interp, "tls"
fda0: 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f , PACKAGE_VERSIO
fdb0: 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d N));.}../*. *---
fdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fdf0: 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 ---*. *. *.Tls_S
fe00: 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a afeInit --. *. *
fe10: 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
fe20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe40: 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 -*. *.Standard p
fe50: 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65 rocedure require
fe60: 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 d by 'load'.. *.
fe70: 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 Initializes this
fe80: 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 extension for a
fe90: 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 safe interprete
fea0: 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d r.. *.----------
feb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fed0: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 ------*. *. *.Si
fee0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 de effects:. *..
fef0: 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 As of 'Tls_Init'
ff00: 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 . *. *.Result:.
ff10: 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *..A standard Tc
ff20: 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a l error code.. *
ff30: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
ff40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ff50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ff60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 ---------*. */.D
ff70: 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 LLEXPORT int Tls
ff80: 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e _SafeInit(Tcl_In
ff90: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a terp *interp) {.
ffa0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
ffb0: 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 led");. retur
ffc0: 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 n(Tls_Init(inter
ffd0: 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d p));.}../*. *---
ffe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10010 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 ---*. *. *.TlsLi
10020 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d bInit --. *. *.-
10030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
10060 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 . *.Initializes
10070 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 SSL library once
10080 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e per application
10090 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
100a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
100b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
100c0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 ----*. *. *.Side
100d0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e effects:. *..in
100e0 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 itializes SSL li
100f0 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 brary. *. *.Resu
10100 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a lt:. *..none. *.
10110 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
10120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10140 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 --------*. */.st
10150 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 atic int TlsLibI
10160 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 nit(int uninitia
10170 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 lize) {. stat
10180 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a ic int initializ
10190 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 ed = 0;. int
101a0 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b status = TCL_OK;
101b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
101c0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
101d0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
101e0 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 EADS). size_t
101f0 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 num_locks;.#end
10200 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e if.. if (unin
10210 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 itialize) {.
10220 20 20 20 20 69 66 20 28 21 69 6e 69 74 69 61 6c if (!initial
10230 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 ized) {.
10240 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b dprintf("Ask
10250 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 ed to uninitiali
10260 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e ze, but we are n
10270 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 ot initialized")
10280 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 ;.. r
10290 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 eturn(TCL_OK);.
102a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 }..
102b0 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 dprintf("Asked
102c0 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 to uninitialize
102d0 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 ");..#if defined
102e0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
102f0 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
10300 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 20 20 _THREADS).
10310 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 Tcl_MutexLock(
10320 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 20 20 20 20 &init_mx);..
10330 20 20 20 20 69 66 20 28 6c 6f 63 6b 73 29 20 7b if (locks) {
10340 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 72 65 . fre
10350 65 28 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 20 20 e(locks);.
10360 20 20 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 locks = NU
10370 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 LL;.
10380 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a locksCount = 0;.
10390 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 }.#endif
103a0 0a 20 20 20 20 20 20 20 20 69 6e 69 74 69 61 6c . initial
103b0 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 ized = 0;..#if d
103c0 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
103d0 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
103e0 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
103f0 20 20 20 20 20 20 20 20 54 63 6c 5f 4d 75 74 65 Tcl_Mute
10400 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 xUnlock(&init_mx
10410 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 );.#endif..
10420 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b return(TCL_OK
10430 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
10440 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b (initialized) {
10450 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e 74 66 . dprintf
10460 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 ("Called, but us
10470 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 ing cached value
10480 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 ");. retu
10490 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 20 rn(status);.
104a0 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 }.. dprintf("
104b0 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 Called");..#if d
104c0 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
104d0 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
104e0 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
104f0 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 Tcl_MutexLoc
10500 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e k(&init_mx);.#en
10510 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 dif. initiali
10520 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 zed = 1;..#if de
10530 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
10540 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
10550 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 d(TCL_THREADS).
10560 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 num_locks = 1
10570 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 ;. locksCount
10580 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 = (int) num_loc
10590 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 ks;. locks =
105a0 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c malloc(sizeof(*l
105b0 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b ocks) * num_lock
105c0 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c s);. memset(l
105d0 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 ocks, 0, sizeof(
105e0 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f *locks) * num_lo
105f0 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 cks);.#endif..
10600 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 /* Initialize
10610 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 BOTH libcrypto a
10620 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 nd libssl. */.
10630 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 OPENSSL_init_s
10640 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f sl(OPENSSL_INIT_
10650 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 LOAD_SSL_STRINGS
10660 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f | OPENSSL_INIT_
10670 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 LOAD_CRYPTO_STRI
10680 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 NGS..| OPENSSL_I
10690 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 NIT_ADD_ALL_CIPH
106a0 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e ERS | OPENSSL_IN
106b0 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 IT_ADD_ALL_DIGES
106c0 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 TS, NULL);..
106d0 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c BIO_new_tcl(NULL
106e0 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 , 0);..#if 0.
106f0 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 /*. * XXX:T
10700 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 ODO: Remove this
10710 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 code and replac
10720 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63 e it with a chec
10730 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f k. * for eno
10740 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 ugh entropy and
10750 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 do not try to cr
10760 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 eate our own.
10770 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 * terrible ent
10780 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ropy. */.
10790 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 /*. * Seed
107a0 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 the random numbe
107b0 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 r generator in t
107c0 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a he SSL library,.
107d0 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 * using the
107e0 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 do/while constr
107f0 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 uct because of t
10800 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 he bug note in t
10810 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 he. * OpenSS
10820 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f L FAQ at http://
10830 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f www.openssl.org/
10840 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c support/faq.html
10850 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 #USER1. *.
10860 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 * The crux of
10870 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 the problem is
10880 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 that Solaris 7 d
10890 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 oes not have a.
108a0 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f * /dev/rando
108b0 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f m or /dev/urando
108c0 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 m device so it c
108d0 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f annot gather eno
108e0 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f ugh. * entro
108f0 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 py from the RAND
10900 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 _seed() when TLS
10910 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 initializes and
10920 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 refuses. *
10930 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 to go further. E
10940 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 arlier versions
10950 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 of OpenSSL carri
10960 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 ed on regardless
10970 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 .. */. sr
10980 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e and((unsigned in
10990 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 t) time((time_t
109a0 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 *) NULL));. d
109b0 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b o {..for (i = 0;
109c0 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a i < 16; i++) {.
109d0 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d . rnd_seed[i]
109e0 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 = 1 + (char) (2
109f0 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 55.0 * rand()/(R
10a00 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 AND_MAX+1.0));..
10a10 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 }..RAND_seed(rnd
10a20 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e _seed, sizeof(rn
10a30 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 d_seed));. }
10a40 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 while (RAND_stat
10a50 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 us() != 1);.#end
10a60 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 if..#if defined(
10a70 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
10a80 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
10a90 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 THREADS)..Tcl_Mu
10aa0 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f texUnlock(&init_
10ab0 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 mx);.#endif...re
10ac0 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a turn(status);.}.