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 0a 2f 2a 0a 20 2a 20 45 78 rsa.h>../*. * Ex
03a0: 74 65 72 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 ternal functions
03b0: 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 . */../*. * Forw
03c0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 ard declarations
03d0: 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 . */..#define F2
03e0: 4e 28 6b 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 N(key, dsp) \..(
03f0: 28 28 6b 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 ((key) == NULL)
0400: 3f 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 ? (char *) NULL
0410: 3a 20 5c 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c : \...Tcl_Transl
0420: 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 ateFileName(inte
0430: 72 70 2c 20 28 6b 65 79 29 2c 20 28 64 73 70 29 rp, (key), (dsp)
0440: 29 29 0a 23 64 65 66 69 6e 65 20 52 45 41 53 4f )).#define REASO
0450: 4e 28 29 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 N().ERR_reason_e
0460: 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 52 5f rror_string(ERR_
0470: 67 65 74 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 get_error())..st
0480: 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 atic SSL_CTX *CT
0490: 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 X_Init(State *st
04a0: 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 atePtr, int isSe
04b0: 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c rver, int proto,
04c0: 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 char *key,...ch
04d0: 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e ar *certfile, un
04e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 signed char *key
04f0: 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 _asn1, unsigned
0500: 63 68 61 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c char *cert_asn1,
0510: 0a 09 09 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f ...int key_asn1_
0520: 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 len, int cert_as
0530: 6e 31 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 n1_len, char *CA
0540: 64 69 72 2c 20 63 68 61 72 20 2a 43 41 66 69 6c dir, char *CAfil
0550: 65 2c 0a 09 09 63 68 61 72 20 2a 63 69 70 68 65 e,...char *ciphe
0560: 72 73 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 rs, char *DHpara
0570: 6d 73 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 ms);..static int
0580: 09 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 .TlsLibInit(int
0590: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 3b 0a 0a uninitialize);..
05a0: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 #define TLS_PROT
05b0: 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a 23 64 65 O_SSL2..0x01.#de
05c0: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 fine TLS_PROTO_S
05d0: 53 4c 33 09 09 30 78 30 32 0a 23 64 65 66 69 6e SL3..0x02.#defin
05e0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
05f0: 09 09 30 78 30 34 0a 23 64 65 66 69 6e 65 20 54 ..0x04.#define T
0600: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 LS_PROTO_TLS1_1.
0610: 30 78 30 38 0a 23 64 65 66 69 6e 65 20 54 4c 53 0x08.#define TLS
0620: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 78 _PROTO_TLS1_2.0x
0630: 31 30 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 10.#define TLS_P
0640: 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78 32 30 ROTO_TLS1_3.0x20
0650: 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 4c 45 44 .#define ENABLED
0660: 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28 28 28 (flag, mask).(((
0670: 66 6c 61 67 29 20 26 20 28 6d 61 73 6b 29 29 20 flag) & (mask))
0680: 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 64 65 66 == (mask))..#def
0690: 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 46 49 4c ine SSLKEYLOGFIL
06a0: 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47 46 49 4c E.."SSLKEYLOGFIL
06b0: 45 22 0a 0a 2f 2a 0a 20 2a 20 53 74 61 74 69 63 E"../*. * Static
06c0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 data structures
06d0: 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4f 50 . */..#ifndef OP
06e0: 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 ENSSL_NO_DH.#inc
06f0: 6c 75 64 65 20 22 64 68 5f 70 61 72 61 6d 73 2e lude "dh_params.
0700: 68 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a h".#endif../*. *
0710: 20 57 65 20 6c 6f 73 65 20 74 68 65 20 74 63 6c We lose the tcl
0720: 20 70 61 73 73 77 6f 72 64 20 63 61 6c 6c 62 61 password callba
0730: 63 6b 20 77 68 65 6e 20 77 65 20 75 73 65 20 74 ck when we use t
0740: 68 65 20 52 53 41 20 42 53 41 46 45 20 53 53 4c he RSA BSAFE SSL
0750: 2d 43 20 31 2e 31 2e 32 0a 20 2a 20 6c 69 62 72 -C 1.1.2. * libr
0760: 61 72 69 65 73 20 69 6e 73 74 65 61 64 20 6f 66 aries instead of
0770: 20 74 68 65 20 63 75 72 72 65 6e 74 20 4f 70 65 the current Ope
0780: 6e 53 53 4c 20 6c 69 62 72 61 72 69 65 73 2e 0a nSSL libraries..
0790: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 42 53 41 46 */..#ifdef BSAF
07a0: 45 0a 23 64 65 66 69 6e 65 20 50 52 45 5f 4f 50 E.#define PRE_OP
07b0: 45 4e 53 53 4c 5f 30 5f 39 5f 34 20 31 0a 23 65 ENSSL_0_9_4 1.#e
07c0: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 50 72 65 20 ndif../*. * Pre
07d0: 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 34 20 43 6f OpenSSL 0.9.4 Co
07e0: 6d 70 61 74 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 mpat. */..#ifnde
07f0: 66 20 53 54 41 43 4b 5f 4f 46 0a 23 64 65 66 69 f STACK_OF.#defi
0800: 6e 65 20 53 54 41 43 4b 5f 4f 46 28 78 29 09 09 ne STACK_OF(x)..
0810: 09 53 54 41 43 4b 0a 23 64 65 66 69 6e 65 20 73 .STACK.#define s
0820: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d k_SSL_CIPHER_num
0830: 28 73 6b 29 09 09 73 6b 5f 6e 75 6d 28 28 73 6b (sk)..sk_num((sk
0840: 29 29 0a 23 64 65 66 69 6e 65 20 73 6b 5f 53 53 )).#define sk_SS
0850: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 L_CIPHER_value(s
0860: 6b 2c 20 69 6e 64 65 78 29 09 28 53 53 4c 5f 43 k, index).(SSL_C
0870: 49 50 48 45 52 2a 29 73 6b 5f 76 61 6c 75 65 28 IPHER*)sk_value(
0880: 28 73 6b 29 2c 20 28 69 6e 64 65 78 29 29 0a 23 (sk), (index)).#
0890: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72 endif../*. * Thr
08a0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64 ead-Safe TLS Cod
08b0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 e. */..#ifdef TC
08c0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e L_THREADS.#defin
08d0: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 e OPENSSL_THREAD
08e0: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64 _DEFINES.#includ
08f0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 e <openssl/opens
0900: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65 slconf.h>..#ifde
0910: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 f OPENSSL_THREAD
0920: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e S.#include <open
0930: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 2f 2a ssl/crypto.h>./*
0940: 20 41 64 64 65 64 20 2a 2f 0a 23 69 6e 63 6c 75 Added */.#inclu
0950: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e de <openssl/ssl.
0960: 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 h>../*. * Thread
0970: 65 64 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 ed operation req
0980: 75 69 72 65 73 20 6c 6f 63 6b 69 6e 67 20 63 61 uires locking ca
0990: 6c 6c 62 61 63 6b 73 0a 20 2a 20 42 61 73 65 64 llbacks. * Based
09a0: 20 66 72 6f 6d 20 2f 63 72 79 70 74 6f 2f 63 72 from /crypto/cr
09b0: 79 70 74 6c 69 62 2e 63 20 6f 66 20 4f 70 65 6e yptlib.c of Open
09c0: 53 53 4c 20 61 6e 64 20 4e 53 4f 70 65 6e 53 53 SSL and NSOpenSS
09d0: 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 L.. */..static T
09e0: 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f 63 6b 73 20 cl_Mutex *locks
09f0: 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 69 = NULL;.static i
0a00: 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 nt locksCount =
0a10: 30 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 0;.static Tcl_Mu
0a20: 74 65 78 20 69 6e 69 74 5f 6d 78 3b 0a 0a 23 20 tex init_mx;..#
0a30: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
0a40: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
0a50: 31 30 30 30 30 30 4c 0a 0a 76 6f 69 64 20 43 72 100000L..void Cr
0a60: 79 70 74 6f 54 68 72 65 61 64 4c 6f 63 6b 43 61 yptoThreadLockCa
0a70: 6c 6c 62 61 63 6b 28 69 6e 74 20 6d 6f 64 65 2c llback(int mode,
0a80: 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68 int n, const ch
0a90: 61 72 20 2a 66 69 6c 65 2c 20 69 6e 74 20 6c 69 ar *file, int li
0aa0: 6e 65 29 20 7b 0a 0a 20 20 20 20 69 66 20 28 6d ne) {.. if (m
0ab0: 6f 64 65 20 26 20 43 52 59 50 54 4f 5f 4c 4f 43 ode & CRYPTO_LOC
0ac0: 4b 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 64 65 K) {../* This de
0ad0: 62 75 67 67 69 6e 67 20 69 73 20 74 75 72 6e 65 bugging is turne
0ae0: 64 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 d off by default
0af0: 20 2d 2d 20 69 74 27 73 20 74 6f 6f 20 6e 6f 69 -- it's too noi
0b00: 73 79 2e 20 2a 2f 0a 09 2f 2a 20 64 70 72 69 6e sy. */../* dprin
0b10: 74 66 28 22 43 61 6c 6c 65 64 20 74 6f 20 6c 6f tf("Called to lo
0b20: 63 6b 20 28 6e 3d 25 69 20 6f 66 20 25 69 29 22 ck (n=%i of %i)"
0b30: 2c 20 6e 2c 20 6c 6f 63 6b 73 43 6f 75 6e 74 29 , n, locksCount)
0b40: 3b 20 2a 2f 0a 09 54 63 6c 5f 4d 75 74 65 78 4c ; */..Tcl_MutexL
0b50: 6f 63 6b 28 26 6c 6f 63 6b 73 5b 6e 5d 29 3b 0a ock(&locks[n]);.
0b60: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a } else {../*
0b70: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
0b80: 20 74 6f 20 75 6e 6c 6f 63 6b 20 28 6e 3d 25 69 to unlock (n=%i
0b90: 20 6f 66 20 25 69 29 22 2c 20 6e 2c 20 6c 6f 63 of %i)", n, loc
0ba0: 6b 73 43 6f 75 6e 74 29 3b 20 2a 2f 0a 09 54 63 ksCount); */..Tc
0bb0: 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 6c l_MutexUnlock(&l
0bc0: 6f 63 6b 73 5b 6e 5d 29 3b 0a 20 20 20 20 7d 0a ocks[n]);. }.
0bd0: 0a 20 20 20 20 2f 2a 20 64 70 72 69 6e 74 66 28 . /* dprintf(
0be0: 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 20 2a 2f "Returning"); */
0bf0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 .. return;.
0c00: 20 20 66 69 6c 65 20 3d 20 66 69 6c 65 3b 0a 20 file = file;.
0c10: 20 20 20 6c 69 6e 65 20 3d 20 6c 69 6e 65 3b 0a line = line;.
0c20: 7d 0a 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 }..unsigned long
0c30: 20 43 72 79 70 74 6f 54 68 72 65 61 64 49 64 43 CryptoThreadIdC
0c40: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 29 20 7b 0a allback(void) {.
0c50: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e unsigned lon
0c60: 67 20 72 65 74 3b 0a 0a 20 20 20 20 64 70 72 69 g ret;.. dpri
0c70: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
0c80: 20 20 20 20 72 65 74 20 3d 20 28 75 6e 73 69 67 ret = (unsig
0c90: 6e 65 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 ned long) Tcl_Ge
0ca0: 74 43 75 72 72 65 6e 74 54 68 72 65 61 64 28 29 tCurrentThread()
0cb0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
0cc0: 52 65 74 75 72 6e 69 6e 67 20 25 6c 75 22 2c 20 Returning %lu",
0cd0: 72 65 74 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 ret);.. retur
0ce0: 6e 28 72 65 74 29 3b 0a 7d 0a 0a 23 65 6e 64 69 n(ret);.}..#endi
0cf0: 66 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e f.#endif /* OPEN
0d00: 53 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 SSL_THREADS */.#
0d10: 65 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 endif /* TCL_THR
0d20: 45 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 0a 20 2a EADS */..../*. *
0d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d70: 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 ---. *. * InfoCa
0d80: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 llback --. *. *.
0d90: 6d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f 6e monitors SSL con
0da0: 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a nection process.
0db0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
0dc0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
0dd0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
0de0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
0df0: 20 64 65 66 69 6e 65 64 29 0a 20 2a 2d 2d 2d 2d defined). *----
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0e40: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a */.static void.
0e50: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e InfoCallback(con
0e60: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 st SSL *ssl, int
0e70: 20 77 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 where, int ret)
0e80: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
0e90: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a atePtr = (State*
0ea0: 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 )SSL_get_app_dat
0eb0: 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 a((SSL *)ssl);.
0ec0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
0ed0: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 tr;. char *ma
0ee0: 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 jor; char *minor
0ef0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
0f00: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
0f10: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
0f20: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
0f30: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e j*)NULL)..return
0f40: 3b 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 ;.. cmdPtr =
0f50: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
0f60: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
0f70: 61 63 6b 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 ack);..#if 0.
0f80: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c if (where & SSL
0f90: 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65 _CB_ALERT) {..se
0fa0: 76 20 3d 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79 v = SSL_alert_ty
0fb0: 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 pe_string_long(r
0fc0: 65 74 29 3b 0a 09 69 66 20 28 73 74 72 63 6d 70 et);..if (strcmp
0fd0: 28 73 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d (sev, "fatal")==
0fe0: 30 29 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65 0) {./* Map to e
0ff0: 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73 rror */.. Tls
1000: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
1010: 20 53 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20 SSL_ERROR(ssl,
1020: 30 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 0));.. return
1030: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ;..}. }.#endi
1040: 66 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 f. if (where
1050: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 & SSL_CB_HANDSHA
1060: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a KE_START) {..maj
1070: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 or = "handshake"
1080: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 ;..minor = "star
1090: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 t";. } else i
10a0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
10b0: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 B_HANDSHAKE_DONE
10c0: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 ) {..major = "ha
10d0: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 ndshake";..minor
10e0: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d = "done";. }
10f0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 else {..if (whe
1100: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 re & SSL_CB_ALER
1110: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 T)..major = "ale
1120: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 rt";..else if (w
1130: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f here & SSL_ST_CO
1140: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 NNECT).major = "
1150: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 connect";..else
1160: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
1170: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f ST_ACCEPT)..majo
1180: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 r = "accept";..e
1190: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 lse.....major =
11a0: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 "unknown";...if
11b0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
11c0: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 READ)..minor = "
11d0: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 read";..else if
11e0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
11f0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 WRITE)..minor =
1200: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 "write";..else i
1210: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
1220: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d B_LOOP)..minor =
1230: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 "loop";..else i
1240: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
1250: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d B_EXIT)..minor =
1260: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 "exit";..else..
1270: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e ...minor = "unkn
1280: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 own";. }..
1290: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
12a0: 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 ndElement(stateP
12b0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 tr->interp, cmdP
12c0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
12d0: 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 gObj("info", -1)
12e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
12f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1300: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
1310: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
1320: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1330: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
1340: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
1350: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 f), -1));. Tc
1360: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1370: 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d lement(statePtr-
1380: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c >interp, cmdPtr,
1390: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
13a0: 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 j(major, -1));.
13b0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
13c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 pendElement(stat
13d0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d ePtr->interp, cm
13e0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
13f0: 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 ingObj(minor, -1
1400: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 ));.. if (whe
1410: 72 65 20 26 20 28 53 53 4c 5f 43 42 5f 4c 4f 4f re & (SSL_CB_LOO
1420: 50 7c 53 53 4c 5f 43 42 5f 45 58 49 54 29 29 20 P|SSL_CB_EXIT))
1430: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
1440: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 pendElement(stat
1450: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d ePtr->interp, cm
1460: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
1470: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
1480: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e state_string_lon
1490: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 g(ssl), -1));.
14a0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 } else if (whe
14b0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 re & SSL_CB_ALER
14c0: 54 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 T) {..const char
14d0: 20 2a 63 70 20 3d 20 28 63 68 61 72 20 2a 29 20 *cp = (char *)
14e0: 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 SSL_alert_desc_s
14f0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b tring_long(ret);
1500: 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ...Tcl_ListObjAp
1510: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 pendElement(stat
1520: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d ePtr->interp, cm
1530: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
1540: 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b ingObj(cp, -1));
1550: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 . } else {..T
1560: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1570: 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 Element(statePtr
1580: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
1590: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
15a0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 ringObj(SSL_stat
15b0: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 e_string_long(ss
15c0: 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a l), -1));. }.
15d0: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
15e0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
15f0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b atePtr->interp);
1600: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 . Tcl_Preserv
1610: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
1620: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 tatePtr);.. T
1630: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
1640: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 28 76 6f cmdPtr);. (vo
1650: 69 64 29 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 id) Tcl_EvalObjE
1660: 78 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 x(statePtr->inte
1670: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f rp, cmdPtr, TCL_
1680: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 EVAL_GLOBAL);.
1690: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
16a0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 nt(cmdPtr);..
16b0: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c Tcl_Release((Cl
16c0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
16d0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c tr);. Tcl_Rel
16e0: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 ease((ClientData
16f0: 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ) statePtr->inte
1700: 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d rp);.}.../*. *--
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1750: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 -. *. * VerifyCa
1760: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 llback --. *. *.
1770: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 Monitors SSL cer
1780: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 tificate validat
1790: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 0a 20 2a 09 ion process.. *.
17a0: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 This is called w
17b0: 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 henever a certif
17c0: 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 icate is inspect
17d0: 65 64 0a 20 2a 09 6f 72 20 64 65 63 69 64 65 64 ed. *.or decided
17e0: 20 69 6e 76 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20 invalid.. *. *
17f0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 Results:. *.A ca
1800: 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 llback bound to
1810: 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 the socket may r
1820: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a eturn one of:. *
1830: 09 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 63 . 0...- the c
1840: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 ertificate is de
1850: 65 6d 65 64 20 69 6e 76 61 6c 69 64 0a 20 2a 09 emed invalid. *.
1860: 20 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 1...- the ce
1870: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 rtificate is dee
1880: 6d 65 64 20 76 61 6c 69 64 0a 20 2a 09 20 20 20 med valid. *.
1890: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09 2d 20 empty string.-
18a0: 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 65 72 no change to cer
18b0: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 tificate validat
18c0: 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ion. *. * Side e
18d0: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 ffects:. *.The e
18e0: 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 rr field of the
18f0: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 currently operat
1900: 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 ive State is set
1910: 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e . *. to a strin
1920: 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 g describing the
1930: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e SSL negotiation
1940: 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a failure reason.
1950: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
1960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1990: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
19a0: 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 int.VerifyCallb
19b0: 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 ack(int ok, X509
19c0: 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 _STORE_CTX *ctx)
19d0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
19e0: 63 6d 64 50 74 72 2c 20 2a 72 65 73 75 6c 74 3b cmdPtr, *result;
19f0: 0a 20 20 20 20 63 68 61 72 20 2a 65 72 72 53 74 . char *errSt
1a00: 72 2c 20 2a 73 74 72 69 6e 67 3b 0a 20 20 20 20 r, *string;.
1a10: 69 6e 74 20 6c 65 6e 67 74 68 3b 0a 20 20 20 20 int length;.
1a20: 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 53 SSL *ssl..= (S
1a30: 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43 SL*)X509_STORE_C
1a40: 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63 TX_get_ex_data(c
1a50: 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64 tx, SSL_get_ex_d
1a60: 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43 ata_X509_STORE_C
1a70: 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58 TX_idx());. X
1a80: 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35 509 *cert..= X5
1a90: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
1aa0: 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74 _current_cert(ct
1ab0: 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 x);. State *s
1ac0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 tatePtr.= (State
1ad0: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
1ae0: 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 69 6e 74 ta(ssl);. int
1af0: 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 depth..= X509_S
1b00: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 TORE_CTX_get_err
1b10: 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 or_depth(ctx);.
1b20: 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 int err..= X5
1b30: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
1b40: 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 20 20 20 _error(ctx);.
1b50: 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 int code;..
1b60: 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 3a dprintf("Verify:
1b70: 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 %d", ok);..
1b80: 69 66 20 28 21 6f 6b 29 20 7b 0a 09 65 72 72 53 if (!ok) {..errS
1b90: 74 72 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 tr = (char*)X509
1ba0: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 _verify_cert_err
1bb0: 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 3b 0a or_string(err);.
1bc0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 65 72 } else {..er
1bd0: 72 53 74 72 20 3d 20 28 63 68 61 72 20 2a 29 30 rStr = (char *)0
1be0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
1bf0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
1c00: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a ack == (Tcl_Obj*
1c10: 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74 )NULL) {..if (st
1c20: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 atePtr->vflags &
1c30: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
1c40: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
1c50: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
1c60: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 ok;..} else {..
1c70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a return 1;..}.
1c80: 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 74 72 }. cmdPtr
1c90: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
1ca0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
1cb0: 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63 llback);.. Tc
1cc0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1cd0: 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d lement(statePtr-
1ce0: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c >interp, cmdPtr,
1cf0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1d00: 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29 j("verify", -1))
1d10: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1d20: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 jAppendElement(s
1d30: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
1d40: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
1d50: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 l_NewStringObj(T
1d60: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
1d70: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
1d80: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ), -1));. Tcl
1d90: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1da0: 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e ement(statePtr->
1db0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1dc0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 Tcl_NewIntObj(de
1dd0: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c pth));. Tcl_L
1de0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1df0: 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e ent(statePtr->in
1e00: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c terp, cmdPtr, Tl
1e10: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 73 74 61 s_NewX509Obj(sta
1e20: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 tePtr->interp, c
1e30: 65 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c ert));. Tcl_L
1e40: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1e50: 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e ent(statePtr->in
1e60: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
1e70: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 l_NewIntObj(ok))
1e80: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1e90: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 jAppendElement(s
1ea0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
1eb0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
1ec0: 53 74 72 69 6e 67 4f 62 6a 28 65 72 72 53 74 72 StringObj(errStr
1ed0: 20 3f 20 65 72 72 53 74 72 20 3a 20 22 22 2c 20 ? errStr : "",
1ee0: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 -1));.. Tcl_P
1ef0: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
1f00: 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 ata) statePtr->i
1f10: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f nterp);. Tcl_
1f20: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
1f30: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
1f40: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
1f50: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c flags |= TLS_TCL
1f60: 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 20 20 20 _CALLBACK;..
1f70: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
1f80: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
1f90: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
1fa0: 45 78 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 Ex(statePtr->int
1fb0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c erp, cmdPtr, TCL
1fc0: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 _EVAL_GLOBAL);.
1fd0: 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 if (code != T
1fe0: 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 49 74 20 CL_OK) {../* It
1ff0: 67 6f 74 20 61 6e 20 65 72 72 6f 72 20 2d 20 72 got an error - r
2000: 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66 eject the certif
2010: 69 63 61 74 65 2e 09 09 2a 2f 0a 23 69 66 20 28 icate...*/.#if (
2020: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
2030: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f N == 8) && (TCL_
2040: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 MINOR_VERSION <
2050: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6)..Tcl_Backgrou
2060: 6e 64 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 ndError(statePtr
2070: 2d 3e 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 ->interp);.#else
2080: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
2090: 45 78 63 65 70 74 69 6f 6e 28 73 74 61 74 65 50 Exception(stateP
20a0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6f 64 65 tr->interp, code
20b0: 29 3b 0a 23 65 6e 64 69 66 0a 09 6f 6b 20 3d 20 );.#endif..ok =
20c0: 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 0;. } else {.
20d0: 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 .result = Tcl_Ge
20e0: 74 4f 62 6a 52 65 73 75 6c 74 28 73 74 61 74 65 tObjResult(state
20f0: 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 09 73 Ptr->interp);..s
2100: 74 72 69 6e 67 20 3d 20 54 63 6c 5f 47 65 74 53 tring = Tcl_GetS
2110: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 73 tringFromObj(res
2120: 75 6c 74 2c 20 26 6c 65 6e 67 74 68 29 3b 0a 09 ult, &length);..
2130: 2f 2a 20 41 6e 20 65 6d 70 74 79 20 72 65 73 75 /* An empty resu
2140: 6c 74 20 6c 65 61 76 65 73 20 76 65 72 69 66 69 lt leaves verifi
2150: 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 cation unchanged
2160: 2e 09 2a 2f 0a 09 69 66 20 28 73 74 72 69 6e 67 ..*/..if (string
2170: 20 21 3d 20 4e 55 4c 4c 20 26 26 20 6c 65 6e 67 != NULL && leng
2180: 74 68 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 63 th > 0) {.. c
2190: 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74 49 6e 74 ode = Tcl_GetInt
21a0: 46 72 6f 6d 4f 62 6a 28 73 74 61 74 65 50 74 72 FromObj(statePtr
21b0: 2d 3e 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 ->interp, result
21c0: 2c 20 26 6f 6b 29 3b 0a 09 20 20 20 20 69 66 20 , &ok);.. if
21d0: 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 (code != TCL_OK)
21e0: 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f {.#if (TCL_MAJO
21f0: 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 R_VERSION == 8)
2200: 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 && (TCL_MINOR_VE
2210: 52 53 49 4f 4e 20 3c 20 36 29 0a 09 09 54 63 6c RSION < 6)...Tcl
2220: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
2230: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 (statePtr->inter
2240: 70 29 3b 0a 23 65 6c 73 65 0a 09 09 54 63 6c 5f p);.#else...Tcl_
2250: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
2260: 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 69 6e ion(statePtr->in
2270: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e terp, code);.#en
2280: 64 69 66 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20 dif...ok = 0;..
2290: 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 }..}. }.
22a0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
22b0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 nt(cmdPtr);..
22c0: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 statePtr->flags
22d0: 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 &= ~(TLS_TCL_CA
22e0: 4c 4c 42 41 43 4b 29 3b 0a 0a 20 20 20 20 54 63 LLBACK);.. Tc
22f0: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
2300: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
2310: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 ;. Tcl_Releas
2320: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
2330: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 tatePtr->interp)
2340: 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 ;. return(ok)
2350: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c ;./* By default,
2360: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 leave verificat
2370: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a ion unchanged..*
2380: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d /.}.../*. *-----
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
23d0: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d *. * Tls_Error -
23e0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 -. *. *.Calls ca
23f0: 6c 6c 62 61 63 6b 20 77 69 74 68 20 24 66 64 20 llback with $fd
2400: 61 6e 64 20 24 6d 73 67 20 2d 20 73 6f 20 74 68 and $msg - so th
2410: 65 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 64 e callback can d
2420: 65 63 69 64 65 0a 20 2a 09 77 68 61 74 20 74 6f ecide. *.what to
2430: 20 64 6f 20 77 69 74 68 20 65 72 72 6f 72 73 2e do with errors.
2440: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
2450: 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 cts:. *.The err
2460: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 field of the cur
2470: 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 rently operative
2480: 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a State is set. *
2490: 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 . to a string d
24a0: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 escribing the SS
24b0: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 L negotiation fa
24c0: 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d ilure reason. *-
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2510: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f --. */.void.Tls_
2520: 45 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 Error(State *sta
2530: 74 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 tePtr, char *msg
2540: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ) {. Tcl_Obj
2550: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 *cmdPtr;. int
2560: 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 code;.. dpri
2570: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
2580: 20 20 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a if (msg && *
2590: 6d 73 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 msg) {..Tcl_SetE
25a0: 72 72 6f 72 43 6f 64 65 28 73 74 61 74 65 50 74 rrorCode(statePt
25b0: 72 2d 3e 69 6e 74 65 72 70 2c 20 22 53 53 4c 22 r->interp, "SSL"
25c0: 2c 20 6d 73 67 2c 20 28 63 68 61 72 20 2a 29 4e , msg, (char *)N
25d0: 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ULL);. } else
25e0: 20 7b 0a 09 6d 73 67 20 3d 20 54 63 6c 5f 47 65 {..msg = Tcl_Ge
25f0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 tStringFromObj(T
2600: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
2610: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
2620: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a ), NULL);. }.
2630: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 statePtr->er
2640: 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 69 66 r = msg;.. if
2650: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
2660: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
2670: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 *)NULL) {..char
2680: 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 09 73 70 buf[BUFSIZ];..sp
2690: 72 69 6e 74 66 28 62 75 66 2c 20 22 53 53 4c 20 rintf(buf, "SSL
26a0: 63 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 3a 20 channel \"%s\":
26b0: 65 72 72 6f 72 3a 20 25 73 22 2c 0a 09 20 20 20 error: %s",..
26c0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
26d0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
26e0: 6c 66 29 2c 20 6d 73 67 29 3b 0a 09 54 63 6c 5f lf), msg);..Tcl_
26f0: 53 65 74 52 65 73 75 6c 74 28 73 74 61 74 65 50 SetResult(stateP
2700: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 62 75 66 2c tr->interp, buf,
2710: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a TCL_VOLATILE);.
2720: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 #if (TCL_MAJOR_V
2730: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 ERSION == 8) &&
2740: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 (TCL_MINOR_VERSI
2750: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 ON < 6)..Tcl_Bac
2760: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 73 74 61 kgroundError(sta
2770: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a tePtr->interp);.
2780: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 #else..Tcl_Backg
2790: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 73 roundException(s
27a0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
27b0: 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 23 65 6e TCL_ERROR);.#en
27c0: 64 69 66 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 dif..return;.
27d0: 20 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 }. cmdPtr =
27e0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
27f0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
2800: 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c ack);.. Tcl_L
2810: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2820: 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e ent(statePtr->in
2830: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
2840: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
2850: 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 Obj("error", -1)
2860: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
2870: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2880: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 (statePtr->inter
2890: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
28a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
28b0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
28c0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
28d0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 lf), -1));..
28e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
28f0: 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 dElement(statePt
2900: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 r->interp, cmdPt
2910: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
2920: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 tringObj(msg, -1
2930: 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 ));.. Tcl_Pre
2940: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 serve((ClientDat
2950: 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 a) statePtr->int
2960: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 erp);. Tcl_Pr
2970: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
2980: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a ta) statePtr);..
2990: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
29a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
29b0: 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 code = Tcl_Eva
29c0: 6c 4f 62 6a 45 78 28 73 74 61 74 65 50 74 72 2d lObjEx(statePtr-
29d0: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c >interp, cmdPtr,
29e0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
29f0: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 );. if (code
2a00: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 != TCL_OK) {.#if
2a10: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 (TCL_MAJOR_VERS
2a20: 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 ION == 8) && (TC
2a30: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MINOR_VERSION
2a40: 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 < 6)..Tcl_Backgr
2a50: 6f 75 6e 64 45 72 72 6f 72 28 73 74 61 74 65 50 oundError(stateP
2a60: 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 23 65 6c tr->interp);.#el
2a70: 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 se..Tcl_Backgrou
2a80: 6e 64 45 78 63 65 70 74 69 6f 6e 28 73 74 61 74 ndException(stat
2a90: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6f ePtr->interp, co
2aa0: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 de);.#endif.
2ab0: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 }. Tcl_DecrRe
2ac0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
2ad0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
2ae0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
2af0: 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f tePtr);. Tcl_
2b00: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
2b10: 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 ata) statePtr->i
2b20: 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 76 6f 69 64 nterp);.}...void
2b30: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 KeyLogCallback(
2b40: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 const SSL *ssl,
2b50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 const char *line
2b60: 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 ) {. char *st
2b70: 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 r = getenv(SSLKE
2b80: 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 YLOGFILE);. F
2b90: 49 4c 45 20 2a 66 64 3b 0a 20 20 20 20 69 66 20 ILE *fd;. if
2ba0: 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f (str) {..fd = fo
2bb0: 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 pen(str, "a");..
2bc0: 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c fprintf(fd, "%s\
2bd0: 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 n",line);..fclos
2be0: 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c e(fd);. }.}..
2bf0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2c40: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b PasswordCallback
2c50: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 --. *. *.Called
2c60: 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 when a password
2c70: 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e is needed to un
2c80: 70 61 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d pack RSA and PEM
2c90: 20 6b 65 79 73 2e 0a 20 2a 09 45 76 61 6c 73 20 keys.. *.Evals
2ca0: 61 6e 79 20 62 6f 75 6e 64 20 70 61 73 73 77 6f any bound passwo
2cb0: 72 64 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 rd script and re
2cc0: 74 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 turns the result
2cd0: 20 61 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77 as. *.the passw
2ce0: 6f 72 64 20 73 74 72 69 6e 67 2e 0a 20 2a 2d 2d ord string.. *--
2cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d30: 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20 50 52 45 -. */.#ifdef PRE
2d40: 5f 4f 50 45 4e 53 53 4c 5f 30 5f 39 5f 34 0a 2f _OPENSSL_0_9_4./
2d50: 2a 0a 20 2a 20 4e 6f 20 77 61 79 20 74 6f 20 68 *. * No way to h
2d60: 61 6e 64 6c 65 20 75 73 65 72 2d 64 61 74 61 20 andle user-data
2d70: 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 77 61 79 therefore no way
2d80: 20 77 69 74 68 6f 75 74 20 61 20 67 6c 6f 62 61 without a globa
2d90: 6c 0a 20 2a 20 76 61 72 69 61 62 6c 65 20 74 6f l. * variable to
2da0: 20 61 63 63 65 73 73 20 74 68 65 20 54 63 6c 20 access the Tcl
2db0: 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a interpreter..*/.
2dc0: 73 74 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 static int.Passw
2dd0: 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 ordCallback(char
2de0: 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c *buf, int size,
2df0: 20 69 6e 74 20 76 65 72 69 66 79 29 20 7b 0a 20 int verify) {.
2e00: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 62 return -1;..b
2e10: 75 66 20 3d 20 62 75 66 3b 0a 09 73 69 7a 65 20 uf = buf;..size
2e20: 3d 20 73 69 7a 65 3b 0a 09 76 65 72 69 66 79 20 = size;..verify
2e30: 3d 20 76 65 72 69 66 79 3b 0a 7d 0a 23 65 6c 73 = verify;.}.#els
2e40: 65 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61 73 e.static int.Pas
2e50: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 swordCallback(ch
2e60: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a ar *buf, int siz
2e70: 65 2c 20 69 6e 74 20 76 65 72 69 66 79 2c 20 76 e, int verify, v
2e80: 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a 20 20 oid *udata) {.
2e90: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
2ea0: 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75 64 r.= (State *) ud
2eb0: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 ata;. Tcl_Int
2ec0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
2ed0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
2ee0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
2ef0: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 Ptr;. int cod
2f00: 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 e;.. dprintf(
2f10: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
2f20: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 if (statePtr->pa
2f30: 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 ssword == NULL)
2f40: 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c 45 {..if (Tcl_EvalE
2f50: 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a x(interp, "tls::
2f60: 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54 password", -1, T
2f70: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 CL_EVAL_GLOBAL)
2f80: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 == TCL_OK) {..
2f90: 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 char *ret = (c
2fa0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 har *) Tcl_GetSt
2fb0: 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 ringResult(inter
2fc0: 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 70 79 p);.. strncpy
2fd0: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 (buf, ret, (size
2fe0: 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 _t) size);..
2ff0: 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72 6c return (int)strl
3000: 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c 73 65 en(ret);..} else
3010: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d {.. return -
3020: 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 1;..}. }..
3030: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
3040: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
3050: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a Ptr->password);.
3060: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 . Tcl_Preserv
3070: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
3080: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f nterp);. Tcl_
3090: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
30a0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
30b0: 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
30c0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
30d0: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 code = Tcl_E
30e0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c valObjEx(interp,
30f0: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 cmdPtr, TCL_EVA
3100: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 L_GLOBAL);. i
3110: 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f f (code != TCL_O
3120: 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 K) {.#if (TCL_MA
3130: 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 JOR_VERSION == 8
3140: 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f ) && (TCL_MINOR_
3150: 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 VERSION < 6)..Tc
3160: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f l_BackgroundErro
3170: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 r(interp);.#else
3180: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
3190: 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 Exception(interp
31a0: 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a , code);.#endif.
31b0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
31c0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
31d0: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c r);.. Tcl_Rel
31e0: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 ease((ClientData
31f0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 ) statePtr);..
3200: 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 if (code == TC
3210: 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 20 2a 72 L_OK) {..char *r
3220: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 et = (char *) Tc
3230: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c l_GetStringResul
3240: 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 66 20 28 t(interp);..if (
3250: 73 74 72 6c 65 6e 28 72 65 74 29 20 3c 20 73 69 strlen(ret) < si
3260: 7a 65 20 2d 20 31 29 20 7b 0a 09 20 20 20 20 73 ze - 1) {.. s
3270: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c trncpy(buf, ret,
3280: 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b (size_t) size);
3290: 0a 09 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 .. Tcl_Releas
32a0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
32b0: 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 72 65 74 nterp);.. ret
32c0: 75 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 urn (int)strlen(
32d0: 72 65 74 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 ret);..}. }.
32e0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
32f0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
3300: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 rp);. return
3310: 2d 31 3b 0a 09 76 65 72 69 66 79 20 3d 20 76 65 -1;..verify = ve
3320: 72 69 66 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c rify;.}.#endif..
3330: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
3340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
3380: 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d CiphersObjCmd --
3390: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 list available
33a0: 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 ciphers. *. *.Th
33b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
33c0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
33d0: 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 ss the "tls::cip
33e0: 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a hers" command. *
33f0: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 .to list availab
3400: 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65 le ciphers, base
3410: 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 d upon protocol
3420: 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 selected.. *. *
3430: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
3440: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
3450: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 t list.. *. * Si
3460: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 de effects:. *.c
3470: 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65 onstructs and de
3480: 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 stroys SSL conte
3490: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d xt (CTX). *. *--
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34e0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
34f0: 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 43 .CiphersObjCmd(C
3500: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
3510: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
3520: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
3530: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
3540: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
3550: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 static const ch
3560: 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 ar *protocols[]
3570: 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 09 22 73 73 = {.."ssl2",."ss
3580: 6c 33 22 2c 09 22 74 6c 73 31 22 2c 09 22 74 6c l3",."tls1",."tl
3590: 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22 2c s1.1", "tls1.2",
35a0: 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a "tls1.3", NULL.
35b0: 20 20 20 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 };. enum
35c0: 70 72 6f 74 6f 63 6f 6c 20 7b 0a 09 54 4c 53 5f protocol {..TLS_
35d0: 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 SSL2, TLS_SSL3,
35e0: 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c TLS_TLS1, TLS_TL
35f0: 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 S1_1, TLS_TLS1_2
3600: 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c , TLS_TLS1_3, TL
3610: 53 5f 4e 4f 4e 45 0a 20 20 20 20 7d 3b 0a 20 20 S_NONE. };.
3620: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
3630: 72 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a r;. SSL_CTX *
3640: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
3650: 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b SSL *ssl = NULL;
3660: 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 . STACK_OF(SS
3670: 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 L_CIPHER) *sk;.
3680: 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 char *cp, buf
3690: 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e [BUFSIZ];. in
36a0: 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 t index, verbose
36b0: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e = 0;.. dprin
36c0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
36d0: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 if ((objc < 2
36e0: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 33 29 29 ) || (objc > 3))
36f0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
3700: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
3710: 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 objv, "protocol
3720: 3f 76 65 72 62 6f 73 65 3f 22 29 3b 0a 09 72 65 ?verbose?");..re
3730: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
3740: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 }. if (Tc
3750: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 l_GetIndexFromOb
3760: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 j(interp, objv[1
3770: 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 ], protocols, "p
3780: 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e rotocol", 0, &in
3790: 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 dex) != TCL_OK)
37a0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
37b0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
37c0: 66 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 f ((objc > 2) &&
37d0: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 Tcl_GetBooleanF
37e0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
37f0: 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 bjv[2], &verbose
3800: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
3810: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
3820: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 ;. }. swit
3830: 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 ch ((enum protoc
3840: 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 ol)index) {..cas
3850: 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 e TLS_SSL2:.#if
3860: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
3870: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 NUMBER >= 0x1010
3880: 31 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 1000L || defined
3890: 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 (NO_SSL2) || def
38a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
38b0: 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 SSL2).. Tcl_A
38c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
38d0: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e rp, protocols[in
38e0: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f dex], ": protoco
38f0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
3900: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 , NULL);.. re
3910: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
3920: 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d #else.. ctx =
3930: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c SSL_CTX_new(SSL
3940: 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 v2_method()); br
3950: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 eak;.#endif..cas
3960: 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 e TLS_SSL3:.#if
3970: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
3980: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
3990: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 20 20 SSL_NO_SSL3)..
39a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
39b0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f lt(interp, proto
39c0: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 cols[index], ":
39d0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
39e0: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
39f0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
3a00: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
3a10: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ctx = SSL_CTX_
3a20: 6e 65 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 new(SSLv3_method
3a30: 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 ()); break;.#end
3a40: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
3a50: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 1:.#if defined(N
3a60: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e O_TLS1) || defin
3a70: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
3a80: 53 31 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 S1).. Tcl_App
3a90: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
3aa0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
3ab0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
3ac0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
3ad0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
3ae0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
3af0: 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 lse.. ctx = S
3b00: 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 SL_CTX_new(TLSv1
3b10: 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 _method()); brea
3b20: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 k;.#endif..case
3b30: 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 TLS_TLS1_1:.#if
3b40: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
3b50: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
3b60: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
3b70: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
3b80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
3b90: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
3ba0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
3bb0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
3bc0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
3bd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
3be0: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f .. ctx = SSL_
3bf0: 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 31 5f CTX_new(TLSv1_1_
3c00: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b method()); break
3c10: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 ;.#endif..case T
3c20: 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 LS_TLS1_2:.#if d
3c30: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
3c40: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
3c50: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a NSSL_NO_TLS1_2).
3c60: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
3c70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
3c80: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
3c90: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
3ca0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
3cb0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
3cc0: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
3cd0: 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 . ctx = SSL_C
3ce0: 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 32 5f 6d TX_new(TLSv1_2_m
3cf0: 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b ethod()); break;
3d00: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
3d10: 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 S_TLS1_3:.#if de
3d20: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
3d30: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
3d40: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 SSL_NO_TLS1_3)..
3d50: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
3d60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
3d70: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
3d80: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
3d90: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
3da0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
3db0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
3dc0: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 ctx = SSL_CT
3dd0: 58 5f 6e 65 77 28 54 4c 53 5f 6d 65 74 68 6f 64 X_new(TLS_method
3de0: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 ());.
3df0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e SSL_CTX_set_min
3e00: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
3e10: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
3e20: 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 ON);.. SSL_CT
3e30: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f X_set_max_proto_
3e40: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 version(ctx, TLS
3e50: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 1_3_VERSION);..
3e60: 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 break;.#endif
3e70: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 ..default:..
3e80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 break;. }.
3e90: 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c if (ctx == NULL
3ea0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
3eb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 esult(interp, RE
3ec0: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 ASON(), NULL);..
3ed0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
3ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 73 6c 20 ;. }. ssl
3ef0: 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a = SSL_new(ctx);.
3f00: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e if (ssl == N
3f10: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
3f20: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
3f30: 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 REASON(), NULL)
3f40: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
3f50: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ctx);..return TC
3f60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
3f70: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
3f80: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
3f90: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 76 LL);.. if (!v
3fa0: 65 72 62 6f 73 65 29 20 7b 0a 09 66 6f 72 20 28 erbose) {..for (
3fb0: 69 6e 64 65 78 20 3d 20 30 3b 20 3b 20 69 6e 64 index = 0; ; ind
3fc0: 65 78 2b 2b 29 20 7b 0a 09 20 20 20 20 63 70 20 ex++) {.. cp
3fd0: 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 = (char*)SSL_get
3fe0: 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 73 73 6c _cipher_list(ssl
3ff0: 2c 20 69 6e 64 65 78 29 3b 0a 09 20 20 20 20 69 , index);.. i
4000: 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 f (cp == NULL) b
4010: 72 65 61 6b 3b 0a 09 20 20 20 20 54 63 6c 5f 4c reak;.. Tcl_L
4020: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4030: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
4040: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
4050: 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 gObj(cp, -1));..
4060: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 }. } else {..
4070: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 sk = SSL_get_cip
4080: 68 65 72 73 28 73 73 6c 29 3b 0a 0a 09 66 6f 72 hers(ssl);...for
4090: 20 28 69 6e 64 65 78 20 3d 20 30 3b 20 69 6e 64 (index = 0; ind
40a0: 65 78 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 ex < sk_SSL_CIPH
40b0: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 6e 64 65 ER_num(sk); inde
40c0: 78 2b 2b 29 20 7b 0a 09 20 20 20 20 72 65 67 69 x++) {.. regi
40d0: 73 74 65 72 20 73 69 7a 65 5f 74 20 69 3b 0a 09 ster size_t i;..
40e0: 20 20 20 20 53 53 4c 5f 43 49 50 48 45 52 5f 64 SSL_CIPHER_d
40f0: 65 73 63 72 69 70 74 69 6f 6e 28 73 6b 5f 53 53 escription(sk_SS
4100: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 L_CIPHER_value(s
4110: 6b 2c 20 69 6e 64 65 78 29 2c 20 62 75 66 2c 20 k, index), buf,
4120: 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a 09 20 sizeof(buf));..
4130: 20 20 20 66 6f 72 20 28 69 20 3d 20 73 74 72 6c for (i = strl
4140: 65 6e 28 62 75 66 29 20 2d 20 31 3b 20 69 20 3b en(buf) - 1; i ;
4150: 20 69 2d 2d 29 20 7b 0a 09 09 69 66 20 28 28 62 i--) {...if ((b
4160: 75 66 5b 69 5d 20 3d 3d 20 27 20 27 29 20 7c 7c uf[i] == ' ') ||
4170: 20 28 62 75 66 5b 69 5d 20 3d 3d 20 27 5c 6e 27 (buf[i] == '\n'
4180: 29 20 7c 7c 20 28 62 75 66 5b 69 5d 20 3d 3d 20 ) || (buf[i] ==
4190: 27 5c 72 27 29 20 7c 7c 20 28 62 75 66 5b 69 5d '\r') || (buf[i]
41a0: 20 3d 3d 20 27 5c 74 27 29 29 20 7b 0a 09 09 20 == '\t')) {...
41b0: 20 20 20 62 75 66 5b 69 5d 20 3d 20 27 5c 30 27 buf[i] = '\0'
41c0: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 ;...} else {...
41d0: 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 20 break;...}..
41e0: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 4c 69 }.. Tcl_Li
41f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4200: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
4210: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4220: 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a 09 Obj(buf, -1));..
4230: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f }. }. SSL_
4240: 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 free(ssl);. S
4250: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
4260: 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 ;.. Tcl_SetOb
4270: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
4280: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
4290: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
42a0: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
42b0: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
42c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4300: 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 --. *. * Handsha
4310: 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 keObjCmd --. *.
4320: 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 *.This command i
4330: 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 s used to verify
4340: 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e whether the han
4350: 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 dshake is comple
4360: 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a te. *.or not.. *
4370: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
4380: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
4390: 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 esult. 1 means h
43a0: 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 andshake complet
43b0: 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 e, 0 means pendi
43c0: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ng.. *. * Side e
43d0: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 ffects:. *.May f
43e0: 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 orce SSL negotia
43f0: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 tion to take pla
4400: 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ce.. *. *-------
4410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
4450: 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 .static int Hand
4460: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 shakeObjCmd(Clie
4470: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
4480: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
4490: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
44a0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
44b0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
44c0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 l_Channel chan;
44d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 /* The ch
44e0: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
44f0: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 ode on. */. S
4500: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 tate *statePtr;
4510: 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 /* client
4520: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
4530: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e ocket */. con
4540: 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 st char *errStr
4550: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
4560: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 ret = 1;. int
4570: 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 err = 0;.. d
4580: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
4590: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
45a0: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
45b0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
45c0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
45d0: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 nel");..return(T
45e0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
45f0: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
4600: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
4610: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
4620: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d gFromObj(objv[1]
4630: 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a , NULL), NULL);.
4640: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
4650: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
4660: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 LL) {..return(TC
4670: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a L_ERROR);. }.
4680: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d . /*. * M
4690: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
46a0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
46b0: 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 st channel.
46c0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
46d0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
46e0: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 chan);. if (T
46f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
4700: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
4710: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
4720: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
4730: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
4740: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
4750: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
4760: 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 han), "\": not a
4770: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
4780: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 ULL);..return(TC
4790: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a L_ERROR);. }.
47a0: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
47b0: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
47c0: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
47d0: 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 ta(chan);.. d
47e0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 printf("Calling
47f0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
4800: 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 ct");. ret =
4810: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
4820: 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 ct(statePtr, &er
4830: 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e r, 1);. dprin
4840: 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 tf("Tls_WaitForC
4850: 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a onnect returned:
4860: 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 %i", ret);..
4870: 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 if (ret < 0 &&
4880: 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ((statePtr->flag
4890: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e s & TLS_TCL_ASYN
48a0: 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 C) && (err == EA
48b0: 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e GAIN))) {..dprin
48c0: 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e tf("Async set an
48d0: 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 d err = EAGAIN")
48e0: 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 ;..ret = 0;.
48f0: 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c } else if (ret <
4900: 20 30 29 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 0) {..errStr =
4910: 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 statePtr->err;..
4920: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 Tcl_ResetResult(
4930: 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 interp);..Tcl_Se
4940: 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 tErrno(err);...i
4950: 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a f (!errStr || (*
4960: 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a errStr == 0)) {.
4970: 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 . errStr = Tc
4980: 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 l_PosixError(int
4990: 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 erp);..}...Tcl_A
49a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
49b0: 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 rp, "handshake f
49c0: 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 ailed: ", errStr
49d0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
49e0: 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 ;..dprintf("Retu
49f0: 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 rning TCL_ERROR
4a00: 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 20 66 with handshake f
4a10: 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 53 ailed: %s", errS
4a20: 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c tr);..return(TCL
4a30: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 20 65 _ERROR);. } e
4a40: 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20 21 lse {..if (err !
4a50: 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69 = 0) {.. dpri
4a60: 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f ntf("Got an erro
4a70: 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 r with a complet
4a80: 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 ed handshake: er
4a90: 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 r = %i", err);..
4aa0: 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 }..ret = 1;.
4ab0: 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 }.. dprintf("
4ac0: 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b Returning TCL_OK
4ad0: 20 77 69 74 68 20 64 61 74 61 20 5c 22 25 69 5c with data \"%i\
4ae0: 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 63 "", ret);. Tc
4af0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
4b00: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e nterp, Tcl_NewIn
4b10: 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 tObj(ret));.
4b20: 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a return(TCL_OK);.
4b30: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
4b40: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a ientData;.}../*.
4b50: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b90: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f -----. *. * Impo
4ba0: 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 rtObjCmd --. *.
4bb0: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
4bc0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 is invoked to p
4bd0: 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c 22 rocess the "ssl"
4be0: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 command. *. *.T
4bf0: 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 he ssl command p
4c00: 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20 61 ushes SSL over a
4c10: 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 (newly connecte
4c20: 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a d) tcp socket. *
4c30: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
4c40: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
4c50: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
4c60: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 e effects:. *.Ma
4c70: 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 y modify the beh
4c80: 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 avior of an IO c
4c90: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d hannel.. *. *---
4ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ce0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
4cf0: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 ImportObjCmd(Cli
4d00: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
4d10: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
4d20: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
4d30: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
4d40: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
4d50: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
4d60: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c ../* The channel
4d70: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
4d80: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 n. */. State
4d90: 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 *statePtr;../* c
4da0: 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 lient state for
4db0: 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 ssl socket */.
4dc0: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 20 SSL_CTX *ctx.
4dd0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
4de0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 Tcl_Obj *scri
4df0: 70 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c pt. = NUL
4e00: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
4e10: 70 61 73 73 77 6f 72 64 09 20 20 20 20 20 20 20 password.
4e20: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
4e30: 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 _DString upperCh
4e40: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
4e50: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c , upperChannelBl
4e60: 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 ocking, upperCha
4e70: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 nnelEncoding, up
4e80: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 perChannelEOFCha
4e90: 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 r;. int idx,
4ea0: 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 len;. int fla
4eb0: 67 73 09 09 20 20 20 20 20 20 20 20 3d 20 54 4c gs.. = TL
4ec0: 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 S_TCL_INIT;.
4ed0: 69 6e 74 20 73 65 72 76 65 72 09 09 20 20 20 20 int server..
4ee0: 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 = 0;./* is c
4ef0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 onnection incomi
4f00: 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 ng or outgoing?
4f10: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 */. char *key
4f20: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e file. = N
4f30: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 ULL;. char *c
4f40: 65 72 74 66 69 6c 65 09 20 20 20 20 20 20 20 20 ertfile.
4f50: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 = NULL;. unsi
4f60: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20 20 gned char *key
4f70: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 .= NULL;. int
4f80: 20 6b 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 key_len
4f90: 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 = 0;.
4fa0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
4fb0: 2a 63 65 72 74 20 20 20 20 20 20 20 20 20 3d 20 *cert =
4fc0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 63 65 NULL;. int ce
4fd0: 72 74 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 rt_len
4fe0: 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 = 0;. c
4ff0: 68 61 72 20 2a 63 69 70 68 65 72 73 09 20 20 20 har *ciphers.
5000: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
5010: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 20 20 char *CAfile.
5020: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
5030: 20 20 63 68 61 72 20 2a 43 41 64 69 72 09 09 20 char *CAdir..
5040: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
5050: 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d char *DHparam
5060: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c s. = NULL
5070: 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 ;. char *mode
5080: 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c l.. = NUL
5090: 4c 3b 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 L;.#ifndef OPENS
50a0: 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54 0a 20 20 20 SL_NO_TLSEXT.
50b0: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
50c0: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
50d0: 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f ;./* hostname fo
50e0: 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e r Server Name In
50f0: 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 dication */.
5100: 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d Tcl_Obj *alpn..=
5110: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 NULL;.#endif.
5120: 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 int ssl2 = 0,
5130: 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e ssl3 = 0;. in
5140: 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 t tls1 = 1, tls1
5150: 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d _1 = 1, tls1_2 =
5160: 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 1, tls1_3 = 1;.
5170: 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 int proto =
5180: 30 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 0;. int verif
5190: 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d y = 0, require =
51a0: 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 3b 0, request = 1;
51b0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
51c0: 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 4f 50 alled");..#if OP
51d0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
51e0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
51f0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 0L && !defined(O
5200: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 20 PENSSL_NO_SSL2)
5210: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
5220: 53 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e S1) && defined(N
5230: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66 O_TLS1_1) && def
5240: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
5250: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
5260: 53 31 5f 33 29 20 26 26 20 64 65 66 69 6e 65 64 S1_3) && defined
5270: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 (NO_SSL3) && !de
5280: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 20 fined(NO_SSL2).
5290: 20 20 20 73 73 6c 32 20 3d 20 31 3b 0a 23 65 6e ssl2 = 1;.#en
52a0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
52b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
52c0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f ) && defined(NO_
52d0: 54 4c 53 31 29 20 26 26 20 64 65 66 69 6e 65 64 TLS1) && defined
52e0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 (NO_TLS1_1) && d
52f0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
5300: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f ) && defined(NO_
5310: 54 4c 53 31 5f 33 29 20 26 26 20 64 65 66 69 6e TLS1_3) && defin
5320: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 ed(NO_SSL2) && !
5330: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
5340: 0a 20 20 20 20 73 73 6c 33 20 3d 20 31 3b 0a 23 . ssl3 = 1;.#
5350: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
5360: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 d(NO_TLS1) || de
5370: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
5380: 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 _TLS1). tls1
5390: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 0;.#endif.#if
53a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
53b0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
53c0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
53d0: 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b . tls1_1 = 0;
53e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
53f0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c ned(NO_TLS1_2) |
5400: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
5410: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 L_NO_TLS1_2).
5420: 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e tls1_2 = 0;.#en
5430: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
5440: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
5450: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
5460: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 _TLS1_3). tls
5470: 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 1_3 = 0;.#endif.
5480: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 . if (objc <
5490: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
54a0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
54b0: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c , objv, "channel
54c0: 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 ?options?");..r
54d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
54e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e . }.. chan
54f0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
5500: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
5510: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
5520: 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e bjv[1], NULL), N
5530: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 ULL);. if (ch
5540: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
5550: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
5560: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
5570: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
5580: 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f * Make sure to
5590: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
55a0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a topmost channel.
55b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e */. chan
55c0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
55d0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 nnel(chan);..
55e0: 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 for (idx = 2; i
55f0: 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b dx < objc; idx++
5600: 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d ) {..char *opt =
5610: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
5620: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c omObj(objv[idx],
5630: 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 NULL);...if (op
5640: 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 t[0] != '-')..
5650: 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 53 54 break;...OPTST
5660: 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 64 69 R("-cadir", CAdi
5670: 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 r);..OPTSTR("-ca
5680: 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a file", CAfile);.
5690: 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 69 .OPTSTR("-certfi
56a0: 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a le", certfile);.
56b0: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 .OPTSTR("-cipher
56c0: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 ", ciphers);..OP
56d0: 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c TOBJ("-command",
56e0: 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 script);..OPTST
56f0: 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 R("-dhparams", D
5700: 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 53 54 Hparams);..OPTST
5710: 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 R("-keyfile", ke
5720: 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 yfile);..OPTSTR(
5730: 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 "-model", model)
5740: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 ;..OPTOBJ("-pass
5750: 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 word", password)
5760: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 ;..OPTBOOL("-req
5770: 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b uire", require);
5780: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 ..OPTBOOL("-requ
5790: 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a est", request);.
57a0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 .OPTBOOL("-serve
57b0: 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 23 69 66 r", server);.#if
57c0: 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ndef OPENSSL_NO_
57d0: 54 4c 53 45 58 54 0a 09 4f 50 54 53 54 52 28 22 TLSEXT..OPTSTR("
57e0: 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 -servername", se
57f0: 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 4f rvername);..OPTO
5800: 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e BJ("-alpn", alpn
5810: 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 4f 50 54 42 );.#endif...OPTB
5820: 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c OOL("-ssl2", ssl
5830: 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 2);..OPTBOOL("-s
5840: 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 sl3", ssl3);..OP
5850: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 TBOOL("-tls1", t
5860: 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 ls1);..OPTBOOL("
5870: 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 -tls1.1", tls1_1
5880: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
5890: 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a s1.2", tls1_2);.
58a0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e .OPTBOOL("-tls1.
58b0: 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 3", tls1_3);..OP
58c0: 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 TBYTE("-cert", c
58d0: 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a ert, cert_len);.
58e0: 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c .OPTBYTE("-key",
58f0: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a key, key_len);.
5900: 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e ..OPTBAD("option
5910: 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 ", "-alpn, -cadi
5920: 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 r, -cafile, -cer
5930: 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 t, -certfile, -c
5940: 69 70 68 65 72 2c 20 2d 63 6f 6d 6d 61 6e 64 2c ipher, -command,
5950: 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 -dhparams, -key
5960: 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 , -keyfile, -mod
5970: 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d el, -password, -
5980: 72 65 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73 require, -reques
5990: 74 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 t, -server, -ser
59a0: 76 65 72 6e 61 6d 65 2c 20 2d 73 73 6c 32 2c 20 vername, -ssl2,
59b0: 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 -ssl3, -tls1, -t
59c0: 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 ls1.1, -tls1.2,
59d0: 6f 72 20 2d 74 6c 73 31 2e 33 22 29 3b 0a 0a 09 or -tls1.3");...
59e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
59f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
5a00: 72 65 71 75 65 73 74 29 09 20 20 20 20 76 65 72 request). ver
5a10: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
5a20: 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 Y_CLIENT_ONCE |
5a30: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b SSL_VERIFY_PEER;
5a40: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 . if (request
5a50: 20 26 26 20 72 65 71 75 69 72 65 29 20 76 65 72 && require) ver
5a60: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
5a70: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 Y_FAIL_IF_NO_PEE
5a80: 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 R_CERT;. if (
5a90: 76 65 72 69 66 79 20 3d 3d 20 30 29 09 76 65 72 verify == 0).ver
5aa0: 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 ify = SSL_VERIFY
5ab0: 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 _NONE;.. prot
5ac0: 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 o |= (ssl2 ? TLS
5ad0: 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 _PROTO_SSL2 : 0)
5ae0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
5af0: 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f ssl3 ? TLS_PROTO
5b00: 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 _SSL3 : 0);.
5b10: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f proto |= (tls1 ?
5b20: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 TLS_PROTO_TLS1
5b30: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
5b40: 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 |= (tls1_1 ? TLS
5b50: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 _PROTO_TLS1_1 :
5b60: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
5b70: 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 (tls1_2 ? TLS_P
5b80: 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 ROTO_TLS1_2 : 0)
5b90: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
5ba0: 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f tls1_3 ? TLS_PRO
5bb0: 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a TO_TLS1_3 : 0);.
5bc0: 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f . /* reset to
5bd0: 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 NULL if blank s
5be0: 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a tring provided *
5bf0: 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26 /. if (cert &
5c00: 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20 & !*cert)..
5c10: 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20 cert.
5c20: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
5c30: 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20 key && !*key)..
5c40: 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20 key.
5c50: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
5c60: 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21 f (certfile && !
5c70: 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20 *certfile)
5c80: 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 certfile.= NU
5c90: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66 LL;. if (keyf
5ca0: 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 ile && !*keyfile
5cb0: 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20 )..keyfile.
5cc0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
5cd0: 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a f (ciphers && !*
5ce0: 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20 ciphers).
5cf0: 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 ciphers.
5d00: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
5d10: 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66 (CAfile && !*CAf
5d20: 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66 ile). CAf
5d30: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ile. = NU
5d40: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69 LL;. if (CAdi
5d50: 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 20 20 r && !*CAdir).
5d60: 20 20 20 20 20 20 43 41 64 69 72 09 20 20 20 20 CAdir.
5d70: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
5d80: 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 if (DHparams &&
5d90: 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20 !*DHparams).
5da0: 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20 DHparams
5db0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 = NULL;..
5dc0: 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 /* new SSL stat
5dd0: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 e */. statePt
5de0: 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 r..= (State *) c
5df0: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 kalloc((unsigned
5e00: 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 ) sizeof(State))
5e10: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 ;. memset(sta
5e20: 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 tePtr, 0, sizeof
5e30: 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 (State));.. s
5e40: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d tatePtr->flags.=
5e50: 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 flags;. stat
5e60: 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 ePtr->interp.= i
5e70: 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 nterp;. state
5e80: 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 Ptr->vflags.= ve
5e90: 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 rify;. stateP
5ea0: 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 tr->err.= "";..
5eb0: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 /* allocate s
5ec0: 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 cript */. if
5ed0: 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 (script) {..(voi
5ee0: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 d) Tcl_GetString
5ef0: 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 FromObj(script,
5f00: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 &len);..if (len)
5f10: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 {.. statePtr
5f20: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 ->callback = scr
5f30: 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e ipt;.. Tcl_In
5f40: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
5f50: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
5f60: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
5f70: 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f allocate passwo
5f80: 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 rd */. if (pa
5f90: 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 ssword) {..(void
5fa0: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
5fb0: 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c romObj(password,
5fc0: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e &len);..if (len
5fd0: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 ) {.. statePt
5fe0: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 r->password = pa
5ff0: 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c ssword;.. Tcl
6000: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _IncrRefCount(st
6010: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
6020: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
6030: 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 if (model != NU
6040: 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b LL) {..int mode;
6050: 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f ../* Get the "mo
6060: 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a del" context */.
6070: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 .chan = Tcl_GetC
6080: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d hannel(interp, m
6090: 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 odel, &mode);..i
60a0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
60b0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
60c0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
60d0: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
60e0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
60f0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
6100: 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 *.. * Make sure
6110: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
6120: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
6130: 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 l.. */..chan = T
6140: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
6150: 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c (chan);..if (Tcl
6160: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
6170: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
6180: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 nnelType()) {..
6190: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
61a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
61b0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
61c0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
61d0: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e (chan),..."\": n
61e0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
61f0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 ", NULL);.. T
6200: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
6210: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
6220: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
6230: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 R;..}..ctx = ((S
6240: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
6250: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
6260: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 a(chan))->ctx;.
6270: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
6280: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 ((ctx = CTX_Init
6290: 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 (statePtr, serve
62a0: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c r, proto, keyfil
62b0: 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 e, certfile, key
62c0: 2c 20 63 65 72 74 2c 0a 09 20 20 20 20 6b 65 79 , cert,.. key
62d0: 5f 6c 65 6e 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 _len, cert_len,
62e0: 43 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 CAdir, CAfile, c
62f0: 69 70 68 65 72 73 2c 20 44 48 70 61 72 61 6d 73 iphers, DHparams
6300: 29 29 20 3d 3d 20 28 53 53 4c 5f 43 54 58 2a 29 )) == (SSL_CTX*)
6310: 30 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 0) {.. Tls_Fr
6320: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
6330: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
6340: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
6350: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 . }.. stat
6360: 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b ePtr->ctx = ctx;
6370: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
6380: 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 We need to make
6390: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 68 sure that the ch
63a0: 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 annel works in b
63b0: 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 inary (for the.
63c0: 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e * encryption
63d0: 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 not to get goof
63e0: 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 ed up).. * W
63f0: 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 e only want to a
6400: 64 6a 75 73 74 20 74 68 65 20 62 75 66 66 65 72 djust the buffer
6410: 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 ing in pre-v2 ch
6420: 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 annels, where.
6430: 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 * each channe
6440: 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d l in the stack m
6450: 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 aintained its ow
6460: 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 n buffers..
6470: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 */. Tcl_DStri
6480: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
6490: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 nnelTranslation)
64a0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
64b0: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e gInit(&upperChan
64c0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 nelBlocking);.
64d0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
64e0: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 t(&upperChannelE
64f0: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c OFChar);. Tcl
6500: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
6510: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
6520: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ng);. Tcl_Get
6530: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
6540: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f terp, chan, "-eo
6550: 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 fchar", &upperCh
6560: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 annelEOFChar);.
6570: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
6580: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
6590: 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 chan, "-encoding
65a0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
65b0: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 Encoding);. T
65c0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
65d0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
65e0: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
65f0: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 , &upperChannelT
6600: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 ranslation);.
6610: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
6620: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
6630: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c an, "-blocking",
6640: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c &upperChannelBl
6650: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c ocking);. Tcl
6660: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
6670: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
6680: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 "-translation",
6690: 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 "binary");. T
66a0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
66b0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
66c0: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 , "-blocking", "
66d0: 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 true");. dpri
66e0: 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 ntf("Consuming T
66f0: 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 cl channel %s",
6700: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
6710: 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 me(chan));. s
6720: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 tatePtr->self =
6730: 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c Tcl_StackChannel
6740: 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 (interp, Tls_Cha
6750: 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 nnelType(), (Cli
6760: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
6770: 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 r, (TCL_READABLE
6780: 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 | TCL_WRITABLE)
6790: 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 , chan);. dpr
67a0: 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 63 68 intf("Created ch
67b0: 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c annel named %s",
67c0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
67d0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
67e0: 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 lf));. if (st
67f0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 atePtr->self ==
6800: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
6810: 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f LL) {../*.. * No
6820: 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e use of Tcl_Even
6830: 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 tuallyFree becau
6840: 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 se no possible T
6850: 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a cl_Preserve... *
6860: 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 /..Tls_Free((cha
6870: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
6880: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
6890: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 R;. }.. Tc
68a0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
68b0: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 on(interp, state
68c0: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 Ptr->self, "-tra
68d0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 nslation", Tcl_D
68e0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
68f0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
6900: 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f tion));. Tcl_
6910: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
6920: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
6930: 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 r->self, "-encod
6940: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e ing", Tcl_DStrin
6950: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
6960: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a nnelEncoding));.
6970: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
6980: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
6990: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
69a0: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c "-eofchar", Tcl
69b0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
69c0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
69d0: 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ar));. Tcl_Se
69e0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
69f0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
6a00: 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e >self, "-blockin
6a10: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 g", Tcl_DStringV
6a20: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
6a30: 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 elBlocking));..
6a40: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c /*. * SSL
6a50: 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a Initialization.
6a60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 */. stat
6a70: 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f ePtr->ssl = SSL_
6a80: 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 new(statePtr->ct
6a90: 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 x);. if (!sta
6aa0: 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f tePtr->ssl) {../
6ab0: 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 * SSL library er
6ac0: 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 ror */..Tcl_Appe
6ad0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
6ae0: 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 "couldn't const
6af0: 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e ruct ssl session
6b00: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 : ", REASON(), (
6b10: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
6b20: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
6b30: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 ) statePtr);..re
6b40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6b50: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4f }..#ifndef O
6b60: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54 PENSSL_NO_TLSEXT
6b70: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e . if (servern
6b80: 61 6d 65 29 20 7b 0a 09 69 66 20 28 21 53 53 4c ame) {..if (!SSL
6b90: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 _set_tlsext_host
6ba0: 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e _name(statePtr->
6bb0: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 ssl, servername)
6bc0: 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 && require) {..
6bd0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
6be0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 sult(interp, "se
6bf0: 74 74 69 6e 67 20 54 4c 53 20 68 6f 73 74 20 6e tting TLS host n
6c00: 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 ame extension fa
6c10: 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 iled", (char *)
6c20: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 NULL);.
6c30: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
6c40: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
6c50: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 retu
6c60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
6c70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
6c80: 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f if (alpn) {../
6c90: 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 63 6c 20 * Convert a Tcl
6ca0: 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 list into a prot
6cb0: 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 ocol-list in wir
6cc0: 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 e-format */..uns
6cd0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 igned char *prot
6ce0: 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 os, *p;..unsigne
6cf0: 64 20 69 6e 74 20 70 72 6f 74 6f 73 6c 65 6e 20 d int protoslen
6d00: 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 6e = 0;..int i, len
6d10: 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20 , cnt;..Tcl_Obj
6d20: 2a 2a 6c 69 73 74 3b 0a 09 69 66 20 28 54 63 6c **list;..if (Tcl
6d30: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 _ListObjGetEleme
6d40: 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e nts(interp, alpn
6d50: 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 , &cnt, &list) !
6d60: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
6d70: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
6d80: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
6d90: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
6da0: 52 4f 52 3b 0a 09 7d 0a 09 2f 2a 20 44 65 74 65 ROR;..}../* Dete
6db0: 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 rmine the memory
6dc0: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 required for th
6dd0: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 e protocol-list
6de0: 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 */..for (i = 0;
6df0: 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a i < cnt; i++) {.
6e00: 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 . Tcl_GetStri
6e10: 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 ngFromObj(list[i
6e20: 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 ], &len);.. i
6e30: 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a f (len > 255) {.
6e40: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
6e50: 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 6c 70 6e lt(interp, "alpn
6e60: 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 protocol name t
6e70: 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 oo long", (char
6e80: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f *) NULL);...Tls_
6e90: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
6ea0: 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 atePtr);...retur
6eb0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
6ec0: 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 6c }.. protosl
6ed0: 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e 3b 0a 09 en += 1 + len;..
6ee0: 7d 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 }../* Build the
6ef0: 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f complete protoco
6f00: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f l-list */..proto
6f10: 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 s = ckalloc(prot
6f20: 6f 73 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 oslen);../* prot
6f30: 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 ocol-lists consi
6f40: 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 st of 8-bit leng
6f50: 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74 th-prefixed, byt
6f60: 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f e strings */..fo
6f70: 72 20 28 69 20 3d 20 30 2c 20 70 20 3d 20 70 72 r (i = 0, p = pr
6f80: 6f 74 6f 73 3b 20 69 20 3c 20 63 6e 74 3b 20 69 otos; i < cnt; i
6f90: 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 ++) {.. char
6fa0: 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 *str = Tcl_GetSt
6fb0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 ringFromObj(list
6fc0: 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 [i], &len);..
6fd0: 20 2a 70 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 20 20 *p++ = len;..
6fe0: 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c memcpy(p, str,
6ff0: 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d len);.. p +=
7000: 20 6c 65 6e 3b 0a 09 7d 0a 09 2f 2a 20 4e 6f 74 len;..}../* Not
7010: 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e e: This function
7020: 73 20 72 65 76 65 72 73 65 73 20 74 68 65 20 72 s reverses the r
7030: 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 eturn value conv
7040: 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 ention */..if (S
7050: 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 SL_set_alpn_prot
7060: 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c os(statePtr->ssl
7070: 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 , protos, protos
7080: 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c len)) {.. Tcl
7090: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
70a0: 74 65 72 70 2c 20 22 66 61 69 6c 65 64 20 74 6f terp, "failed to
70b0: 20 73 65 74 20 61 6c 70 6e 20 70 72 6f 74 6f 63 set alpn protoc
70c0: 6f 6c 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ols", (char *) N
70d0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
70e0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
70f0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 tePtr);.. ckf
7100: 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 ree(protos);..
7110: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7120: 4f 52 3b 0a 09 7d 0a 09 2f 2a 20 53 53 4c 5f 73 OR;..}../* SSL_s
7130: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d et_alpn_protos m
7140: 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 akes a copy of t
7150: 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 he protocol-list
7160: 20 2a 2f 0a 09 63 6b 66 72 65 65 28 70 72 6f 74 */..ckfree(prot
7170: 6f 73 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 os);. }.#endi
7180: 66 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a f.. /*. *
7190: 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 SSL Callbacks.
71a0: 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 */. SSL_s
71b0: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 et_app_data(stat
71c0: 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 ePtr->ssl, (void
71d0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a *)statePtr);./*
71e0: 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 point back to u
71f0: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 s */. SSL_set
7200: 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 _verify(statePtr
7210: 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 ->ssl, verify, V
7220: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a erifyCallback);.
7230: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
7240: 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 info_callback(st
7250: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 49 6e 66 atePtr->ctx, Inf
7260: 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 oCallback);..
7270: 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 /* Create Tcl_C
7280: 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c hannel BIO Handl
7290: 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 er */. stateP
72a0: 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f tr->p_bio.= BIO_
72b0: 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 new_tcl(statePtr
72c0: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a , BIO_NOCLOSE);.
72d0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 statePtr->bi
72e0: 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f o.= BIO_new(BIO_
72f0: 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 f_ssl());.. i
7300: 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 73 74 f (server) {..st
7310: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d atePtr->flags |=
7320: 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b TLS_TCL_SERVER;
7330: 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 ..SSL_set_accept
7340: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d _state(statePtr-
7350: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 >ssl);. } els
7360: 65 20 7b 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e e {..SSL_set_con
7370: 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 nect_state(state
7380: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
7390: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f . SSL_set_bio
73a0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
73b0: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c statePtr->p_bio,
73c0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
73d0: 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 );. BIO_set_s
73e0: 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f sl(statePtr->bio
73f0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c , statePtr->ssl,
7400: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a BIO_NOCLOSE);..
7410: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e /*. * En
7420: 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 d of SSL Init.
7430: 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 */. dprint
7440: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 f("Returning %s"
7450: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
7460: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
7470: 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 elf));. Tcl_S
7480: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
7490: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 (char *) Tcl_Ge
74a0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
74b0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 tePtr->self), TC
74c0: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 L_VOLATILE);..
74d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
74e0: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
74f0: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
7500: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
7510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7540: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e -------. *. * Un
7550: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a importObjCmd --.
7560: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
7570: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
7580: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f to remove the to
7590: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 pmost channel fi
75a0: 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 lter.. *. * Resu
75b0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
75c0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
75d0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
75e0: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 s:. *.May modify
75f0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 the behavior of
7600: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a an IO channel..
7610: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
7620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7650: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
7660: 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 tic int.Unimport
7670: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
7680: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
7690: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
76a0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
76b0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
76c0: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
76d0: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 nnel chan;../* T
76e0: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 he channel to se
76f0: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a t a mode on. */.
7700: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
7710: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
7720: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
7730: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
7740: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
7750: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
7760: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7770: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 }.. chan
7780: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
7790: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 (interp, Tcl_Get
77a0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c String(objv[1]),
77b0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
77c0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
77d0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
77e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
77f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
7800: 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 * Make sure
7810: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
7820: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
7830: 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 l. */. ch
7840: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
7850: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 hannel(chan);..
7860: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
7870: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
7880: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
7890: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
78a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
78b0: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
78c0: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
78d0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 elName(chan),...
78e0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
78f0: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a hannel", NULL);.
7900: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7910: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 R;. }.. if
7920: 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 (Tcl_UnstackCha
7930: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 nnel(interp, cha
7940: 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 n) == TCL_ERROR)
7950: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
7960: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
7970: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
7980: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
7990: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
79a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
79b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
79c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
79d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
79e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 ------. *. * CTX
79f0: 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 _Init -- constru
7a00: 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 ct a SSL_CTX ins
7a10: 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 tance. *. * Resu
7a20: 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 lts:. *.A valid
7a30: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 SSL_CTX instance
7a40: 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 or NULL.. *. *
7a50: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
7a60: 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 .constructs SSL
7a70: 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a context (CTX). *
7a80: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
7a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ac0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
7ad0: 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f c SSL_CTX *.CTX_
7ae0: 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 Init(State *stat
7af0: 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 ePtr, int isServ
7b00: 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 er, int proto, c
7b10: 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 har *keyfile, ch
7b20: 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 ar *certfile,.
7b30: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
7b40: 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 *key, unsigned c
7b50: 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b har *cert, int k
7b60: 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 ey_len, int cert
7b70: 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 _len, char *CAdi
7b80: 72 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 r,. char *CAf
7b90: 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 ile, char *ciphe
7ba0: 72 73 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 rs, char *DHpara
7bb0: 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e ms) {. Tcl_In
7bc0: 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 terp *interp = s
7bd0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
7be0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 . SSL_CTX *ct
7bf0: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 x = NULL;. Tc
7c00: 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 l_DString ds;.
7c10: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 Tcl_DString ds
7c20: 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 1;. int off =
7c30: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 0;. int load
7c40: 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 _private_key;.
7c50: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 const SSL_METH
7c60: 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 OD *method;..
7c70: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
7c80: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 ");.. if (!pr
7c90: 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 oto) {..Tcl_Appe
7ca0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
7cb0: 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f "no valid proto
7cc0: 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 4e col selected", N
7cd0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 ULL);..return (S
7ce0: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 SL_CTX *)0;.
7cf0: 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 }.. /* create
7d00: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
7d10: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
7d20: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 ION_NUMBER >= 0x
7d30: 31 30 31 30 31 30 30 30 4c 20 7c 7c 20 64 65 66 10101000L || def
7d40: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c ined(NO_SSL2) ||
7d50: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7d60: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 _NO_SSL2). if
7d70: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
7d80: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 TLS_PROTO_SSL2)
7d90: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
7da0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
7db0: 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 SL2 protocol not
7dc0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
7dd0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c L);..return (SSL
7de0: 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a _CTX *)0;. }.
7df0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
7e00: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 ed(NO_SSL3) || d
7e10: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7e20: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 O_SSL3). if (
7e30: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
7e40: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 LS_PROTO_SSL3))
7e50: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
7e60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c ult(interp, "SSL
7e70: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 3 protocol not s
7e80: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
7e90: 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 ;..return (SSL_C
7ea0: 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 TX *)0;. }.#e
7eb0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
7ec0: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 (NO_TLS1) || def
7ed0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
7ee0: 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e TLS1). if (EN
7ef0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
7f00: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a _PROTO_TLS1)) {.
7f10: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
7f20: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
7f30: 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .0 protocol not
7f40: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
7f50: 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f );..return (SSL_
7f60: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 CTX *)0;. }.#
7f70: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
7f80: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 d(NO_TLS1_1) ||
7f90: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7fa0: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 NO_TLS1_1). i
7fb0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
7fc0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
7fd0: 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 _1)) {..Tcl_Appe
7fe0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
7ff0: 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 "TLS 1.1 protoc
8000: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
8010: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
8020: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
8030: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
8040: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
8050: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
8060: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
8070: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
8080: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
8090: 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 TO_TLS1_2)) {..T
80a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
80b0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 interp, "TLS 1.2
80c0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
80d0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
80e0: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
80f0: 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e X *)0;. }.#en
8100: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
8110: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
8120: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8130: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 _TLS1_3). if
8140: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
8150: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
8160: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
8170: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
8180: 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c TLS 1.3 protocol
8190: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
81a0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
81b0: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 (SSL_CTX *)0;.
81c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 }.#endif..
81d0: 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b switch (proto) {
81e0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
81f0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
8200: 31 30 31 30 31 30 30 30 4c 20 26 26 20 21 64 65 10101000L && !de
8210: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 fined(NO_SSL2) &
8220: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
8230: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 SL_NO_SSL2).
8240: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 case TLS_PROTO_S
8250: 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 53 SL2:..method = S
8260: 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 SLv2_method();..
8270: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
8280: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
8290: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
82a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
82b0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
82c0: 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f OTO_SSL3:..metho
82d0: 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f 64 d = SSLv3_method
82e0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
82f0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
8300: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 NO_TLS1) && !def
8310: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8320: 54 4c 53 31 29 0a 20 20 20 20 63 61 73 65 20 54 TLS1). case T
8330: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 LS_PROTO_TLS1:..
8340: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d method = TLSv1_m
8350: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
8360: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
8370: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
8380: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
8390: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 SSL_NO_TLS1_1).
83a0: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
83b0: 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f O_TLS1_1:..metho
83c0: 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 d = TLSv1_1_meth
83d0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
83e0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
83f0: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 d(NO_TLS1_2) &&
8400: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
8410: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 _NO_TLS1_2).
8420: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
8430: 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_2:..method =
8440: 20 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 TLSv1_2_method(
8450: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
8460: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
8470: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 O_TLS1_3) && !de
8480: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8490: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 _TLS1_3). cas
84a0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
84b0: 5f 33 3a 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 _3:../*.. * The
84c0: 76 65 72 73 69 6f 6e 20 72 61 6e 67 65 20 69 73 version range is
84d0: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 65 6c constrained bel
84e0: 6f 77 2c 0a 09 20 2a 20 61 66 74 65 72 20 74 68 ow,.. * after th
84f0: 65 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 e context is cre
8500: 61 74 65 64 2e 20 20 55 73 65 20 74 68 65 0a 09 ated. Use the..
8510: 20 2a 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f * generic metho
8520: 64 20 68 65 72 65 2e 0a 09 20 2a 2f 0a 09 6d 65 d here... */..me
8530: 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f thod = TLS_metho
8540: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
8550: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a dif. default:
8560: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
8570: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 SION_NUMBER >= 0
8580: 78 31 30 31 30 30 30 30 30 4c 0a 09 2f 2a 20 4e x10100000L../* N
8590: 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 egotiate highest
85a0: 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 available SSL/T
85b0: 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d LS version */..m
85c0: 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 ethod = TLS_meth
85d0: 6f 64 28 29 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 od();.#else..met
85e0: 68 6f 64 20 3d 20 53 53 4c 76 32 33 5f 6d 65 74 hod = SSLv23_met
85f0: 68 6f 64 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 hod();.#endif.#i
8600: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
8610: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
8620: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 00000L && !defin
8630: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 ed(NO_SSL2) && !
8640: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8650: 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d NO_SSL2)..off |=
8660: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
8670: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 TLS_PROTO_SSL2)
8680: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f ? 0 : SSL_OP_
8690: 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 NO_SSLv2);.#endi
86a0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
86b0: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
86c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
86d0: 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e SL3)..off |= (EN
86e0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
86f0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f _PROTO_SSL3) ?
8700: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 0 : SSL_OP_NO_S
8710: 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 SLv3);.#endif.#i
8720: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
8730: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
8740: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
8750: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
8760: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
8770: 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a TO_TLS1) ? 0 :
8780: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
8790: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
87a0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
87b0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
87c0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
87d0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
87e0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
87f0: 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a TO_TLS1_1) ? 0 :
8800: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
8810: 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 _1);.#endif.#if
8820: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
8830: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
8840: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
8850: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 2)..off |= (ENAB
8860: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
8870: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 ROTO_TLS1_2) ? 0
8880: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
8890: 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 v1_2);.#endif.#i
88a0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
88b0: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
88c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
88d0: 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 1_3)..off |= (EN
88e0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
88f0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f _PROTO_TLS1_3) ?
8900: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
8910: 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a LSv1_3);.#endif.
8920: 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 .break;. }..
8930: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
8940: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 0a 20 _new(method);..
8950: 20 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 if (!ctx) {..
8960: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 return(NULL);.
8970: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 }.. if (get
8980: 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c env(SSLKEYLOGFIL
8990: 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 E)) {..SSL_CTX_s
89a0: 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 et_keylog_callba
89b0: 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 ck(ctx, KeyLogCa
89c0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a llback);. }..
89d0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
89e0: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
89f0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
8a00: 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 LS1_3). if (p
8a10: 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 roto == TLS_PROT
8a20: 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c O_TLS1_3) {..SSL
8a30: 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f _CTX_set_min_pro
8a40: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 to_version(ctx,
8a50: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b TLS1_3_VERSION);
8a60: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 ..SSL_CTX_set_ma
8a70: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 x_proto_version(
8a80: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 ctx, TLS1_3_VERS
8a90: 49 4f 4e 29 3b 0a 0a 09 69 66 20 28 21 69 73 53 ION);...if (!isS
8aa0: 65 72 76 65 72 29 20 7b 0a 09 20 20 20 20 53 53 erver) {.. SS
8ab0: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e L_CTX_set_option
8ac0: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 s(ctx, SSL_OP_CI
8ad0: 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 PHER_SERVER_PREF
8ae0: 45 52 45 4e 43 45 29 3b 0a 09 7d 0a 20 20 20 20 ERENCE);..}.
8af0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 53 }.#endif.. SS
8b00: 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 L_CTX_set_app_da
8b10: 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 ta(ctx, (void*)i
8b20: 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d nterp);./* remem
8b30: 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 ber the interpre
8b40: 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 ter */. SSL_C
8b50: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 TX_set_options(c
8b60: 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b tx, SSL_OP_ALL);
8b70: 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 ./* all SSL bug
8b80: 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 workarounds */.
8b90: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f SSL_CTX_set_o
8ba0: 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 ptions(ctx, off)
8bb0: 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 ;../* disable pr
8bc0: 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 otocol versions
8bd0: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 */.#if OPENSSL_V
8be0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
8bf0: 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20 0x10101000L.
8c00: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 SSL_CTX_set_mode
8c10: 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 (ctx, SSL_MODE_A
8c20: 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 UTO_RETRY);./* h
8c30: 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 andle new handsh
8c40: 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 akes in backgrou
8c50: 6e 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 nd */.#endif.
8c60: 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 SSL_CTX_sess_se
8c70: 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 t_cache_size(ctx
8c80: 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 69 66 20 , 128);.. if
8c90: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c (ciphers != NULL
8ca0: 29 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 )..SSL_CTX_set_c
8cb0: 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 ipher_list(ctx,
8cc0: 63 69 70 68 65 72 73 29 3b 0a 0a 20 20 20 20 2f ciphers);.. /
8cd0: 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 * set some callb
8ce0: 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f acks */. SSL_
8cf0: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
8d00: 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 passwd_cb(ctx, P
8d10: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 asswordCallback)
8d20: 3b 0a 0a 23 69 66 6e 64 65 66 20 42 53 41 46 45 ;..#ifndef BSAFE
8d30: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
8d40: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f _default_passwd_
8d50: 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c cb_userdata(ctx,
8d60: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
8d70: 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 r);.#endif..
8d80: 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 65 /* read a Diffie
8d90: 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 -Hellman paramet
8da0: 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 ers file, or use
8db0: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e the built-in on
8dc0: 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e e */.#ifdef OPEN
8dd0: 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 SSL_NO_DH. if
8de0: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 (DHparams != NU
8df0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
8e00: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
8e10: 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 "DH parameter su
8e20: 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 pport not availa
8e30: 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ble", (char *) N
8e40: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
8e50: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
8e60: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
8e70: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 }.#else.
8e80: 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 {..DH* dh;..if (
8e90: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c DHparams != NULL
8ea0: 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 ) {.. BIO *bi
8eb0: 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 o;.. Tcl_DStr
8ec0: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 ingInit(&ds);..
8ed0: 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 bio = BIO_new
8ee0: 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 _file(F2N(DHpara
8ef0: 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a ms, &ds), "r");.
8f00: 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b . if (!bio) {
8f10: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ...Tcl_DStringFr
8f20: 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 ee(&ds);...Tcl_A
8f30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
8f40: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 rp, "Could not f
8f50: 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 ind DH parameter
8f60: 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a s file", (char *
8f70: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
8f80: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
8f90: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
8fa0: 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 *)0;.. }...
8fb0: 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f dh = PEM_read_
8fc0: 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f bio_DHparams(bio
8fd0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 , NULL, NULL, NU
8fe0: 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 LL);.. BIO_fr
8ff0: 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 ee(bio);.. Tc
9000: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
9010: 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 s);.. if (!dh
9020: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
9030: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
9040: 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 Could not read D
9050: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f H parameters fro
9060: 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a m file", (char *
9070: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
9080: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
9090: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
90a0: 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 *)0;.. }..} e
90b0: 6c 73 65 20 7b 0a 09 20 20 20 20 64 68 20 3d 20 lse {.. dh =
90c0: 67 65 74 5f 64 68 50 61 72 61 6d 73 28 29 3b 0a get_dhParams();.
90d0: 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f .}..SSL_CTX_set_
90e0: 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b tmp_dh(ctx, dh);
90f0: 0a 09 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 20 ..DH_free(dh);.
9100: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 }.#endif..
9110: 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 /* set our cert
9120: 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c ificate */. l
9130: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 oad_private_key
9140: 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72 = 0;. if (cer
9150: 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b tfile != NULL) {
9160: 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b ..load_private_k
9170: 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53 ey = 1;...Tcl_DS
9180: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a tringInit(&ds);.
9190: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 ..if (SSL_CTX_us
91a0: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 e_certificate_fi
91b0: 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 le(ctx, F2N(cert
91c0: 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f file, &ds), SSL_
91d0: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d FILETYPE_PEM) <=
91e0: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 0) {.. Tcl_D
91f0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
9200: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
9210: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
9220: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 unable to set ce
9230: 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 rtificate file "
9240: 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 , certfile, ": "
9250: 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e ,.... REASON
9260: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
9270: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
9280: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
9290: 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 return (SSL_CTX
92a0: 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 *)0;..}. } e
92b0: 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 lse if (cert !=
92c0: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 NULL) {..load_pr
92d0: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 ivate_key = 1;..
92e0: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
92f0: 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 certificate_ASN1
9300: 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 (ctx, cert_len,
9310: 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 cert) <= 0) {..
9320: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
9330: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 ee(&ds);.. Tc
9340: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
9350: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
9360: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 o set certificat
9370: 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 e: ",.... RE
9380: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
9390: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
93a0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
93b0: 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c . return (SSL
93c0: 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 _CTX *)0;..}.
93d0: 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 } else {..certf
93e0: 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 ile = (char*)X50
93f0: 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 9_get_default_ce
9400: 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 rt_file();...if
9410: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 (SSL_CTX_use_cer
9420: 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 tificate_file(ct
9430: 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c x, certfile, SSL
9440: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c _FILETYPE_PEM) <
9450: 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 = 0) {.#if 0..
9460: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
9470: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c e(&ds);.. Tcl
9480: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
9490: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
94a0: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 use default cer
94b0: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c tificate file ",
94c0: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c certfile, ": ",
94d0: 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 .... REASON(
94e0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
94f0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
9500: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 free(ctx);..
9510: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
9520: 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 *)0;.#endif..}.
9530: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 }.. /* set
9540: 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 our private key
9550: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 */. if (load
9560: 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a _private_key) {.
9570: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 .if (keyfile ==
9580: 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e NULL && key == N
9590: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 ULL) {.. keyf
95a0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a ile = certfile;.
95b0: 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 .}...if (keyfile
95c0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
95d0: 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 /* get the priv
95e0: 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 ate key associat
95f0: 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 ed with this cer
9600: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 tificate */..
9610: 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 if (keyfile ==
9620: 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c NULL) {...keyfil
9630: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 e = certfile;..
9640: 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 }... if (S
9650: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 SL_CTX_use_Priva
9660: 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 teKey_file(ctx,
9670: 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 F2N(keyfile, &ds
9680: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ), SSL_FILETYPE_
9690: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 PEM) <= 0) {...T
96a0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
96b0: 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 ds);.../* flush
96c0: 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 the passphrase w
96d0: 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 hich might be le
96e0: 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 ft in the result
96f0: 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 */...Tcl_SetRes
9700: 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c ult(interp, NULL
9710: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 , TCL_STATIC);..
9720: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
9730: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
9740: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 e to set public
9750: 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 key file ", keyf
9760: 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 ile, " ",....
9770: 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 REASON(),
9780: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
9790: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
97a0: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 53 tx);...return (S
97b0: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 20 SL_CTX *)0;..
97c0: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 }.. Tcl_DStr
97d0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 ingFree(&ds);...
97e0: 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 } else if (key !
97f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 = NULL) {.. i
9800: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 f (SSL_CTX_use_P
9810: 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 rivateKey_ASN1(E
9820: 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 VP_PKEY_RSA, ctx
9830: 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c , key,key_len) <
9840: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 = 0) {...Tcl_DSt
9850: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
9860: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 ./* flush the pa
9870: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d ssphrase which m
9880: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 ight be left in
9890: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 the result */...
98a0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
98b0: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f terp, NULL, TCL_
98c0: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 STATIC);...Tcl_A
98d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
98e0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
98f0: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 et public key: "
9900: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 , REASON(), (cha
9910: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
9920: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
9930: 0a 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 ...return (SSL_C
9940: 54 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 TX *)0;.. }..
9950: 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f }../* Now we kno
9960: 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 w that a key and
9970: 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 cert have been
9980: 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 set against.. *
9990: 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 the SSL context
99a0: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 */..if (!SSL_CTX
99b0: 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b _check_private_k
99c0: 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 ey(ctx)) {..
99d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
99e0: 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 (interp, "privat
99f0: 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d e key does not m
9a00: 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69 atch the certifi
9a10: 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 cate public key"
9a20: 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20 ,.... (char
9a30: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
9a40: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
9a50: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 ;.. return (S
9a60: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 SL_CTX *)0;..}.
9a70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 }.. /* Set
9a80: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 43 41 verification CA
9a90: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 s */. Tcl_DSt
9aa0: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 ringInit(&ds);.
9ab0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
9ac0: 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20 69 66 it(&ds1);. if
9ad0: 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f (!SSL_CTX_load_
9ae0: 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 verify_locations
9af0: 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 (ctx, F2N(CAfile
9b00: 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 64 69 , &ds), F2N(CAdi
9b10: 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 r, &ds1)) ||..!S
9b20: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 SL_CTX_set_defau
9b30: 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 lt_verify_paths(
9b40: 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 ctx)) {.#if 0..T
9b50: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
9b60: 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e ds);..Tcl_DStrin
9b70: 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a gFree(&ds1);../*
9b80: 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 Don't currently
9b90: 20 63 61 72 65 20 69 66 20 74 68 69 73 20 66 61 care if this fa
9ba0: 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 ils */..Tcl_Appe
9bb0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
9bc0: 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76 65 "SSL default ve
9bd0: 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c 20 52 rify paths: ", R
9be0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
9bf0: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
9c00: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
9c10: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 turn (SSL_CTX *)
9c20: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0;.#endif. }.
9c30: 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f . /* https://
9c40: 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f sourceforge.net/
9c50: 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a p/tls/bugs/57/ *
9c60: 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 /. /* XXX:TOD
9c70: 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 O: Let the user
9c80: 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 supply values he
9c90: 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f re instead of so
9ca0: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 mething that exi
9cb0: 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 sts on the files
9cc0: 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 ystem */. if
9cd0: 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 (CAfile != NULL)
9ce0: 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 {..STACK_OF(X50
9cf0: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 9_NAME) *certNam
9d00: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c es = SSL_load_cl
9d10: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e ient_CA_file(F2N
9d20: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a (CAfile, &ds));.
9d30: 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 .if (certNames !
9d40: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 = NULL) {.. S
9d50: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
9d60: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 t_CA_list(ctx, c
9d70: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 ertNames);..}.
9d80: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
9d90: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 ringFree(&ds);.
9da0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
9db0: 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 ee(&ds1);. re
9dc0: 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a turn ctx;.}.../*
9dd0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
9de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e10: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 ------. *. * Sta
9e20: 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 tusObjCmd -- ret
9e30: 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 urn certificate
9e40: 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 for connected pe
9e50: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
9e60: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
9e70: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
9e80: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
9e90: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
9ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ee0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
9ef0: 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 t.StatusObjCmd(C
9f00: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
9f10: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
9f20: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
9f30: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
9f40: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
9f50: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
9f60: 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 ;. X509 *peer
9f70: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f ;. Tcl_Obj *o
9f80: 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 bjPtr;. Tcl_C
9f90: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 hannel chan;.
9fa0: 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 char *channelNa
9fb0: 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 me, *ciphers;.
9fc0: 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 23 69 66 6e int mode;.#ifn
9fd0: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 def OPENSSL_NO_T
9fe0: 4c 53 45 58 54 0a 20 20 20 20 63 6f 6e 73 74 20 LSEXT. const
9ff0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
a000: 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e roto;. unsign
a010: 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 23 65 6e 64 ed int len;.#end
a020: 69 66 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 if.. dprintf(
a030: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
a040: 73 77 69 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a switch (objc) {.
a050: 09 63 61 73 65 20 32 3a 0a 09 20 20 20 20 63 68 .case 2:.. ch
a060: 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f annelName = Tcl_
a070: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
a080: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b (objv[1], NULL);
a090: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 .. break;...c
a0a0: 61 73 65 20 33 3a 0a 09 20 20 20 20 69 66 20 28 ase 3:.. if (
a0b0: 21 73 74 72 63 6d 70 20 28 54 63 6c 5f 47 65 74 !strcmp (Tcl_Get
a0c0: 53 74 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 String (objv[1])
a0d0: 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 , "-local")) {..
a0e0: 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 .channelName = T
a0f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
a100: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c Obj(objv[2], NUL
a110: 4c 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 L);...break;..
a120: 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65 }.. /* else
a130: 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2e 2e fall-through ..
a140: 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 . */.#if defined
a150: 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 20 20 20 20 (__GNUC__)..
a160: 5f 5f 61 74 74 72 69 62 75 74 65 5f 5f 28 28 66 __attribute__((f
a170: 61 6c 6c 74 68 72 6f 75 67 68 29 29 3b 0a 23 65 allthrough));.#e
a180: 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 ndif..default:..
a190: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d Tcl_WrongNum
a1a0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
a1b0: 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 objv, "?-local?
a1c0: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 20 channel");..
a1d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a1e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 ;. }.. cha
a1f0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
a200: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e el(interp, chann
a210: 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a elName, &mode);.
a220: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
a230: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
a240: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
a250: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
a260: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b /*. * Mak
a270: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
a280: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
a290: 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f channel. */
a2a0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
a2b0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
a2c0: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c an);. if (Tcl
a2d0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
a2e0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
a2f0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
a300: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
a310: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
a320: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
a330: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
a340: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 n),..."\": not a
a350: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
a360: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
a370: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
a380: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 statePtr = (S
a390: 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 tate *) Tcl_GetC
a3a0: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
a3b0: 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 ta(chan);. if
a3c0: 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
a3d0: 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 peer = SSL_get_p
a3e0: 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 eer_certificate(
a3f0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
a400: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 } else {..pe
a410: 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 er = SSL_get_cer
a420: 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 tificate(statePt
a430: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 r->ssl);. }.
a440: 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 if (peer) {..
a450: 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 objPtr = Tls_New
a460: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 X509Obj(interp,
a470: 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 peer);..if (objc
a480: 20 3d 3d 20 32 29 20 7b 20 58 35 30 39 5f 66 72 == 2) { X509_fr
a490: 65 65 28 70 65 65 72 29 3b 20 7d 0a 20 20 20 20 ee(peer); }.
a4a0: 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 } else {..objPtr
a4b0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
a4c0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 j(0, NULL);.
a4d0: 7d 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f }.. Tcl_ListO
a4e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
a4f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
a500: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
a510: 28 22 73 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a ("sbits", -1));.
a520: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
a530: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
a540: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
a550: 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 _NewIntObj(SSL_g
a560: 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 et_cipher_bits(s
a570: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 tatePtr->ssl, NU
a580: 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 LL)));.. ciph
a590: 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c ers = (char*)SSL
a5a0: 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 _get_cipher(stat
a5b0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
a5c0: 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 if ((ciphers !=
a5d0: 4e 55 4c 4c 29 20 26 26 20 28 73 74 72 63 6d 70 NULL) && (strcmp
a5e0: 28 63 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e 45 (ciphers, "(NONE
a5f0: 29 22 29 20 21 3d 20 30 29 29 20 7b 0a 09 54 63 )") != 0)) {..Tc
a600: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
a610: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
a620: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
a630: 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22 ringObj("cipher"
a640: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
a650: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
a660: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
a670: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
a680: 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 bj(SSL_get_ciphe
a690: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 r(statePtr->ssl)
a6a0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 , -1));. }..#
a6b0: 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e ifndef OPENSSL_N
a6c0: 4f 5f 54 4c 53 45 58 54 0a 20 20 20 20 2f 2a 20 O_TLSEXT. /*
a6d0: 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 Report the selec
a6e0: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 ted protocol as
a6f0: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 a result of the
a700: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 negotiation */.
a710: 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e SSL_get0_alpn
a720: 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 _selected(stateP
a730: 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c tr->ssl, &proto,
a740: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f &len);. Tcl_
a750: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
a760: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
a770: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
a780: 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 ngObj("alpn", -1
a790: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
a7a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
a7b0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
a7c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
a7d0: 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c j((char *)proto,
a7e0: 20 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 23 65 6e (int)len));.#en
a7f0: 64 69 66 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 dif. Tcl_List
a800: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
a810: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
a820: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
a830: 6a 28 22 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 j("version", -1)
a840: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
a850: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
a860: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
a870: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
a880: 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e (SSL_get_version
a890: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c (statePtr->ssl),
a8a0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f -1));.. Tcl_
a8b0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
a8c0: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
a8d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
a8e0: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
a8f0: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
a900: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
a910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a940: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f -------. *. * Co
a950: 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 nnectionInfoObjC
a960: 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e md -- return con
a970: 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f nection info fro
a980: 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a m OpenSSL.. *. *
a990: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c Results:. *.A l
a9a0: 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f ist of connectio
a9b0: 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d n info. *. *---
a9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aa00: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
aa10: 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f ConnectionInfoO
aa20: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
aa30: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
aa40: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
aa50: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
aa60: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
aa70: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ) {. Tcl_Chan
aa80: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 nel chan;../* Th
aa90: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 e channel to set
aaa0: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 a mode on. */.
aab0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
aac0: 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 tr;../* client s
aad0: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 tate for ssl soc
aae0: 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f ket */. Tcl_O
aaf0: 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 bj *objPtr;.
ab00: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a const SSL *ssl;.
ab10: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 const SSL_CI
ab20: 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 0a 23 PHER *cipher;..#
ab30: 69 66 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e if !defined(OPEN
ab40: 53 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54 29 20 26 SSL_NO_TLSEXT) &
ab50: 26 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f & OPENSSL_VERSIO
ab60: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 N_NUMBER >= 0x10
ab70: 30 30 32 30 30 30 4c 0a 20 20 20 20 63 6f 6e 73 002000L. cons
ab80: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
ab90: 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 *proto;. unsi
aba0: 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 23 65 gned int len;.#e
abb0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
abc0: 28 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 (HAVE_SSL_COMPRE
abd0: 53 53 49 4f 4e 29 20 26 26 20 4f 50 45 4e 53 53 SSION) && OPENSS
abe0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
abf0: 20 3e 3d 20 30 78 31 30 30 30 32 30 30 30 4c 0a >= 0x10002000L.
ac00: 20 20 20 20 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d const COMP_M
ac10: 45 54 48 4f 44 20 2a 63 6f 6d 70 3b 0a 23 65 6e ETHOD *comp;.#en
ac20: 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a dif.. if (obj
ac30: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
ac40: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
ac50: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
ac60: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
ac70: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
ac80: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
ac90: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
aca0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
acb0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
acc0: 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 1], NULL), NULL)
acd0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
ace0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
acf0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 NULL) {..return(
ad00: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
ad10: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
ad20: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
ad30: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
ad40: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20 20 most channel.
ad50: 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 */. chan =
ad60: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
ad70: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 l(chan);. if
ad80: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
ad90: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
ada0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
adb0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
adc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
add0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
ade0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
adf0: 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 (chan), "\": not
ae00: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
ae10: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 NULL);..return(
ae20: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
ae30: 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 }.. objPtr =
ae40: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
ae50: 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a , NULL);.. /*
ae60: 20 47 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 Get connection
ae70: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 state */. sta
ae80: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
ae90: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 )Tcl_GetChannelI
aea0: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e nstanceData(chan
aeb0: 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 );. ssl = sta
aec0: 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 tePtr->ssl;.
aed0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
aee0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
aef0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
af00: 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 74 65 StringObj("state
af10: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 ", -1));. if
af20: 28 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e (SSL_is_init_fin
af30: 69 73 68 65 64 28 73 73 6c 29 29 20 7b 0a 09 54 ished(ssl)) {..T
af40: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
af50: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
af60: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
af70: 74 72 69 6e 67 4f 62 6a 28 22 65 73 74 61 62 6c tringObj("establ
af80: 69 73 68 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20 ished", -1));.
af90: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 53 53 4c } else if (SSL
afa0: 5f 69 6e 5f 69 6e 69 74 28 73 73 6c 29 29 20 7b _in_init(ssl)) {
afb0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
afc0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
afd0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
afe0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 61 6e ewStringObj("han
aff0: 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 20 dshake", -1));.
b000: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c } else {..Tcl
b010: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
b020: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
b030: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
b040: 69 6e 67 4f 62 6a 28 22 69 6e 69 74 69 61 6c 69 ingObj("initiali
b050: 7a 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 20 20 20 zing", -1));.
b060: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 }.. /* Get s
b070: 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 erver name */.
b080: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
b090: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
b0a0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
b0b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 72 ewStringObj("ser
b0c0: 76 65 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ver", -1));.
b0d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
b0e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
b0f0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
b100: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 StringObj(SSL_ge
b110: 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c t_servername(ssl
b120: 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 , TLSEXT_NAMETYP
b130: 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 E_host_name), -1
b140: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 ));.. /* Get
b150: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 protocol */.
b160: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
b170: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
b180: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
b190: 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f StringObj("proto
b1a0: 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 col", -1));.
b1b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
b1c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
b1d0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
b1e0: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 StringObj(SSL_ge
b1f0: 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 t_version(ssl),
b200: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 -1));.. /* Ge
b210: 74 20 63 69 70 68 65 72 20 2a 2f 0a 20 20 20 20 t cipher */.
b220: 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 cipher = SSL_get
b230: 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 _current_cipher(
b240: 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 ssl);. if (ci
b250: 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a pher != NULL) {.
b260: 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a .char buf[BUFSIZ
b270: 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 ] = {0};..int bi
b280: 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 ts, alg_bits;...
b290: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
b2a0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
b2b0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
b2c0: 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 StringObj("ciphe
b2d0: 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c r", -1));..Tcl_L
b2e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
b2f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
b300: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
b310: 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f gObj(SSL_CIPHER_
b320: 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 get_name(cipher)
b330: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
b340: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
b350: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
b360: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
b370: 62 6a 28 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d bj("standard_nam
b380: 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c e", -1));..Tcl_L
b390: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
b3a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
b3b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
b3c0: 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f gObj(SSL_CIPHER_
b3d0: 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 standard_name(ci
b3e0: 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 62 pher), -1));...b
b3f0: 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 its = SSL_CIPHER
b400: 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 _get_bits(cipher
b410: 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 54 , &alg_bits);..T
b420: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
b430: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
b440: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
b450: 74 72 69 6e 67 4f 62 6a 28 22 62 69 74 73 22 2c tringObj("bits",
b460: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
b470: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
b480: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
b490: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 62 Tcl_NewIntObj(b
b4a0: 69 74 73 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 its));..Tcl_List
b4b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
b4c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
b4d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
b4e0: 6a 28 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c j("secret_bits",
b4f0: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
b500: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
b510: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
b520: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 Tcl_NewIntObj(a
b530: 6c 67 5f 62 69 74 73 29 29 3b 0a 09 2f 2a 20 61 lg_bits));../* a
b540: 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 lg_bits is actua
b550: 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 l key secret bit
b560: 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61 s. If use bits a
b570: 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 nd secret (algor
b580: 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 ithm) bits diffe
b590: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 74 68 r,. th
b5a0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 e rest of the bi
b5b0: 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e ts are fixed, i.
b5c0: 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 e. for limited e
b5d0: 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 xport ciphers (b
b5e0: 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 09 54 63 its < 56) */..Tc
b5f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
b600: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
b610: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
b620: 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 5f 76 65 72 ringObj("min_ver
b630: 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 sion", -1));..Tc
b640: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
b650: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
b660: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
b670: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 ringObj(SSL_CIPH
b680: 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 ER_get_version(c
b690: 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 ipher), -1));...
b6a0: 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 if (SSL_CIPHER_d
b6b0: 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 escription(ciphe
b6c0: 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 r, buf, sizeof(b
b6d0: 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a uf)) != NULL) {.
b6e0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
b6f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
b700: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
b710: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
b720: 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 2d 31 description", -1
b730: 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ));.. Tcl_Lis
b740: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
b750: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
b760: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
b770: 62 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a 09 7d bj(buf, -1));..}
b780: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
b790: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
b7a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
b7b0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
b7c0: 6e 67 4f 62 6a 28 22 72 65 6e 65 67 6f 74 69 61 ngObj("renegotia
b7d0: 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 tion", -1));.
b7e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
b7f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
b800: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
b810: 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 53 53 4c wStringObj(..SSL
b820: 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 _get_secure_rene
b830: 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 gotiation_suppor
b840: 74 28 73 73 6c 29 20 3f 20 22 61 6c 6c 6f 77 65 t(ssl) ? "allowe
b850: 64 22 20 3a 20 22 64 69 73 61 6c 6c 6f 77 65 64 d" : "disallowed
b860: 22 2c 20 2d 31 29 29 3b 0a 0a 23 69 66 20 21 64 ", -1));..#if !d
b870: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
b880: 4f 5f 54 4c 53 45 58 54 29 20 26 26 20 4f 50 45 O_TLSEXT) && OPE
b890: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
b8a0: 42 45 52 20 3e 3d 20 30 78 31 30 30 30 32 30 30 BER >= 0x1000200
b8b0: 30 4c 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 0L. /* Report
b8c0: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 the selected pr
b8d0: 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 otocol as a resu
b8e0: 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 lt of the negoti
b8f0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c ation */. SSL
b900: 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 _get0_alpn_selec
b910: 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c ted(ssl, &proto,
b920: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f &len);. Tcl_
b930: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
b940: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
b950: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
b960: 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 ngObj("alpn", -1
b970: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
b980: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
b990: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
b9a0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
b9b0: 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c j((char *)proto,
b9c0: 20 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 23 65 6e (int)len));.#en
b9d0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 dif.. /* Sess
b9e0: 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ion info */.
b9f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
ba00: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
ba10: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
ba20: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 StringObj("sessi
ba30: 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d 31 29 29 on_reused", -1))
ba40: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
ba50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
ba60: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
ba70: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c cl_NewIntObj(SSL
ba80: 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 _session_reused(
ba90: 73 73 6c 29 29 29 3b 0a 0a 23 69 66 20 64 65 66 ssl)));..#if def
baa0: 69 6e 65 64 28 48 41 56 45 5f 53 53 4c 5f 43 4f ined(HAVE_SSL_CO
bab0: 4d 50 52 45 53 53 49 4f 4e 29 20 26 26 20 4f 50 MPRESSION) && OP
bac0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
bad0: 4d 42 45 52 20 3e 3d 20 30 78 31 30 30 30 32 30 MBER >= 0x100020
bae0: 30 30 4c 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 00L. /* Compr
baf0: 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 ession info */.
bb00: 20 20 20 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 comp = SSL_ge
bb10: 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 t_current_compre
bb20: 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 ssion(ssl);.
bb30: 69 66 20 28 63 6f 6d 70 20 21 3d 20 4e 55 4c 4c if (comp != NULL
bb40: 29 20 7b 0a 09 65 78 70 61 6e 73 69 6f 6e 20 3d ) {..expansion =
bb50: 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 SSL_get_current
bb60: 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b _expansion(ssl);
bb70: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
bb80: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
bb90: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
bba0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d ewStringObj("com
bbb0: 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b pression", -1));
bbc0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
bbd0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
bbe0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
bbf0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
bc00: 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f COMP_get_name(co
bc10: 6d 70 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f mp), -1));..Tcl_
bc20: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
bc30: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
bc40: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
bc50: 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e ngObj("expansion
bc60: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
bc70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
bc80: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
bc90: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
bca0: 4f 62 6a 28 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 Obj(SSL_COMP_get
bcb0: 5f 6e 61 6d 65 28 65 78 70 61 6e 73 69 6f 6e 29 _name(expansion)
bcc0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 23 65 , -1));. }.#e
bcd0: 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 ndif.. Tcl_Se
bce0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
bcf0: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
bd00: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
bd10: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
bd20: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
bd30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
bd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bd70: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 -----. *. * Vers
bd80: 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 ionObjCmd -- ret
bd90: 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 urn version stri
bda0: 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e ng from OpenSSL.
bdb0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
bdc0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
bdd0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
bde0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
bdf0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
be00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
be40: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 */.static int.V
be50: 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 ersionObjCmd(Cli
be60: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
be70: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
be80: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
be90: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
bea0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
beb0: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a cl_Obj *objPtr;.
bec0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
bed0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a lled");.. obj
bee0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 Ptr = Tcl_NewStr
bef0: 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 ingObj(OPENSSL_V
bf00: 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 ERSION_TEXT, -1)
bf10: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a ;. Tcl_SetObj
bf20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
bf30: 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 bjPtr);.. ret
bf40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
bf50: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
bf60: 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 Data;..objc = ob
bf70: 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 jc;..objv = objv
bf80: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
bf90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
bfd0: 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 *. * MiscObjCmd
bfe0: 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 -- misc commands
bff0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
c000: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
c010: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
c020: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
c030: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
c040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
c080: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d */.static int.M
c090: 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 iscObjCmd(Client
c0a0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
c0b0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
c0c0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
c0d0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
c0e0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 jv[]) {. stat
c0f0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 ic const char *c
c100: 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 ommands [] = { "
c110: 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 req", "strreq",
c120: 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d NULL };. enum
c130: 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 command { C_REQ
c140: 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 , C_STRREQ, C_DU
c150: 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 MMY };. int c
c160: 6d 64 2c 20 69 73 53 74 72 3b 0a 20 20 20 20 63 md, isStr;. c
c170: 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 har buffer[16384
c180: 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ];.. dprintf(
c190: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
c1a0: 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a if (objc < 2) {.
c1b0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
c1c0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
c1d0: 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f v, "subcommand ?
c1e0: 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e args?");..return
c1f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
c200: 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 }. if (Tcl_Ge
c210: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e tIndexFromObj(in
c220: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 terp, objv[1], c
c230: 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e ommands, "comman
c240: 64 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 d", 0,&cmd) != T
c250: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
c260: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
c270: 7d 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 }.. isStr = (
c280: 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 cmd == C_STRREQ)
c290: 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 ;. switch ((e
c2a0: 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 num command) cmd
c2b0: 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a ) {..case C_REQ:
c2c0: 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a ..case C_STRREQ:
c2d0: 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 {.. EVP_PKEY
c2e0: 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 *pkey=NULL;..
c2f0: 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c X509 *cert=NUL
c300: 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d L;.. X509_NAM
c310: 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 E *name=NULL;..
c320: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 Tcl_Obj **lis
c330: 74 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 tv;.. int lis
c340: 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 tc,i;... BIO
c350: 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 *out=NULL;...
c360: 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b char *k_C="",*k
c370: 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a _ST="",*k_L="",*
c380: 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c k_O="",*k_OU="",
c390: 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 *k_CN="",*k_Emai
c3a0: 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 l="";.. char
c3b0: 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c *keyout,*pemout,
c3c0: 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b *str;.. int k
c3d0: 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c eysize,serial=0,
c3e0: 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f days=365;..#if O
c3f0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
c400: 55 4d 42 45 52 20 3c 3d 20 30 78 31 30 31 30 30 UMBER <= 0x10100
c410: 30 30 30 4c 0a 09 20 20 20 20 52 53 41 20 2a 72 000L.. RSA *r
c420: 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 69 66 sa = NULL;.#elif
c430: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
c440: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
c450: 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 0000L.. BIGNU
c460: 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 M *bne = NULL;..
c470: 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e RSA *rsa = N
c480: 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ULL;.#else..
c490: 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 EVP_PKEY_CTX *ct
c4a0: 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 x = NULL;.#endif
c4b0: 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 ... if ((objc
c4c0: 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 <5) || (objc>6))
c4d0: 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 {...Tcl_WrongNu
c4e0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c mArgs(interp, 2,
c4f0: 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 objv, "keysize
c500: 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 keyfile certfile
c510: 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 ?info?");...ret
c520: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
c530: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 }... if (
c540: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 Tcl_GetIntFromOb
c550: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 j(interp, objv[2
c560: 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 ], &keysize) !=
c570: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 TCL_OK) {...retu
c580: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
c590: 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 }.. keyout
c5a0: 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f =Tcl_GetString(o
c5b0: 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 bjv[3]);.. pe
c5c0: 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 mout=Tcl_GetStri
c5d0: 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 ng(objv[4]);..
c5e0: 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 if (isStr) {..
c5f0: 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 .Tcl_SetVar(inte
c600: 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b rp,keyout,"",0);
c610: 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e ...Tcl_SetVar(in
c620: 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 terp,pemout,"",0
c630: 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 );.. }...
c640: 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 if (objc>=6) {..
c650: 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a .if (Tcl_ListObj
c660: 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 GetElements(inte
c670: 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 rp, objv[5],....
c680: 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 &listc, &listv)
c690: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 != TCL_OK) {...
c6a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
c6b0: 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 ROR;...}....if (
c6c0: 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 (listc%2) != 0)
c6d0: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 {... Tcl_SetR
c6e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e esult(interp,"In
c6f0: 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d formation list m
c700: 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 ust have even nu
c710: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
c720: 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 s",NULL);...
c730: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
c740: 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 ;...}...for (i=0
c750: 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 ; i<listc; i+=2)
c760: 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c {... str=Tcl
c770: 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
c780: 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 [i]);... if (
c790: 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 strcmp(str,"days
c7a0: 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 ")==0) {....if (
c7b0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 Tcl_GetIntFromOb
c7c0: 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 j(interp,listv[i
c7d0: 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f +1],&days)!=TCL_
c7e0: 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 OK).... retur
c7f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 n TCL_ERROR;...
c800: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
c810: 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c rcmp(str,"serial
c820: 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 ")==0) {....if (
c830: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 Tcl_GetIntFromOb
c840: 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 j(interp,listv[i
c850: 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 +1],&serial)!=TC
c860: 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 L_OK).... ret
c870: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
c880: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
c890: 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d strcmp(str,"C")=
c8a0: 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c =0) {....k_C=Tcl
c8b0: 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
c8c0: 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
c8d0: 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
c8e0: 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a str,"ST")==0) {.
c8f0: 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 ...k_ST=Tcl_GetS
c900: 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
c910: 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
c920: 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
c930: 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c L")==0) {....k_L
c940: 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
c950: 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
c960: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
c970: 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 cmp(str,"O")==0)
c980: 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 {....k_O=Tcl_Ge
c990: 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
c9a0: 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
c9b0: 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
c9c0: 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 ,"OU")==0) {....
c9d0: 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 k_OU=Tcl_GetStri
c9e0: 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
c9f0: 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
ca00: 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 (strcmp(str,"CN"
ca10: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d )==0) {....k_CN=
ca20: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
ca30: 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
ca40: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
ca50: 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d mp(str,"Email")=
ca60: 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c =0) {....k_Email
ca70: 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
ca80: 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
ca90: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 } else {....Tc
caa0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
cab0: 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 rp,"Unknown para
cac0: 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 meter",NULL);...
cad0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
cae0: 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 R;... }...}..
caf0: 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 }..#if OPENS
cb00: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
cb10: 52 20 3c 3d 20 30 78 31 30 31 30 30 30 30 30 4c R <= 0x10100000L
cb20: 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 .. pkey = EVP
cb30: 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 _PKEY_new();..
cb40: 20 20 72 73 61 20 3d 20 52 53 41 5f 67 65 6e 65 rsa = RSA_gene
cb50: 72 61 74 65 5f 6b 65 79 28 6b 65 79 73 69 7a 65 rate_key(keysize
cb60: 2c 20 30 78 31 30 30 30 31 2c 20 4e 55 4c 4c 2c , 0x10001, NULL,
cb70: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 NULL);.. if
cb80: 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (pkey == NULL ||
cb90: 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 rsa == NULL ||
cba0: 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e !EVP_PKEY_assign
cbb0: 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 _RSA(pkey, rsa))
cbc0: 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 {...EVP_PKEY_fr
cbd0: 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 ee(pkey);.../* R
cbe0: 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 SA_free(rsa); fr
cbf0: 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f eed by EVP_PKEY_
cc00: 66 72 65 65 20 2a 2f 0a 23 65 6c 69 66 20 4f 50 free */.#elif OP
cc10: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
cc20: 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
cc30: 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 0L.. bne = BN
cc40: 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 _new();.. rsa
cc50: 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 = RSA_new();..
cc60: 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b pkey = EVP_PK
cc70: 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 EY_new();.. i
cc80: 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c f (bne == NULL |
cc90: 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c | rsa == NULL ||
cca0: 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c pkey == NULL ||
ccb0: 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e !BN_set_word(bn
ccc0: 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 e,RSA_F4) ||...!
ccd0: 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 RSA_generate_key
cce0: 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 _ex(rsa, keysize
ccf0: 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 , bne, NULL) ||
cd00: 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e !EVP_PKEY_assign
cd10: 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 _RSA(pkey, rsa))
cd20: 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 {...EVP_PKEY_fr
cd30: 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 ee(pkey);.../* R
cd40: 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 SA_free(rsa); fr
cd50: 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f eed by EVP_PKEY_
cd60: 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 free */...BN_fre
cd70: 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 e(bne);.#else..
cd80: 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 pkey = EVP_RS
cd90: 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 A_gen((unsigned
cda0: 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 int) keysize);..
cdb0: 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b ctx = EVP_PK
cdc0: 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c EY_CTX_new(pkey,
cdd0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 NULL);.. if (
cde0: 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 pkey == NULL ||
cdf0: 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 ctx == NULL || !
ce00: 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f EVP_PKEY_keygen_
ce10: 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 init(ctx) ||...!
ce20: 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 EVP_PKEY_CTX_set
ce30: 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 _rsa_keygen_bits
ce40: 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c (ctx, keysize) |
ce50: 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 | !EVP_PKEY_keyg
ce60: 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 en(ctx, &pkey))
ce70: 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 {...EVP_PKEY_fre
ce80: 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 e(pkey);...EVP_P
ce90: 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 KEY_CTX_free(ctx
cea0: 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f );.#endif...Tcl_
ceb0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
cec0: 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 ,"Error generati
ced0: 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c ng private key",
cee0: 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 NULL);...return
cef0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
cf00: 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 } else {...if (i
cf10: 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 sStr) {... ou
cf20: 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
cf30: 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 mem());... PE
cf40: 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 M_write_bio_Priv
cf50: 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c ateKey(out,pkey,
cf60: 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c NULL,NULL,0,NULL
cf70: 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d ,NULL);... i=
cf80: 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 BIO_read(out,buf
cf90: 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 fer,sizeof(buffe
cfa0: 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 r)-1);... i=(
cfb0: 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 i<0) ? 0 : i;...
cfc0: 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c buffer[i]='\
cfd0: 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 0';... Tcl_Se
cfe0: 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f tVar(interp,keyo
cff0: 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 ut,buffer,0);...
d000: 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 BIO_flush(ou
d010: 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 t);... BIO_fr
d020: 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 ee(out);...} els
d030: 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 e {... out=BI
d040: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 O_new(BIO_s_file
d050: 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 ());... BIO_w
d060: 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 rite_filename(ou
d070: 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 t,keyout);...
d080: 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 PEM_write_bio_P
d090: 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b rivateKey(out,pk
d0a0: 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e ey,NULL,NULL,0,N
d0b0: 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 ULL,NULL);...
d0c0: 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 /* PEM_write_bi
d0d0: 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 o_RSAPrivateKey(
d0e0: 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 out, rsa, NULL,
d0f0: 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e NULL, 0, NULL, N
d100: 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 ULL); */... B
d110: 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 IO_free_all(out)
d120: 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 ;.. .}....if ((c
d130: 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d ert=X509_new())=
d140: 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 =NULL) {... T
d150: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
d160: 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 erp,"Error gener
d170: 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 ating certificat
d180: 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 e request",NULL)
d190: 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 ;... EVP_PKEY
d1a0: 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 _free(pkey);.#if
d1b0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
d1c0: 5f 4e 55 4d 42 45 52 20 3e 20 30 78 31 30 31 30 _NUMBER > 0x1010
d1d0: 30 30 30 30 4c 20 26 26 20 4f 50 45 4e 53 53 4c 0000L && OPENSSL
d1e0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
d1f0: 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 < 0x30000000L...
d200: 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 BN_free(bne)
d210: 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72 ;.#endif... r
d220: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
d230: 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 ;...}....X509_se
d240: 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 t_version(cert,2
d250: 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 );...ASN1_INTEGE
d260: 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 R_set(X509_get_s
d270: 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 erialNumber(cert
d280: 29 2c 73 65 72 69 61 6c 29 3b 0a 23 69 66 20 4f ),serial);.#if O
d290: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
d2a0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
d2b0: 30 30 4c 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 00L...X509_gmtim
d2c0: 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 5f 6e e_adj(X509_get_n
d2d0: 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 otBefore(cert),0
d2e0: 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 );...X509_gmtime
d2f0: 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 5f 6e 6f _adj(X509_get_no
d300: 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f tAfter(cert),(lo
d310: 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 ng)60*60*24*days
d320: 29 3b 0a 23 65 6c 73 65 0a 09 09 58 35 30 39 5f );.#else...X509_
d330: 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f gmtime_adj(X509_
d340: 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 getm_notBefore(c
d350: 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f ert),0);...X509_
d360: 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f gmtime_adj(X509_
d370: 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 getm_notAfter(ce
d380: 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a rt),(long)60*60*
d390: 32 34 2a 64 61 79 73 29 3b 0a 23 65 6e 64 69 66 24*days);.#endif
d3a0: 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b ...X509_set_pubk
d3b0: 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a ey(cert,pkey);..
d3c0: 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f ..name=X509_get_
d3d0: 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 subject_name(cer
d3e0: 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 t);....X509_NAME
d3f0: 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
d400: 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 t(name,"C", MBST
d410: 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
d420: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
d430: 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 ) k_C, -1, -1, 0
d440: 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
d450: 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
d460: 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 name,"ST", MBSTR
d470: 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
d480: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
d490: 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 k_ST, -1, -1, 0
d4a0: 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
d4b0: 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
d4c0: 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 name,"L", MBSTRI
d4d0: 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
d4e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
d4f0: 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b k_L, -1, -1, 0);
d500: 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
d510: 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
d520: 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 me,"O", MBSTRING
d530: 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
d540: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
d550: 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 O, -1, -1, 0);..
d560: 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
d570: 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
d580: 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f ,"OU", MBSTRING_
d590: 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
d5a0: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f gned char *) k_O
d5b0: 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 U, -1, -1, 0);..
d5c0: 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
d5d0: 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
d5e0: 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f ,"CN", MBSTRING_
d5f0: 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
d600: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 gned char *) k_C
d610: 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 N, -1, -1, 0);..
d620: 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
d630: 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
d640: 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 ,"Email", MBSTRI
d650: 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
d660: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
d670: 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c k_Email, -1, -1,
d680: 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 0);....X509_set
d690: 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 _subject_name(ce
d6a0: 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 rt,name);....if
d6b0: 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 (!X509_sign(cert
d6c0: 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 ,pkey,EVP_sha256
d6d0: 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 ())) {... X50
d6e0: 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 9_free(cert);...
d6f0: 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 EVP_PKEY_fre
d700: 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 e(pkey);.#if OPE
d710: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
d720: 42 45 52 20 3e 20 30 78 31 30 31 30 30 30 30 30 BER > 0x10100000
d730: 4c 20 26 26 20 4f 50 45 4e 53 53 4c 5f 56 45 52 L && OPENSSL_VER
d740: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
d750: 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 30000000L...
d760: 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
d770: 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 ndif... Tcl_S
d780: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
d790: 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 "Error signing c
d7a0: 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c ertificate",NULL
d7b0: 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 );... return
d7c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a TCL_ERROR;...}..
d7d0: 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 ..if (isStr) {..
d7e0: 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
d7f0: 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 (BIO_s_mem());..
d800: 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
d810: 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
d820: 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 );... i=BIO_r
d830: 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 ead(out,buffer,s
d840: 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 izeof(buffer)-1)
d850: 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 ;... i=(i<0)
d860: 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 ? 0 : i;... b
d870: 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 uffer[i]='\0';..
d880: 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 . Tcl_SetVar(
d890: 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 interp,pemout,bu
d8a0: 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 ffer,0);... B
d8b0: 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 IO_flush(out);..
d8c0: 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 . BIO_free(ou
d8d0: 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 t);...} else {..
d8e0: 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
d8f0: 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a (BIO_s_file());.
d900: 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f .. BIO_write_
d910: 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d filename(out,pem
d920: 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f out);... PEM_
d930: 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f write_bio_X509(o
d940: 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ut,cert);...
d950: 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 BIO_free_all(out
d960: 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 );...}....X509_f
d970: 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 ree(cert);...EVP
d980: 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
d990: 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
d9a0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 20 30 RSION_NUMBER > 0
d9b0: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 4f 50 x10100000L && OP
d9c0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
d9d0: 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
d9e0: 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 0L...BN_free(bne
d9f0: 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d );.#endif.. }
da00: 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 ..}..break;.
da10: 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b default:..break;
da20: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
da30: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e n TCL_OK;..clien
da40: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
da50: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ta;.}.../*. *---
da60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
daa0: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 . *. * Tls_Free
dab0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
dac0: 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 ocedure cleans u
dad0: 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 p when a SSL soc
dae0: 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
daf0: 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 l. *.is closed a
db00: 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 nd its reference
db10: 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c count falls bel
db20: 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ow 1. *. * Resul
db30: 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 ts:. *.none. *.
db40: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
db50: 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 *.Frees all the
db60: 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d state. *. *----
db70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
dbb0: 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 */.void.Tls_Fre
dbc0: 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 e(char *blockPtr
dbd0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
dbe0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
dbf0: 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 *)blockPtr;..
dc00: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
dc10: 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c d");.. Tls_Cl
dc20: 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 ean(statePtr);.
dc30: 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 ckfree(blockP
dc40: 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d tr);.}.../*. *--
dc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc90: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 -. *. * Tls_Clea
dca0: 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 n --. *. *.This
dcb0: 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 procedure cleans
dcc0: 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 up when a SSL s
dcd0: 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e ocket based chan
dce0: 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 nel. *.is closed
dcf0: 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e and its referen
dd00: 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 ce count falls b
dd10: 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 elow 1. This sh
dd20: 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 ould. *.be calle
dd30: 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 d synchronously
dd40: 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 by the CloseProc
dd50: 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 , not in the. *.
dd60: 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 EventuallyFree c
dd70: 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 allback.. *. * R
dd80: 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a esults:. *.none.
dd90: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
dda0: 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c ts:. *.Frees all
ddb0: 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a the state. *. *
ddc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ddd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ddf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
de00: 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 ---. */.void Tls
de10: 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 _Clean(State *st
de20: 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 atePtr) {. dp
de30: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
de40: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
de50: 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 we're assuming h
de60: 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73 ere that we're s
de70: 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 ingle-threaded.
de80: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 */. if (s
de90: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 tatePtr->timer !
dea0: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
deb0: 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f n) NULL) {..Tcl_
dec0: 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c DeleteTimerHandl
ded0: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d er(statePtr->tim
dee0: 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e er);..statePtr->
def0: 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 timer = NULL;.
df00: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 }.. if (sta
df10: 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f tePtr->bio) {../
df20: 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c * This will call
df30: 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 SSL_shutdown. B
df40: 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 ug 1414045 */..d
df50: 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 printf("BIO_free
df60: 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 _all(%p)", state
df70: 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f Ptr->bio);..BIO_
df80: 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 free_all(statePt
df90: 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 r->bio);..stateP
dfa0: 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a tr->bio = NULL;.
dfb0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
dfc0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 atePtr->ssl) {..
dfd0: 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 dprintf("SSL_fre
dfe0: 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 e(%p)", statePtr
dff0: 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 ->ssl);..SSL_fre
e000: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
e010: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ;..statePtr->ssl
e020: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
e030: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
e040: 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 >ctx) {..SSL_CTX
e050: 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e _free(statePtr->
e060: 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ctx);..statePtr-
e070: 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 >ctx = NULL;.
e080: 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
e090: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b Ptr->callback) {
e0a0: 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 ..Tcl_DecrRefCou
e0b0: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c nt(statePtr->cal
e0c0: 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 lback);..statePt
e0d0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 r->callback = NU
e0e0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
e0f0: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 (statePtr->pass
e100: 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 word) {..Tcl_Dec
e110: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
e120: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 tr->password);..
e130: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
e140: 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d rd = NULL;. }
e150: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
e160: 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a eturning");.}...
e170: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
e180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e1b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
e1c0: 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a ls_Init --. *. *
e1d0: 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 .This is a packa
e1e0: 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f ge initializatio
e1f0: 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 n procedure, whi
e200: 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 ch is called. *.
e210: 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 by Tcl when this
e220: 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 package is to b
e230: 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e e added to an in
e240: 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a terpreter.. *. *
e250: 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 Results: Ssl c
e260: 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f onfigured and lo
e270: 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 aded. *. * Side
e280: 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 effects:. *. cre
e290: 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d ate the ssl comm
e2a0: 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 and, initialize
e2b0: 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 ssl context. *.
e2c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
e2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e300: 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f ----. */.DLLEXPO
e310: 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 RT int Tls_Init(
e320: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
e330: 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 rp) {. const
e340: 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 char tlsTclInitS
e350: 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 cript[] = {.#inc
e360: 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 lude "tls.tcl.h"
e370: 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 ..0x00. };..
e380: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
e390: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ed");.. /*.
e3a0: 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 * We only sup
e3b0: 70 6f 72 74 20 54 63 6c 20 38 2e 34 20 6f 72 20 port Tcl 8.4 or
e3c0: 6e 65 77 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20 newer. */.
e3d0: 20 20 69 66 20 28 0a 23 69 66 64 65 66 20 55 53 if (.#ifdef US
e3e0: 45 5f 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c E_TCL_STUBS..Tcl
e3f0: 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 _InitStubs(inter
e400: 70 2c 20 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c p, "8.4", 0).#el
e410: 73 65 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 se..Tcl_PkgRequi
e420: 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 re(interp, "Tcl"
e430: 2c 20 22 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e , "8.4-", 0).#en
e440: 64 69 66 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b dif.. == NULL) {
e450: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
e460: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
e470: 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 f (TlsLibInit(0)
e480: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 != TCL_OK) {..T
e490: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e4a0: 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e interp, "could n
e4b0: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 ot initialize SS
e4c0: 4c 20 6c 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c L library", NULL
e4d0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
e4e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
e4f0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
e500: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
e510: 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 ls::ciphers", Ci
e520: 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c phersObjCmd, (Cl
e530: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
e540: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
e550: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
e560: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
e570: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
e580: 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f :connection", Co
e590: 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 nnectionInfoObjC
e5a0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
e5b0: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
e5c0: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
e5d0: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
e5e0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
e5f0: 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b , "tls::handshak
e600: 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a e", HandshakeObj
e610: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
e620: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
e630: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
e640: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
e650: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
e660: 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 p, "tls::import"
e670: 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 , ImportObjCmd,
e680: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
e690: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
e6a0: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
e6b0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
e6c0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
e6d0: 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 ls::unimport", U
e6e0: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 nimportObjCmd, (
e6f0: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
e700: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
e710: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
e720: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
e730: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
e740: 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 s::status", Stat
e750: 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e usObjCmd, (Clien
e760: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
e770: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
e780: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
e790: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
e7a0: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 interp, "tls::ve
e7b0: 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f rsion", VersionO
e7c0: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
e7d0: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
e7e0: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
e7f0: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
e800: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
e810: 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 erp, "tls::misc"
e820: 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 , MiscObjCmd, (C
e830: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
e840: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
e850: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 *) NULL);..
e860: 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 if (interp) {..T
e870: 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 cl_Eval(interp,
e880: 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 tlsTclInitScript
e890: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 );. }.. re
e8a0: 74 75 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f 76 turn(Tcl_PkgProv
e8b0: 69 64 65 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 ide(interp, "tls
e8c0: 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 ", PACKAGE_VERSI
e8d0: 4f 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d ON));.}../*. *--
e8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e910: 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f ----*. *. *.Tls_
e920: 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 SafeInit --. *.
e930: 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
e940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e960: 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 --*. *.Standard
e970: 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 procedure requir
e980: 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a ed by 'load'.. *
e990: 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 .Initializes thi
e9a0: 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 s extension for
e9b0: 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 a safe interpret
e9c0: 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d er.. *.---------
e9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e9f0: 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 -------*. *. *.S
ea00: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
ea10: 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 .As of 'Tls_Init
ea20: 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a '. *. *.Result:.
ea30: 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 *..A standard T
ea40: 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 cl error code..
ea50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
ea60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ea70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ea80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a ----------*. */.
ea90: 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c DLLEXPORT int Tl
eaa0: 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 s_SafeInit(Tcl_I
eab0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b nterp *interp) {
eac0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
ead0: 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 lled");. retu
eae0: 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 rn(Tls_Init(inte
eaf0: 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d rp));.}../*. *--
eb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eb30: 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c ----*. *. *.TlsL
eb40: 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 ibInit --. *. *.
eb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eb60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eb70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eb80: 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 *. *.Initializes
eb90: 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 SSL library onc
eba0: 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f e per applicatio
ebb0: 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d n. *.-----------
ebc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ebd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ebe0: 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 -----*. *. *.Sid
ebf0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 e effects:. *..i
ec00: 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c nitializes SSL l
ec10: 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 ibrary. *. *.Res
ec20: 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a ult:. *..none. *
ec30: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
ec40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ec50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ec60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 ---------*. */.s
ec70: 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 tatic int TlsLib
ec80: 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 Init(int uniniti
ec90: 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 alize) {. sta
eca0: 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 tic int initiali
ecb0: 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 zed = 0;. int
ecc0: 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b status = TCL_OK
ecd0: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ;.#if defined(OP
ece0: 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
ecf0: 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
ed00: 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f READS). size_
ed10: 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e t num_locks;.#en
ed20: 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 dif.. if (uni
ed30: 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 nitialize) {.
ed40: 20 20 20 20 20 69 66 20 28 21 69 6e 69 74 69 61 if (!initia
ed50: 6c 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20 lized) {.
ed60: 20 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 dprintf("As
ed70: 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c ked to uninitial
ed80: 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 ize, but we are
ed90: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 not initialized"
eda0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 );..
edb0: 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a return(TCL_OK);.
edc0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 }..
edd0: 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 dprintf("Aske
ede0: 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a d to uninitializ
edf0: 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 e");..#if define
ee00: 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
ee10: 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
ee20: 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 20 L_THREADS).
ee30: 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b Tcl_MutexLock
ee40: 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 23 69 66 (&init_mx);..#if
ee50: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
ee60: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 30 30 _NUMBER < 0x1000
ee70: 30 30 30 30 4c 0a 20 20 20 20 20 20 20 20 43 52 0000L. CR
ee80: 59 50 54 4f 5f 73 65 74 5f 6c 6f 63 6b 69 6e 67 YPTO_set_locking
ee90: 5f 63 61 6c 6c 62 61 63 6b 28 4e 55 4c 4c 29 3b _callback(NULL);
eea0: 0a 20 20 20 20 20 20 20 20 43 52 59 50 54 4f 5f . CRYPTO_
eeb0: 73 65 74 5f 69 64 5f 63 61 6c 6c 62 61 63 6b 28 set_id_callback(
eec0: 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 4f 50 45 NULL);.#elif OPE
eed0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
eee0: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 BER < 0x10100000
eef0: 4c 0a 20 20 20 20 20 20 20 20 43 52 59 50 54 4f L. CRYPTO
ef00: 5f 73 65 74 5f 6c 6f 63 6b 69 6e 67 5f 63 61 6c _set_locking_cal
ef10: 6c 62 61 63 6b 28 4e 55 4c 4c 29 3b 0a 20 20 20 lback(NULL);.
ef20: 20 20 20 20 20 43 52 59 50 54 4f 5f 54 48 52 45 CRYPTO_THRE
ef30: 41 44 49 44 5f 73 65 74 5f 63 61 6c 6c 62 61 63 ADID_set_callbac
ef40: 6b 28 4e 55 4c 4c 29 0a 23 65 6e 64 69 66 0a 0a k(NULL).#endif..
ef50: 20 20 20 20 20 20 20 20 69 66 20 28 6c 6f 63 6b if (lock
ef60: 73 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 s) {.
ef70: 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 20 20 free(locks);.
ef80: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 73 20 locks
ef90: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 = NULL;.
efa0: 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d locksCount =
efb0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 0;. }.#e
efc0: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 69 ndif. ini
efd0: 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 tialized = 0;..#
efe0: 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
eff0: 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
f000: 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
f010: 44 53 29 0a 20 20 20 20 20 20 20 20 54 63 6c 5f DS). Tcl_
f020: 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 MutexUnlock(&ini
f030: 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 t_mx);.#endif..
f040: 20 20 20 20 20 20 20 72 65 74 75 72 6e 28 54 43 return(TC
f050: 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 L_OK);. }..
f060: 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 if (initialize
f070: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 64 70 72 d) {. dpr
f080: 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 intf("Called, bu
f090: 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 t using cached v
f0a0: 61 6c 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 alue");.
f0b0: 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a return(status);.
f0c0: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
f0d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 tf("Called");..#
f0e0: 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
f0f0: 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
f100: 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
f110: 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 DS). Tcl_Mute
f120: 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b xLock(&init_mx);
f130: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 .#endif. init
f140: 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 ialized = 1;..#i
f150: 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
f160: 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
f170: 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
f180: 53 29 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 S).#if OPENSSL_V
f190: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
f1a0: 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 0x10100000L.
f1b0: 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 43 52 59 50 num_locks = CRYP
f1c0: 54 4f 5f 6e 75 6d 5f 6c 6f 63 6b 73 28 29 3b 0a TO_num_locks();.
f1d0: 23 65 6c 73 65 0a 20 20 20 20 6e 75 6d 5f 6c 6f #else. num_lo
f1e0: 63 6b 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a cks = 1;.#endif.
f1f0: 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d locksCount =
f200: 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 (int) num_locks
f210: 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 ;. locks = ma
f220: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 lloc(sizeof(*loc
f230: 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 ks) * num_locks)
f240: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 ;. memset(loc
f250: 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c ks, 0, sizeof(*l
f260: 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b ocks) * num_lock
f270: 73 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c s);..#if OPENSSL
f280: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
f290: 3c 20 30 78 31 30 30 30 30 30 30 30 4c 0a 20 20 < 0x10000000L.
f2a0: 20 20 43 52 59 50 54 4f 5f 73 65 74 5f 6c 6f 63 CRYPTO_set_loc
f2b0: 6b 69 6e 67 5f 63 61 6c 6c 62 61 63 6b 28 43 72 king_callback(Cr
f2c0: 79 70 74 6f 54 68 72 65 61 64 4c 6f 63 6b 43 61 yptoThreadLockCa
f2d0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 43 52 59 llback);. CRY
f2e0: 50 54 4f 5f 73 65 74 5f 69 64 5f 63 61 6c 6c 62 PTO_set_id_callb
f2f0: 61 63 6b 28 43 72 79 70 74 6f 54 68 72 65 61 64 ack(CryptoThread
f300: 49 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6c IdCallback);.#el
f310: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
f320: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
f330: 31 30 30 30 30 30 4c 0a 20 20 20 20 43 52 59 50 100000L. CRYP
f340: 54 4f 5f 73 65 74 5f 6c 6f 63 6b 69 6e 67 5f 63 TO_set_locking_c
f350: 61 6c 6c 62 61 63 6b 28 43 72 79 70 74 6f 54 68 allback(CryptoTh
f360: 72 65 61 64 4c 6f 63 6b 43 61 6c 6c 62 61 63 6b readLockCallback
f370: 29 3b 0a 20 20 20 20 43 52 59 50 54 4f 5f 54 48 );. CRYPTO_TH
f380: 52 45 41 44 49 44 5f 73 65 74 5f 63 61 6c 6c 62 READID_set_callb
f390: 61 63 6b 28 43 72 79 70 74 6f 54 68 72 65 61 64 ack(CryptoThread
f3a0: 49 64 43 61 6c 6c 62 61 63 6b 29 0a 23 65 6e 64 IdCallback).#end
f3b0: 69 66 0a 23 65 6e 64 69 66 0a 0a 23 20 69 66 20 if.#endif..# if
f3c0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
f3d0: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
f3e0: 30 30 30 4c 0a 20 20 20 20 69 66 20 28 53 53 4c 000L. if (SSL
f3f0: 5f 6c 69 62 72 61 72 79 5f 69 6e 69 74 28 29 20 _library_init()
f400: 21 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 20 20 != 1) {.
f410: 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 45 52 52 status = TCL_ERR
f420: 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f OR;. goto
f430: 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 23 65 6c done;. }.#el
f440: 73 65 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 se. /* Initia
f450: 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 lize BOTH libcry
f460: 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 pto and libssl.
f470: 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 */. OPENSSL_i
f480: 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f nit_ssl(OPENSSL_
f490: 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 INIT_LOAD_SSL_ST
f4a0: 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f RINGS | OPENSSL_
f4b0: 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f INIT_LOAD_CRYPTO
f4c0: 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e _STRINGS..| OPEN
f4d0: 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c SSL_INIT_ADD_ALL
f4e0: 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 _CIPHERS | OPENS
f4f0: 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f SL_INIT_ADD_ALL_
f500: 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a DIGESTS, NULL);.
f510: 23 65 6e 64 69 66 0a 0a 23 20 69 66 20 4f 50 45 #endif..# if OPE
f520: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
f530: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 BER < 0x10100000
f540: 4c 0a 20 20 20 20 53 53 4c 5f 6c 6f 61 64 5f 65 L. SSL_load_e
f550: 72 72 6f 72 5f 73 74 72 69 6e 67 73 28 29 3b 0a rror_strings();.
f560: 20 20 20 20 45 52 52 5f 6c 6f 61 64 5f 63 72 79 ERR_load_cry
f570: 70 74 6f 5f 73 74 72 69 6e 67 73 28 29 3b 0a 23 pto_strings();.#
f580: 65 6c 73 65 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 else. /* Only
f590: 20 69 6e 69 74 69 61 6c 69 7a 65 20 6c 69 62 63 initialize libc
f5a0: 72 79 70 74 6f 20 20 2a 2f 0a 20 20 20 20 4f 50 rypto */. OP
f5b0: 45 4e 53 53 4c 5f 69 6e 69 74 5f 63 72 79 70 74 ENSSL_init_crypt
f5c0: 6f 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c o(OPENSSL_INIT_L
f5d0: 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e OAD_CRYPTO_STRIN
f5e0: 47 53 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 GS, NULL);.#endi
f5f0: 66 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 f.. BIO_new_t
f600: 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 cl(NULL, 0);..#i
f610: 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 f 0. /*.
f620: 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f * XXX:TODO: Remo
f630: 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64 ve this code and
f640: 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 replace it with
f650: 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 a check. *
f660: 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f for enough entro
f670: 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 py and do not tr
f680: 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 y to create our
f690: 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69 own. * terri
f6a0: 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 ble entropy.
f6b0: 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 */. /*.
f6c0: 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f * Seed the rando
f6d0: 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 m number generat
f6e0: 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 or in the SSL li
f6f0: 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 brary,. * us
f700: 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 ing the do/while
f710: 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 construct becau
f720: 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f se of the bug no
f730: 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a te in the. *
f740: 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 OpenSSL FAQ at
f750: 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 http://www.opens
f760: 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 sl.org/support/f
f770: 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 aq.html#USER1.
f780: 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 *. * The
f790: 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 crux of the prob
f7a0: 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 lem is that Sola
f7b0: 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 ris 7 does not h
f7c0: 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 ave a. * /de
f7d0: 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 v/random or /dev
f7e0: 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 /urandom device
f7f0: 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 so it cannot gat
f800: 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 her enough.
f810: 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 * entropy from t
f820: 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 he RAND_seed() w
f830: 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 hen TLS initiali
f840: 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a zes and refuses.
f850: 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 * to go fur
f860: 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 ther. Earlier ve
f870: 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 rsions of OpenSS
f880: 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 L carried on reg
f890: 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f ardless.. */
f8a0: 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 . srand((unsi
f8b0: 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 gned int) time((
f8c0: 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 time_t *) NULL))
f8d0: 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 ;. do {..for
f8e0: 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 (i = 0; i < 16;
f8f0: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f i++) {.. rnd_
f900: 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 seed[i] = 1 + (c
f910: 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 har) (255.0 * ra
f920: 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 nd()/(RAND_MAX+1
f930: 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 .0));..}..RAND_s
f940: 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 eed(rnd_seed, si
f950: 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b zeof(rnd_seed));
f960: 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 . } while (RA
f970: 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 ND_status() != 1
f980: 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 20 69 66 20 );.#endif..# if
f990: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
f9a0: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
f9b0: 30 30 30 4c 0a 64 6f 6e 65 3a 0a 23 65 6e 64 69 000L.done:.#endi
f9c0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 f.#if defined(OP
f9d0: 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
f9e0: 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
f9f0: 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 READS)..Tcl_Mute
fa00: 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 xUnlock(&init_mx
fa10: 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 );.#endif...retu
fa20: 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a rn(status);.}.