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 63 69 70 68 65 72 rs, char *cipher
0570: 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 suites, int leve
0580: 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d l, char *DHparam
0590: 73 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 s);..static int.
05a0: 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 TlsLibInit(int u
05b0: 6e 69 6e 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 ninitialize);..#
05c0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f define TLS_PROTO
05d0: 5f 53 53 4c 32 09 09 30 78 30 31 0a 23 64 65 66 _SSL2..0x01.#def
05e0: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 ine TLS_PROTO_SS
05f0: 4c 33 09 09 30 78 30 32 0a 23 64 65 66 69 6e 65 L3..0x02.#define
0600: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 TLS_PROTO_TLS1.
0610: 09 30 78 30 34 0a 23 64 65 66 69 6e 65 20 54 4c .0x04.#define TL
0620: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 S_PROTO_TLS1_1.0
0630: 78 30 38 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f x08.#define TLS_
0640: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 PROTO_TLS1_2.0x1
0650: 30 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 0.#define TLS_PR
0660: 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a OTO_TLS1_3.0x20.
0670: 23 64 65 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 #define ENABLED(
0680: 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 flag, mask).(((f
0690: 6c 61 67 29 20 26 20 28 6d 61 73 6b 29 29 20 3d lag) & (mask)) =
06a0: 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 = (mask))..#defi
06b0: 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 ne SSLKEYLOGFILE
06c0: 09 09 22 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 .."SSLKEYLOGFILE
06d0: 22 0a 0a 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 "../*. * Static
06e0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 0a data structures.
06f0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 */..#ifndef OPE
0700: 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c NSSL_NO_DH.#incl
0710: 75 64 65 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 ude "dh_params.h
0720: 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 ".#endif../*. *
0730: 57 65 20 6c 6f 73 65 20 74 68 65 20 74 63 6c 20 We lose the tcl
0740: 70 61 73 73 77 6f 72 64 20 63 61 6c 6c 62 61 63 password callbac
0750: 6b 20 77 68 65 6e 20 77 65 20 75 73 65 20 74 68 k when we use th
0760: 65 20 52 53 41 20 42 53 41 46 45 20 53 53 4c 2d e RSA BSAFE SSL-
0770: 43 20 31 2e 31 2e 32 0a 20 2a 20 6c 69 62 72 61 C 1.1.2. * libra
0780: 72 69 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 ries instead of
0790: 74 68 65 20 63 75 72 72 65 6e 74 20 4f 70 65 6e the current Open
07a0: 53 53 4c 20 6c 69 62 72 61 72 69 65 73 2e 0a 20 SSL libraries..
07b0: 2a 2f 0a 0a 23 69 66 64 65 66 20 42 53 41 46 45 */..#ifdef BSAFE
07c0: 0a 23 64 65 66 69 6e 65 20 50 52 45 5f 4f 50 45 .#define PRE_OPE
07d0: 4e 53 53 4c 5f 30 5f 39 5f 34 20 31 0a 23 65 6e NSSL_0_9_4 1.#en
07e0: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 50 72 65 20 4f dif../*. * Pre O
07f0: 70 65 6e 53 53 4c 20 30 2e 39 2e 34 20 43 6f 6d penSSL 0.9.4 Com
0800: 70 61 74 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 pat. */..#ifndef
0810: 20 53 54 41 43 4b 5f 4f 46 0a 23 64 65 66 69 6e STACK_OF.#defin
0820: 65 20 53 54 41 43 4b 5f 4f 46 28 78 29 09 09 09 e STACK_OF(x)...
0830: 53 54 41 43 4b 0a 23 64 65 66 69 6e 65 20 73 6b STACK.#define sk
0840: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 _SSL_CIPHER_num(
0850: 73 6b 29 09 09 73 6b 5f 6e 75 6d 28 28 73 6b 29 sk)..sk_num((sk)
0860: 29 0a 23 64 65 66 69 6e 65 20 73 6b 5f 53 53 4c ).#define sk_SSL
0870: 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b _CIPHER_value(sk
0880: 2c 20 69 6e 64 65 78 29 09 28 53 53 4c 5f 43 49 , index).(SSL_CI
0890: 50 48 45 52 2a 29 73 6b 5f 76 61 6c 75 65 28 28 PHER*)sk_value((
08a0: 73 6b 29 2c 20 28 69 6e 64 65 78 29 29 0a 23 65 sk), (index)).#e
08b0: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 ndif../*. * Thre
08c0: 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64 65 ad-Safe TLS Code
08d0: 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c . */..#ifdef TCL
08e0: 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e 65 _THREADS.#define
08f0: 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 5f OPENSSL_THREAD_
0900: 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64 65 DEFINES.#include
0910: 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 73 <openssl/openss
0920: 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65 66 lconf.h>..#ifdef
0930: 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 OPENSSL_THREADS
0940: 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 .#include <opens
0950: 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 2f 2a 20 sl/crypto.h>./*
0960: 41 64 64 65 64 20 2a 2f 0a 23 69 6e 63 6c 75 64 Added */.#includ
0970: 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 e <openssl/ssl.h
0980: 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65 >../*. * Threade
0990: 64 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75 d operation requ
09a0: 69 72 65 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c ires locking cal
09b0: 6c 62 61 63 6b 73 0a 20 2a 20 42 61 73 65 64 20 lbacks. * Based
09c0: 66 72 6f 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79 from /crypto/cry
09d0: 70 74 6c 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53 ptlib.c of OpenS
09e0: 53 4c 20 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c SL and NSOpenSSL
09f0: 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 .. */..static Tc
0a00: 6c 5f 4d 75 74 65 78 20 2a 6c 6f 63 6b 73 20 3d l_Mutex *locks =
0a10: 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e NULL;.static in
0a20: 74 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 t locksCount = 0
0a30: 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 ;.static Tcl_Mut
0a40: 65 78 20 69 6e 69 74 5f 6d 78 3b 0a 0a 23 20 69 ex init_mx;..# i
0a50: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
0a60: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
0a70: 30 30 30 30 30 4c 0a 0a 76 6f 69 64 20 43 72 79 00000L..void Cry
0a80: 70 74 6f 54 68 72 65 61 64 4c 6f 63 6b 43 61 6c ptoThreadLockCal
0a90: 6c 62 61 63 6b 28 69 6e 74 20 6d 6f 64 65 2c 20 lback(int mode,
0aa0: 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68 61 int n, const cha
0ab0: 72 20 2a 66 69 6c 65 2c 20 69 6e 74 20 6c 69 6e r *file, int lin
0ac0: 65 29 20 7b 0a 0a 20 20 20 20 69 66 20 28 6d 6f e) {.. if (mo
0ad0: 64 65 20 26 20 43 52 59 50 54 4f 5f 4c 4f 43 4b de & CRYPTO_LOCK
0ae0: 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 64 65 62 ) {../* This deb
0af0: 75 67 67 69 6e 67 20 69 73 20 74 75 72 6e 65 64 ugging is turned
0b00: 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 20 off by default
0b10: 2d 2d 20 69 74 27 73 20 74 6f 6f 20 6e 6f 69 73 -- it's too nois
0b20: 79 2e 20 2a 2f 0a 09 2f 2a 20 64 70 72 69 6e 74 y. */../* dprint
0b30: 66 28 22 43 61 6c 6c 65 64 20 74 6f 20 6c 6f 63 f("Called to loc
0b40: 6b 20 28 6e 3d 25 69 20 6f 66 20 25 69 29 22 2c k (n=%i of %i)",
0b50: 20 6e 2c 20 6c 6f 63 6b 73 43 6f 75 6e 74 29 3b n, locksCount);
0b60: 20 2a 2f 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f */..Tcl_MutexLo
0b70: 63 6b 28 26 6c 6f 63 6b 73 5b 6e 5d 29 3b 0a 20 ck(&locks[n]);.
0b80: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 } else {../*
0b90: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 20 dprintf("Called
0ba0: 74 6f 20 75 6e 6c 6f 63 6b 20 28 6e 3d 25 69 20 to unlock (n=%i
0bb0: 6f 66 20 25 69 29 22 2c 20 6e 2c 20 6c 6f 63 6b of %i)", n, lock
0bc0: 73 43 6f 75 6e 74 29 3b 20 2a 2f 0a 09 54 63 6c sCount); */..Tcl
0bd0: 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 6c 6f _MutexUnlock(&lo
0be0: 63 6b 73 5b 6e 5d 29 3b 0a 20 20 20 20 7d 0a 0a cks[n]);. }..
0bf0: 20 20 20 20 2f 2a 20 64 70 72 69 6e 74 66 28 22 /* dprintf("
0c00: 52 65 74 75 72 6e 69 6e 67 22 29 3b 20 2a 2f 0a Returning"); */.
0c10: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 . return;.
0c20: 20 66 69 6c 65 20 3d 20 66 69 6c 65 3b 0a 20 20 file = file;.
0c30: 20 20 6c 69 6e 65 20 3d 20 6c 69 6e 65 3b 0a 7d line = line;.}
0c40: 0a 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 ..unsigned long
0c50: 43 72 79 70 74 6f 54 68 72 65 61 64 49 64 43 61 CryptoThreadIdCa
0c60: 6c 6c 62 61 63 6b 28 76 6f 69 64 29 20 7b 0a 20 llback(void) {.
0c70: 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 unsigned long
0c80: 20 72 65 74 3b 0a 0a 20 20 20 20 64 70 72 69 6e ret;.. dprin
0c90: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
0ca0: 20 20 20 72 65 74 20 3d 20 28 75 6e 73 69 67 6e ret = (unsign
0cb0: 65 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 ed long) Tcl_Get
0cc0: 43 75 72 72 65 6e 74 54 68 72 65 61 64 28 29 3b CurrentThread();
0cd0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
0ce0: 65 74 75 72 6e 69 6e 67 20 25 6c 75 22 2c 20 72 eturning %lu", r
0cf0: 65 74 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e et);.. return
0d00: 28 72 65 74 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 (ret);.}..#endif
0d10: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53 .#endif /* OPENS
0d20: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65 SL_THREADS */.#e
0d30: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45 ndif /* TCL_THRE
0d40: 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 0a 20 2a 2d ADS */..../*. *-
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d90: 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c --. *. * InfoCal
0da0: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 6d lback --. *. *.m
0db0: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f 6e 6e onitors SSL conn
0dc0: 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 ection process.
0dd0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
0de0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
0df0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
0e00: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
0e10: 64 65 66 69 6e 65 64 29 0a 20 2a 2d 2d 2d 2d 2d defined). *-----
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 2d ----------------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
0e60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 49 */.static void.I
0e70: 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 nfoCallback(cons
0e80: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 t SSL *ssl, int
0e90: 77 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 20 where, int ret)
0ea0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
0eb0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
0ec0: 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 SSL_get_app_data
0ed0: 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 ((SSL *)ssl);.
0ee0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
0ef0: 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 6a r;. char *maj
0f00: 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 3b or; char *minor;
0f10: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
0f20: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
0f30: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
0f40: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
0f50: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b *)NULL)..return;
0f60: 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 .. cmdPtr = T
0f70: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
0f80: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
0f90: 63 6b 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 ck);..#if 0.
0fa0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
0fb0: 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65 76 CB_ALERT) {..sev
0fc0: 20 3d 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 = SSL_alert_typ
0fd0: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 e_string_long(re
0fe0: 74 29 3b 0a 09 69 66 20 28 73 74 72 63 6d 70 28 t);..if (strcmp(
0ff0: 73 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d 30 sev, "fatal")==0
1000: 29 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65 72 ) {./* Map to er
1010: 72 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73 5f ror */.. Tls_
1020: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 Error(statePtr,
1030: 53 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20 30 SSL_ERROR(ssl, 0
1040: 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 3b ));.. return;
1050: 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 ..}. }.#endif
1060: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 . if (where &
1070: 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b SSL_CB_HANDSHAK
1080: 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f E_START) {..majo
1090: 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b r = "handshake";
10a0: 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 ..minor = "start
10b0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ";. } else if
10c0: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 (where & SSL_CB
10d0: 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 _HANDSHAKE_DONE)
10e0: 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e {..major = "han
10f0: 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 dshake";..minor
1100: 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 = "done";. }
1110: 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 72 else {..if (wher
1120: 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 e & SSL_CB_ALERT
1130: 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 )..major = "aler
1140: 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 t";..else if (wh
1150: 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e ere & SSL_ST_CON
1160: 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 NECT).major = "c
1170: 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 onnect";..else i
1180: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 f (where & SSL_S
1190: 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 T_ACCEPT)..major
11a0: 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 6c = "accept";..el
11b0: 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 se.....major = "
11c0: 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 unknown";...if (
11d0: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 where & SSL_CB_R
11e0: 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 EAD)..minor = "r
11f0: 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 ead";..else if (
1200: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 where & SSL_CB_W
1210: 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 RITE)..minor = "
1220: 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 write";..else if
1230: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 (where & SSL_CB
1240: 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 _LOOP)..minor =
1250: 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 "loop";..else if
1260: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 (where & SSL_CB
1270: 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 _EXIT)..minor =
1280: 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 "exit";..else...
1290: 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f ..minor = "unkno
12a0: 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 wn";. }..
12b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
12c0: 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 dElement(statePt
12d0: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 r->interp, cmdPt
12e0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
12f0: 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 Obj("info", -1))
1300: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1310: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 jAppendElement(s
1320: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
1330: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
1340: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 l_NewStringObj(T
1350: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
1360: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
1370: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ), -1));. Tcl
1380: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1390: 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e ement(statePtr->
13a0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
13b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
13c0: 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 (major, -1));.
13d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
13e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 endElement(state
13f0: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 Ptr->interp, cmd
1400: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
1410: 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 ngObj(minor, -1)
1420: 29 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 );.. if (wher
1430: 65 20 26 20 28 53 53 4c 5f 43 42 5f 4c 4f 4f 50 e & (SSL_CB_LOOP
1440: 7c 53 53 4c 5f 43 42 5f 45 58 49 54 29 29 20 7b |SSL_CB_EXIT)) {
1450: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
1460: 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 endElement(state
1470: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 Ptr->interp, cmd
1480: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
1490: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 wStringObj(SSL_s
14a0: 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 tate_string_long
14b0: 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 (ssl), -1));.
14c0: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 } else if (wher
14d0: 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 e & SSL_CB_ALERT
14e0: 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 ) {..const char
14f0: 2a 63 70 20 3d 20 28 63 68 61 72 20 2a 29 20 53 *cp = (char *) S
1500: 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 SL_alert_desc_st
1510: 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a ring_long(ret);.
1520: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
1530: 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 endElement(state
1540: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 Ptr->interp, cmd
1550: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
1560: 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a ngObj(cp, -1));.
1570: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
1580: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1590: 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d lement(statePtr-
15a0: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c >interp, cmdPtr,
15b0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
15c0: 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 ingObj(SSL_state
15d0: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c _string_long(ssl
15e0: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 ), -1));. }.
15f0: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
1600: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
1610: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a tePtr->interp);.
1620: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
1630: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
1640: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 atePtr);.. Tc
1650: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
1660: 6d 64 50 74 72 29 3b 0a 20 20 20 20 28 76 6f 69 mdPtr);. (voi
1670: 64 29 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 d) Tcl_EvalObjEx
1680: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 (statePtr->inter
1690: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 p, cmdPtr, TCL_E
16a0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 VAL_GLOBAL);.
16b0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
16c0: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 t(cmdPtr);..
16d0: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
16e0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
16f0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 r);. Tcl_Rele
1700: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
1710: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
1720: 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d p);.}.../*. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1770: 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c . *. * VerifyCal
1780: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d lback --. *. *.M
1790: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 74 onitors SSL cert
17a0: 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 ificate validati
17b0: 6f 6e 20 70 72 6f 63 65 73 73 2e 0a 20 2a 09 54 on process.. *.T
17c0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 his is called wh
17d0: 65 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 enever a certifi
17e0: 63 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 cate is inspecte
17f0: 64 0a 20 2a 09 6f 72 20 64 65 63 69 64 65 64 20 d. *.or decided
1800: 69 6e 76 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20 52 invalid.. *. * R
1810: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c esults:. *.A cal
1820: 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 lback bound to t
1830: 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 he socket may re
1840: 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 turn one of:. *.
1850: 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 0...- the ce
1860: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 rtificate is dee
1870: 6d 65 64 20 69 6e 76 61 6c 69 64 0a 20 2a 09 20 med invalid. *.
1880: 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 72 1...- the cer
1890: 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d tificate is deem
18a0: 65 64 20 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 ed valid. *.
18b0: 65 6d 70 74 79 20 73 74 72 69 6e 67 09 2d 20 6e empty string.- n
18c0: 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 65 72 74 o change to cert
18d0: 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 ificate validati
18e0: 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 on. *. * Side ef
18f0: 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 fects:. *.The er
1900: 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 r field of the c
1910: 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 urrently operati
1920: 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a ve State is set.
1930: 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 *. to a string
1940: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 describing the
1950: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 SSL negotiation
1960: 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 failure reason.
1970: 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19b0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
19c0: 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 int.VerifyCallba
19d0: 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f ck(int ok, X509_
19e0: 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20 STORE_CTX *ctx)
19f0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 {. Tcl_Obj *c
1a00: 6d 64 50 74 72 2c 20 2a 72 65 73 75 6c 74 3b 0a mdPtr, *result;.
1a10: 20 20 20 20 63 68 61 72 20 2a 65 72 72 53 74 72 char *errStr
1a20: 2c 20 2a 73 74 72 69 6e 67 3b 0a 20 20 20 20 69 , *string;. i
1a30: 6e 74 20 6c 65 6e 67 74 68 3b 0a 20 20 20 20 53 nt length;. S
1a40: 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 SL *ssl..= (SS
1a50: 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 L*)X509_STORE_CT
1a60: 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63 74 X_get_ex_data(ct
1a70: 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 x, SSL_get_ex_da
1a80: 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 ta_X509_STORE_CT
1a90: 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58 35 X_idx());. X5
1aa0: 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35 30 09 *cert..= X50
1ab0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 9_STORE_CTX_get_
1ac0: 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74 78 current_cert(ctx
1ad0: 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 );. State *st
1ae0: 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 2a atePtr.= (State*
1af0: 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 )SSL_get_app_dat
1b00: 61 28 73 73 6c 29 3b 0a 20 20 20 20 69 6e 74 20 a(ssl);. int
1b10: 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 54 depth..= X509_ST
1b20: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f ORE_CTX_get_erro
1b30: 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 20 r_depth(ctx);.
1b40: 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 30 int err..= X50
1b50: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 9_STORE_CTX_get_
1b60: 65 72 72 6f 72 28 63 74 78 29 3b 0a 20 20 20 20 error(ctx);.
1b70: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 int code;.. d
1b80: 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 printf("Verify:
1b90: 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 %d", ok);.. i
1ba0: 66 20 28 21 6f 6b 29 20 7b 0a 09 65 72 72 53 74 f (!ok) {..errSt
1bb0: 72 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f r = (char*)X509_
1bc0: 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f verify_cert_erro
1bd0: 72 5f 73 74 72 69 6e 67 28 65 72 72 29 3b 0a 20 r_string(err);.
1be0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 65 72 72 } else {..err
1bf0: 53 74 72 20 3d 20 28 63 68 61 72 20 2a 29 30 3b Str = (char *)0;
1c00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
1c10: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
1c20: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 ck == (Tcl_Obj*)
1c30: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 NULL) {..if (sta
1c40: 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 tePtr->vflags &
1c50: 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f SSL_VERIFY_FAIL_
1c60: 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 IF_NO_PEER_CERT)
1c70: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f {.. return o
1c80: 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 k;..} else {..
1c90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 return 1;..}.
1ca0: 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 }. cmdPtr
1cb0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
1cc0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
1cd0: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c lback);.. Tcl
1ce0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1cf0: 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e ement(statePtr->
1d00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1d10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1d20: 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b ("verify", -1));
1d30: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1d40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 AppendElement(st
1d50: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 atePtr->interp,
1d60: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
1d70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
1d80: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
1d90: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
1da0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
1db0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1dc0: 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 ment(statePtr->i
1dd0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1de0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 70 cl_NewIntObj(dep
1df0: 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 th));. Tcl_Li
1e00: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1e10: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 nt(statePtr->int
1e20: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 erp, cmdPtr, Tls
1e30: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 73 74 61 74 _NewX509Obj(stat
1e40: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 65 ePtr->interp, ce
1e50: 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 rt));. Tcl_Li
1e60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1e70: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 nt(statePtr->int
1e80: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
1e90: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b _NewIntObj(ok));
1ea0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1eb0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 AppendElement(st
1ec0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 atePtr->interp,
1ed0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
1ee0: 74 72 69 6e 67 4f 62 6a 28 65 72 72 53 74 72 20 tringObj(errStr
1ef0: 3f 20 65 72 72 53 74 72 20 3a 20 22 22 2c 20 2d ? errStr : "", -
1f00: 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 1));.. Tcl_Pr
1f10: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
1f20: 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e ta) statePtr->in
1f30: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 terp);. Tcl_P
1f40: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
1f50: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
1f60: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 . statePtr->f
1f70: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f lags |= TLS_TCL_
1f80: 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 20 20 20 54 CALLBACK;.. T
1f90: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
1fa0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 cmdPtr);. cod
1fb0: 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 e = Tcl_EvalObjE
1fc0: 78 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 x(statePtr->inte
1fd0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f rp, cmdPtr, TCL_
1fe0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 EVAL_GLOBAL);.
1ff0: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 if (code != TC
2000: 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 49 74 20 67 L_OK) {../* It g
2010: 6f 74 20 61 6e 20 65 72 72 6f 72 20 2d 20 72 65 ot an error - re
2020: 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66 69 ject the certifi
2030: 63 61 74 65 2e 09 09 2a 2f 0a 23 69 66 20 28 54 cate...*/.#if (T
2040: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
2050: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d == 8) && (TCL_M
2060: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 INOR_VERSION < 6
2070: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e )..Tcl_Backgroun
2080: 64 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d dError(statePtr-
2090: 3e 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a >interp);.#else.
20a0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
20b0: 78 63 65 70 74 69 6f 6e 28 73 74 61 74 65 50 74 xception(statePt
20c0: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 r->interp, code)
20d0: 3b 0a 23 65 6e 64 69 66 0a 09 6f 6b 20 3d 20 30 ;.#endif..ok = 0
20e0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
20f0: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 result = Tcl_Get
2100: 4f 62 6a 52 65 73 75 6c 74 28 73 74 61 74 65 50 ObjResult(stateP
2110: 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 09 73 74 tr->interp);..st
2120: 72 69 6e 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 ring = Tcl_GetSt
2130: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75 ringFromObj(resu
2140: 6c 74 2c 20 26 6c 65 6e 67 74 68 29 3b 0a 09 2f lt, &length);../
2150: 2a 20 41 6e 20 65 6d 70 74 79 20 72 65 73 75 6c * An empty resul
2160: 74 20 6c 65 61 76 65 73 20 76 65 72 69 66 69 63 t leaves verific
2170: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e ation unchanged.
2180: 09 2a 2f 0a 09 69 66 20 28 73 74 72 69 6e 67 20 .*/..if (string
2190: 21 3d 20 4e 55 4c 4c 20 26 26 20 6c 65 6e 67 74 != NULL && lengt
21a0: 68 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 63 6f h > 0) {.. co
21b0: 64 65 20 3d 20 54 63 6c 5f 47 65 74 49 6e 74 46 de = Tcl_GetIntF
21c0: 72 6f 6d 4f 62 6a 28 73 74 61 74 65 50 74 72 2d romObj(statePtr-
21d0: 3e 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 2c >interp, result,
21e0: 20 26 6f 6b 29 3b 0a 09 20 20 20 20 69 66 20 28 &ok);.. if (
21f0: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 code != TCL_OK)
2200: 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 {.#if (TCL_MAJOR
2210: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 _VERSION == 8) &
2220: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 & (TCL_MINOR_VER
2230: 53 49 4f 4e 20 3c 20 36 29 0a 09 09 54 63 6c 5f SION < 6)...Tcl_
2240: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 BackgroundError(
2250: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
2260: 29 3b 0a 23 65 6c 73 65 0a 09 09 54 63 6c 5f 42 );.#else...Tcl_B
2270: 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 ackgroundExcepti
2280: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 on(statePtr->int
2290: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 erp, code);.#end
22a0: 69 66 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20 20 if...ok = 0;..
22b0: 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 }..}. }.
22c0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
22d0: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 t(cmdPtr);..
22e0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
22f0: 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c &= ~(TLS_TCL_CAL
2300: 4c 42 41 43 4b 29 3b 0a 0a 20 20 20 20 54 63 6c LBACK);.. Tcl
2310: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
2320: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
2330: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 . Tcl_Release
2340: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
2350: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b atePtr->interp);
2360: 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 3b . return(ok);
2370: 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 ./* By default,
2380: 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69 leave verificati
2390: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f on unchanged..*/
23a0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d ----------------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
23f0: 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d . * Tls_Error --
2400: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c . *. *.Calls cal
2410: 6c 62 61 63 6b 20 77 69 74 68 20 24 66 64 20 61 lback with $fd a
2420: 6e 64 20 24 6d 73 67 20 2d 20 73 6f 20 74 68 65 nd $msg - so the
2430: 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65 callback can de
2440: 63 69 64 65 0a 20 2a 09 77 68 61 74 20 74 6f 20 cide. *.what to
2450: 64 6f 20 77 69 74 68 20 65 72 72 6f 72 73 2e 0a do with errors..
2460: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
2470: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 ts:. *.The err f
2480: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 ield of the curr
2490: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 ently operative
24a0: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 State is set. *.
24b0: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 to a string de
24c0: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c scribing the SSL
24d0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 negotiation fai
24e0: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d lure reason. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2530: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 -. */.void.Tls_E
2540: 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 rror(State *stat
2550: 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 ePtr, char *msg)
2560: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
2570: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 cmdPtr;. int
2580: 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e code;.. dprin
2590: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
25a0: 20 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d if (msg && *m
25b0: 73 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 sg) {..Tcl_SetEr
25c0: 72 6f 72 43 6f 64 65 28 73 74 61 74 65 50 74 72 rorCode(statePtr
25d0: 2d 3e 69 6e 74 65 72 70 2c 20 22 53 53 4c 22 2c ->interp, "SSL",
25e0: 20 6d 73 67 2c 20 28 63 68 61 72 20 2a 29 4e 55 msg, (char *)NU
25f0: 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 LL);. } else
2600: 7b 0a 09 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 {..msg = Tcl_Get
2610: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
2620: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 73 l_GetObjResult(s
2630: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 tatePtr->interp)
2640: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 , NULL);. }.
2650: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 statePtr->err
2660: 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 69 66 20 = msg;.. if
2670: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
2680: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a ack == (Tcl_Obj*
2690: 29 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 )NULL) {..char b
26a0: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 09 73 70 72 uf[BUFSIZ];..spr
26b0: 69 6e 74 66 28 62 75 66 2c 20 22 53 53 4c 20 63 intf(buf, "SSL c
26c0: 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 3a 20 65 hannel \"%s\": e
26d0: 72 72 6f 72 3a 20 25 73 22 2c 0a 09 20 20 20 20 rror: %s",..
26e0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
26f0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
2700: 66 29 2c 20 6d 73 67 29 3b 0a 09 54 63 6c 5f 53 f), msg);..Tcl_S
2710: 65 74 52 65 73 75 6c 74 28 73 74 61 74 65 50 74 etResult(statePt
2720: 72 2d 3e 69 6e 74 65 72 70 2c 20 62 75 66 2c 20 r->interp, buf,
2730: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 23 TCL_VOLATILE);.#
2740: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
2750: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
2760: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
2770: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
2780: 67 72 6f 75 6e 64 45 72 72 6f 72 28 73 74 61 74 groundError(stat
2790: 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 23 ePtr->interp);.#
27a0: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 else..Tcl_Backgr
27b0: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 73 74 oundException(st
27c0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 atePtr->interp,
27d0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 23 65 6e 64 TCL_ERROR);.#end
27e0: 69 66 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 if..return;.
27f0: 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 }. cmdPtr = T
2800: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
2810: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
2820: 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 ck);.. Tcl_Li
2830: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2840: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 nt(statePtr->int
2850: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
2860: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
2870: 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 bj("error", -1))
2880: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ;.. Tcl_ListO
2890: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
28a0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
28b0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
28c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
28d0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
28e0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
28f0: 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 f), -1));.. T
2900: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2910: 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 Element(statePtr
2920: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
2930: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
2940: 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 ringObj(msg, -1)
2950: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
2960: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
2970: 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ) statePtr->inte
2980: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 rp);. Tcl_Pre
2990: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 serve((ClientDat
29a0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
29b0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
29c0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
29d0: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c code = Tcl_Eval
29e0: 4f 62 6a 45 78 28 73 74 61 74 65 50 74 72 2d 3e ObjEx(statePtr->
29f0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2a00: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
2a10: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 ;. if (code !
2a20: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 = TCL_OK) {.#if
2a30: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
2a40: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
2a50: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
2a60: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
2a70: 75 6e 64 45 72 72 6f 72 28 73 74 61 74 65 50 74 undError(statePt
2a80: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 r->interp);.#els
2a90: 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e e..Tcl_Backgroun
2aa0: 64 45 78 63 65 70 74 69 6f 6e 28 73 74 61 74 65 dException(state
2ab0: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6f 64 Ptr->interp, cod
2ac0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d e);.#endif. }
2ad0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
2ae0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
2af0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
2b00: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
2b10: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 ePtr);. Tcl_R
2b20: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
2b30: 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e ta) statePtr->in
2b40: 74 65 72 70 29 3b 0a 7d 0a 0c 0a 76 6f 69 64 20 terp);.}...void
2b50: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 KeyLogCallback(c
2b60: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 onst SSL *ssl, c
2b70: 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 onst char *line)
2b80: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 {. char *str
2b90: 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 = getenv(SSLKEY
2ba0: 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 LOGFILE);. FI
2bb0: 4c 45 20 2a 66 64 3b 0a 20 20 20 20 69 66 20 28 LE *fd;. if (
2bc0: 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 str) {..fd = fop
2bd0: 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 en(str, "a");..f
2be0: 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e printf(fd, "%s\n
2bf0: 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 ",line);..fclose
2c00: 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a (fd);. }.}...
2c10: 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d ----------------
2c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 --------. *. * P
2c60: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 20 asswordCallback
2c70: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
2c80: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 when a password
2c90: 69 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e 70 is needed to unp
2ca0: 61 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d 20 ack RSA and PEM
2cb0: 6b 65 79 73 2e 0a 20 2a 09 45 76 61 6c 73 20 61 keys.. *.Evals a
2cc0: 6e 79 20 62 6f 75 6e 64 20 70 61 73 73 77 6f 72 ny bound passwor
2cd0: 64 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 d script and ret
2ce0: 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 urns the result
2cf0: 61 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77 6f as. *.the passwo
2d00: 72 64 20 73 74 72 69 6e 67 2e 0a 20 2a 2d 2d 2d rd string.. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d50: 0a 20 2a 2f 0a 23 69 66 64 65 66 20 50 52 45 5f . */.#ifdef PRE_
2d60: 4f 50 45 4e 53 53 4c 5f 30 5f 39 5f 34 0a 2f 2a OPENSSL_0_9_4./*
2d70: 0a 20 2a 20 4e 6f 20 77 61 79 20 74 6f 20 68 61 . * No way to ha
2d80: 6e 64 6c 65 20 75 73 65 72 2d 64 61 74 61 20 74 ndle user-data t
2d90: 68 65 72 65 66 6f 72 65 20 6e 6f 20 77 61 79 20 herefore no way
2da0: 77 69 74 68 6f 75 74 20 61 20 67 6c 6f 62 61 6c without a global
2db0: 0a 20 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 . * variable to
2dc0: 61 63 63 65 73 73 20 74 68 65 20 54 63 6c 20 69 access the Tcl i
2dd0: 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 73 nterpreter..*/.s
2de0: 74 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f tatic int.Passwo
2df0: 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 rdCallback(char
2e00: 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 *buf, int size,
2e10: 69 6e 74 20 76 65 72 69 66 79 29 20 7b 0a 20 20 int verify) {.
2e20: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 62 75 return -1;..bu
2e30: 66 20 3d 20 62 75 66 3b 0a 09 73 69 7a 65 20 3d f = buf;..size =
2e40: 20 73 69 7a 65 3b 0a 09 76 65 72 69 66 79 20 3d size;..verify =
2e50: 20 76 65 72 69 66 79 3b 0a 7d 0a 23 65 6c 73 65 verify;.}.#else
2e60: 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61 73 73 .static int.Pass
2e70: 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 wordCallback(cha
2e80: 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 r *buf, int size
2e90: 2c 20 69 6e 74 20 76 65 72 69 66 79 2c 20 76 6f , int verify, vo
2ea0: 69 64 20 2a 75 64 61 74 61 29 20 7b 0a 20 20 20 id *udata) {.
2eb0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
2ec0: 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75 64 61 .= (State *) uda
2ed0: 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 ta;. Tcl_Inte
2ee0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
2ef0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
2f00: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
2f10: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
2f20: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
2f30: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
2f40: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 f (statePtr->pas
2f50: 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b sword == NULL) {
2f60: 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 ..if (Tcl_EvalEx
2f70: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 (interp, "tls::p
2f80: 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 assword", -1, TC
2f90: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d L_EVAL_GLOBAL) =
2fa0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
2fb0: 20 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 char *ret = (ch
2fc0: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 ar *) Tcl_GetStr
2fd0: 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ingResult(interp
2fe0: 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28 );.. strncpy(
2ff0: 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f buf, ret, (size_
3000: 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 72 t) size);.. r
3010: 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 eturn (int)strle
3020: 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c 73 65 20 n(ret);..} else
3030: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 {.. return -1
3040: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
3050: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
3060: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
3070: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 0a tr->password);..
3080: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
3090: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
30a0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 terp);. Tcl_P
30b0: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
30c0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
30d0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
30e0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
30f0: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 code = Tcl_Ev
3100: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 alObjEx(interp,
3110: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c cmdPtr, TCL_EVAL
3120: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 _GLOBAL);. if
3130: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b (code != TCL_OK
3140: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ) {.#if (TCL_MAJ
3150: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
3160: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
3170: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
3180: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
3190: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
31a0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
31b0: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
31c0: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 code);.#endif.
31d0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
31e0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
31f0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 );.. Tcl_Rele
3200: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
3210: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 statePtr);..
3220: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c if (code == TCL
3230: 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 20 2a 72 65 _OK) {..char *re
3240: 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c t = (char *) Tcl
3250: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 _GetStringResult
3260: 28 69 6e 74 65 72 70 29 3b 0a 09 69 66 20 28 73 (interp);..if (s
3270: 74 72 6c 65 6e 28 72 65 74 29 20 3c 20 73 69 7a trlen(ret) < siz
3280: 65 20 2d 20 31 29 20 7b 0a 09 20 20 20 20 73 74 e - 1) {.. st
3290: 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 rncpy(buf, ret,
32a0: 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a (size_t) size);.
32b0: 09 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 . Tcl_Release
32c0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
32d0: 74 65 72 70 29 3b 0a 09 20 20 20 20 72 65 74 75 terp);.. retu
32e0: 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 rn (int)strlen(r
32f0: 65 74 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 et);..}. }.
3300: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 Tcl_Release((C
3310: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 lientData) inter
3320: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d p);. return -
3330: 31 3b 0a 09 76 65 72 69 66 79 20 3d 20 76 65 72 1;..verify = ver
3340: 69 66 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a ify;.}.#endif...
3350: 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d ----------------
3380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3390: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
33a0: 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 iphersObjCmd --
33b0: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 list available c
33c0: 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 iphers. *. *.Thi
33d0: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
33e0: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
33f0: 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 s the "tls::ciph
3400: 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 ers" command. *.
3410: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c to list availabl
3420: 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 e ciphers, based
3430: 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 upon protocol s
3440: 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 elected.. *. * R
3450: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
3460: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
3470: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 list.. *. * Sid
3480: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f e effects:. *.co
3490: 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 nstructs and des
34a0: 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 troys SSL contex
34b0: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d t (CTX). *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3500: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 . */.static cons
3510: 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c t char *protocol
3520: 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c s[] = {.."ssl2",
3530: 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c "ssl3", "tls1",
3540: 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 "tls1.1", "tls1
3550: 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e .2", "tls1.3", N
3560: 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 ULL.};.enum prot
3570: 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 ocol {. TLS_S
3580: 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 SL2, TLS_SSL3, T
3590: 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 LS_TLS1, TLS_TLS
35a0: 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 1_1, TLS_TLS1_2,
35b0: 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 TLS_TLS1_3, TLS
35c0: 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 _NONE.};..static
35d0: 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 int.CiphersObjC
35e0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
35f0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
3600: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
3610: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
3620: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
3630: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
3640: 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 jPtr = NULL;.
3650: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 SSL_CTX *ctx =
3660: 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 NULL;. SSL *s
3670: 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 sl = NULL;. S
3680: 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 TACK_OF(SSL_CIPH
3690: 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 ER) *sk;. cha
36a0: 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 49 r *cp, buf[BUFSI
36b0: 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 Z];. int inde
36c0: 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 x, verbose = 0,
36d0: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 use_supported =
36e0: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
36f0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
3700: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c if ((objc < 2) |
3710: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a | (objc > 4)) {.
3720: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
3730: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
3740: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 v, "protocol ?ve
3750: 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 rbose? ?supporte
3760: 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 d?");..return TC
3770: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
3780: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
3790: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
37a0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 p, objv[1], prot
37b0: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c ocols, "protocol
37c0: 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d ", 0, &index) !=
37d0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
37e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
37f0: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a }. if ((obj
3800: 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 c > 2) && Tcl_Ge
3810: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 tBooleanFromObj(
3820: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c interp, objv[2],
3830: 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 &verbose) != TC
3840: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
3850: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
3860: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e . if ((objc >
3870: 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 3) && Tcl_GetBo
3880: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 oleanFromObj(int
3890: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 erp, objv[3], &u
38a0: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d se_supported) !=
38b0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
38c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
38d0: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 }.. switch
38e0: 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 ((enum protocol)
38f0: 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 65 20 54 index) {..case T
3900: 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 LS_SSL2:.#if OPE
3910: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
3920: 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 BER >= 0x1010000
3930: 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 0L || defined(NO
3940: 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL2) || define
3950: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
3960: 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 2).. Tcl_Appe
3970: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
3980: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 protocols[index
3990: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e ], ": protocol n
39a0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
39b0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
39c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c n TCL_ERROR;.#el
39d0: 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 se.. ctx = SS
39e0: 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f L_CTX_new(SSLv2_
39f0: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b method()); break
3a00: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 ;.#endif..case T
3a10: 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 LS_SSL3:.#if def
3a20: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c ined(NO_SSL3) ||
3a30: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
3a40: 5f 4e 4f 5f 53 53 4c 33 29 0a 09 20 20 20 20 54 _NO_SSL3).. T
3a50: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
3a60: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
3a70: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
3a80: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
3a90: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
3aa0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
3ab0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 OR;.#else.. c
3ac0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
3ad0: 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 29 (SSLv3_method())
3ae0: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
3af0: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a .case TLS_TLS1:.
3b00: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
3b10: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
3b20: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
3b30: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
3b40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
3b50: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
3b60: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
3b70: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
3b80: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
3b90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
3ba0: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f .. ctx = SSL_
3bb0: 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 6d 65 CTX_new(TLSv1_me
3bc0: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a thod()); break;.
3bd0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 #endif..case TLS
3be0: 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 _TLS1_1:.#if def
3bf0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
3c00: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
3c10: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 20 SL_NO_TLS1_1)..
3c20: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
3c30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
3c40: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
3c50: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
3c60: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
3c70: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
3c80: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
3c90: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
3ca0: 5f 6e 65 77 28 54 4c 53 76 31 5f 31 5f 6d 65 74 _new(TLSv1_1_met
3cb0: 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 hod()); break;.#
3cc0: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
3cd0: 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 TLS1_2:.#if defi
3ce0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c ned(NO_TLS1_2) |
3cf0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
3d00: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 20 20 L_NO_TLS1_2)..
3d10: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
3d20: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f lt(interp, proto
3d30: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 cols[index], ":
3d40: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
3d50: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
3d60: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
3d70: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
3d80: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ctx = SSL_CTX_
3d90: 6e 65 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68 new(TLSv1_2_meth
3da0: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 od()); break;.#e
3db0: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
3dc0: 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e LS1_3:.#if defin
3dd0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
3de0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
3df0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 _NO_TLS1_3)..
3e00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
3e10: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
3e20: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
3e30: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
3e40: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
3e50: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
3e60: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 RROR;.#else..
3e70: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e ctx = SSL_CTX_n
3e80: 65 77 28 54 4c 53 5f 6d 65 74 68 6f 64 28 29 29 ew(TLS_method())
3e90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 53 ;. SS
3ea0: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 L_CTX_set_min_pr
3eb0: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
3ec0: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 TLS1_3_VERSION)
3ed0: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 ;.. SSL_CTX_s
3ee0: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 et_max_proto_ver
3ef0: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 sion(ctx, TLS1_3
3f00: 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 _VERSION);..
3f10: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 break;.#endif..d
3f20: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 62 72 65 efault:.. bre
3f30: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 ak;. }. if
3f40: 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b (ctx == NULL) {
3f50: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
3f60: 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f lt(interp, REASO
3f70: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 N(), NULL);..ret
3f80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
3f90: 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 }.. ssl =
3fa0: 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 SSL_new(ctx);.
3fb0: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c if (ssl == NUL
3fc0: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
3fd0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 Result(interp, R
3fe0: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a EASON(), NULL);.
3ff0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
4000: 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f x);..return TCL_
4010: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
4020: 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e /* Use list an
4030: 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64 d order as would
4040: 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c be sent in a Cl
4050: 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c ientHello or all
4060: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 available ciphe
4070: 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 rs */. if (us
4080: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 e_supported) {..
4090: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 sk = SSL_get1_su
40a0: 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28 pported_ciphers(
40b0: 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ssl);. } else
40c0: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 {..sk = SSL_get
40d0: 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 _ciphers(ssl);.
40e0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b }.. if (sk
40f0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 != NULL) {..if
4100: 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 (!verbose) {..
4110: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
4120: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
4130: 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e L);.. for (in
4140: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f t i = 0; i < sk_
4150: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 SSL_CIPHER_num(s
4160: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e k); i++) {...con
4170: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 st SSL_CIPHER *c
4180: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 = sk_SSL_CIPHER
4190: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 _value(sk, i);..
41a0: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 .if (c == NULL)
41b0: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 continue;..../*
41c0: 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 cipher name or (
41d0: 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 NONE) */...cp =
41e0: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e SSL_CIPHER_get_n
41f0: 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 ame(c);...if (cp
4200: 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b == NULL) break;
4210: 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ...Tcl_ListObjAp
4220: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4230: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
4240: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c NewStringObj(cp,
4250: 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 -1));.. }...
4260: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 } else {.. ob
4270: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 jPtr = Tcl_NewSt
4280: 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 ringObj("",0);..
4290: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d for (int i =
42a0: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 0; i < sk_SSL_C
42b0: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 IPHER_num(sk); i
42c0: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 ++) {...const SS
42d0: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b L_CIPHER *c = sk
42e0: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 _SSL_CIPHER_valu
42f0: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 e(sk, i);...if (
4300: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 c == NULL) conti
4310: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 nue;..../* textu
4320: 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f al description o
4330: 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a f the cipher */.
4340: 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 ..if (SSL_CIPHER
4350: 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 _description(c,
4360: 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 buf, sizeof(buf)
4370: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 ) != NULL) {...
4380: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f Tcl_AppendToO
4390: 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 bj(objPtr, buf,
43a0: 28 69 6e 74 29 20 73 74 72 6c 65 6e 28 62 75 66 (int) strlen(buf
43b0: 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ));...} else {..
43c0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 . Tcl_AppendT
43d0: 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e oObj(objPtr, "UN
43e0: 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 KNOWN\n", 8);...
43f0: 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 }.. }..}..if
4400: 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 (use_supported)
4410: 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 {.. sk_SSL_CI
4420: 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 PHER_free(sk);..
4430: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f }. }. SSL_
4440: 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 free(ssl);. S
4450: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
4460: 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 ;.. Tcl_SetOb
4470: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
4480: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
4490: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
44a0: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
44b0: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
44c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4500: 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f --. *. * Protoco
4510: 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 lsObjCmd -- list
4520: 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f available proto
4530: 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 cols. *. *.This
4540: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
4550: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
4560: 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 the "tls::protoc
4570: 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 ols" command. *.
4580: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c to list availabl
4590: 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a e protocols.. *.
45a0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
45b0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
45c0: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a sult list.. *. *
45d0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
45e0: 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d *.none. *. *----
45f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4630: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 */.static int.P
4640: 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 rotocolsObjCmd(C
4650: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
4660: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
4670: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
4680: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
4690: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
46a0: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
46b0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
46c0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
46d0: 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a f (objc != 1) {.
46e0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
46f0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
4700: 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 v, "");..return
4710: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
4720: 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
4730: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
4740: 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 NULL);..#if OPE
4750: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
4760: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 BER < 0x10100000
4770: 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f L && !defined(NO
4780: 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e _SSL2) && !defin
4790: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
47a0: 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 L2). Tcl_List
47b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
47c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
47d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
47e0: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
47f0: 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e SSL2], -1));.#en
4800: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
4810: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 (NO_SSL3) && !de
4820: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
4830: 5f 53 53 4c 33 29 0a 20 20 20 20 54 63 6c 5f 4c _SSL3). Tcl_L
4840: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4850: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
4860: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
4870: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
4880: 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a LS_SSL3], -1));.
4890: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
48a0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 ned(NO_TLS1) &&
48b0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
48c0: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 54 63 _NO_TLS1). Tc
48d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
48e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
48f0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
4900: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
4910: 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 s[TLS_TLS1], -1)
4920: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
4930: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
4940: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
4950: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
4960: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4970: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4980: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
4990: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
49a0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 rotocols[TLS_TLS
49b0: 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 1_1], -1));.#end
49c0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
49d0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
49e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
49f0: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 54 63 O_TLS1_2). Tc
4a00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4a10: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
4a20: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
4a30: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
4a40: 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d s[TLS_TLS1_2], -
4a50: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
4a60: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
4a70: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
4a80: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
4a90: 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 3). Tcl_ListO
4aa0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
4ab0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
4ac0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
4ad0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 (protocols[TLS_T
4ae0: 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 LS1_3], -1));.#e
4af0: 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 ndif.. Tcl_Se
4b00: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
4b10: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
4b20: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
4b30: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
4b40: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
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 48 61 6e 64 -----. *. * Hand
4ba0: 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 shakeObjCmd --.
4bb0: 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e *. *.This comman
4bc0: 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 d is used to ver
4bd0: 69 66 79 20 77 68 65 74 68 65 72 20 74 68 65 20 ify whether the
4be0: 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d handshake is com
4bf0: 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e plete. *.or not.
4c00: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
4c10: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
4c20: 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e l result. 1 mean
4c30: 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 s handshake comp
4c40: 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 lete, 0 means pe
4c50: 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 nding.. *. * Sid
4c60: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 e effects:. *.Ma
4c70: 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f y force SSL nego
4c80: 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 tiation to take
4c90: 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d place.. *. *----
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 0a ---------------.
4ce0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 */.static int H
4cf0: 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 andshakeObjCmd(C
4d00: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
4d10: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
4d20: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
4d30: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
4d40: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
4d50: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
4d60: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 n; /* The
4d70: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 channel to set
4d80: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 a mode on. */.
4d90: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
4da0: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 r; /* cli
4db0: 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 ent state for ss
4dc0: 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 l socket */.
4dd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 const char *errS
4de0: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 tr = NULL;. i
4df0: 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 nt ret = 1;.
4e00: 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 int err = 0;..
4e10: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
4e20: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
4e30: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc != 2) {..Tcl_
4e40: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
4e50: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
4e60: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 hannel");..retur
4e70: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
4e80: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
4e90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
4ea0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 nterp, Tcl_GetSt
4eb0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
4ec0: 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c [1], NULL), NULL
4ed0: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 );. if (chan
4ee0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
4ef0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
4f00: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
4f10: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 }.. /*.
4f20: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
4f30: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
4f40: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20 pmost channel.
4f50: 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d */. chan =
4f60: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
4f70: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 el(chan);. if
4f80: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
4f90: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
4fa0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
4fb0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
4fc0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
4fd0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
4fe0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
4ff0: 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f e(chan), "\": no
5000: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 t a TLS channel"
5010: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
5020: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
5030: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 }. statePtr
5040: 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 = (State *)Tcl_G
5050: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
5060: 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 eData(chan);..
5070: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 dprintf("Calli
5080: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f ng Tls_WaitForCo
5090: 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 nnect");. ret
50a0: 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f = Tls_WaitForCo
50b0: 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 nnect(statePtr,
50c0: 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 &err, 1);. dp
50d0: 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 rintf("Tls_WaitF
50e0: 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e orConnect return
50f0: 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a ed: %i", ret);..
5100: 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 if (ret < 0
5110: 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 && ((statePtr->f
5120: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 lags & TLS_TCL_A
5130: 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d SYNC) && (err ==
5140: 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 EAGAIN))) {..dp
5150: 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 rintf("Async set
5160: 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 and err = EAGAI
5170: 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 N");..ret = 0;.
5180: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 } else if (re
5190: 74 20 3c 20 30 29 20 7b 0a 09 65 72 72 53 74 72 t < 0) {..errStr
51a0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 = statePtr->err
51b0: 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 ;..Tcl_ResetResu
51c0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c lt(interp);..Tcl
51d0: 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a _SetErrno(err);.
51e0: 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c ..if (!errStr ||
51f0: 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 (*errStr == 0))
5200: 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d {.. errStr =
5210: 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 Tcl_PosixError(
5220: 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 interp);..}...Tc
5230: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
5240: 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b nterp, "handshak
5250: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 e failed: ", err
5260: 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 Str, (char *) NU
5270: 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 LL);..dprintf("R
5280: 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 eturning TCL_ERR
5290: 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b OR with handshak
52a0: 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 e failed: %s", e
52b0: 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 rrStr);..return(
52c0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
52d0: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 } else {..if (er
52e0: 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 r != 0) {.. d
52f0: 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 printf("Got an e
5300: 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 rror with a comp
5310: 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a leted handshake:
5320: 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 err = %i", err)
5330: 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 ;..}..ret = 1;.
5340: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
5350: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c f("Returning TCL
5360: 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 _OK with data \"
5370: 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 %i\"", ret);.
5380: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
5390: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 t(interp, Tcl_Ne
53a0: 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 wIntObj(ret));.
53b0: 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b return(TCL_OK
53c0: 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d );..clientData =
53d0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a clientData;.}..
53e0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5420: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 --------. *. * I
5430: 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 mportObjCmd --.
5440: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
5450: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ure is invoked t
5460: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 o process the "s
5470: 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 sl" command. *.
5480: 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e *.The ssl comman
5490: 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 d pushes SSL ove
54a0: 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 r a (newly conne
54b0: 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 cted) tcp socket
54c0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
54d0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
54e0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
54f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
5500: 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 .May modify the
5510: 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 behavior of an I
5520: 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a O channel.. *. *
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5570: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
5580: 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 nt.ImportObjCmd(
5590: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
55a0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
55b0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
55c0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
55d0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
55e0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
55f0: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e an;../* The chan
5600: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
5610: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 e on. */. Sta
5620: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f te *statePtr;../
5630: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
5640: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
5650: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 . SSL_CTX *ct
5660: 78 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c x. = NULL
5670: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 ;. Tcl_Obj *s
5680: 63 72 69 70 74 09 20 20 20 20 20 20 20 20 3d 20 cript. =
5690: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
56a0: 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 20 j *password.
56b0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
56c0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 Tcl_DString uppe
56d0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
56e0: 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ion, upperChanne
56f0: 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 lBlocking, upper
5700: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c ChannelEncoding,
5710: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 upperChannelEOF
5720: 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 Char;. int id
5730: 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 x, len;. int
5740: 66 6c 61 67 73 09 09 20 20 20 20 20 20 20 20 3d flags.. =
5750: 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 TLS_TCL_INIT;.
5760: 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 20 int server..
5770: 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69 = 0;./* i
5780: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 s connection inc
5790: 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e oming or outgoin
57a0: 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a g? */. char *
57b0: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 keyfile.
57c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
57d0: 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20 20 20 *certfile.
57e0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 = NULL;. u
57f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 nsigned char *ke
5800: 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 y .= NULL;.
5810: 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20 20 20 int key_len
5820: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b = 0;
5830: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
5840: 61 72 20 2a 63 65 72 74 20 20 20 20 20 20 20 20 ar *cert
5850: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 = NULL;. int
5860: 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 20 cert_len
5870: 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 = 0;.
5880: 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 09 char *ciphers.
5890: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
58a0: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 char *cipher
58b0: 73 75 69 74 65 73 09 20 20 20 20 20 20 20 20 3d suites. =
58c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
58d0: 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 *CAfile.
58e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
58f0: 20 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 20 *CAdir..
5900: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
5910: 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 20 r *DHparams.
5920: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
5930: 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 char *model..
5940: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 23 69 66 = NULL;.#if
5950: 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ndef OPENSSL_NO_
5960: 54 4c 53 45 58 54 0a 20 20 20 20 63 68 61 72 20 TLSEXT. char
5970: 2a 73 65 72 76 65 72 6e 61 6d 65 09 20 20 20 20 *servername.
5980: 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 = NULL;./* h
5990: 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 ostname for Serv
59a0: 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 er Name Indicati
59b0: 6f 6e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 on */. Tcl_Ob
59c0: 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b j *alpn..= NULL;
59d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 74 20 .#endif. int
59e0: 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d ssl2 = 0, ssl3 =
59f0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 0;. int tls1
5a00: 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 = 1, tls1_1 = 1
5a10: 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c , tls1_2 = 1, tl
5a20: 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e s1_3 = 1;. in
5a30: 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 t proto = 0, lev
5a40: 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 el = -1;. int
5a50: 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 verify = 0, req
5a60: 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 uire = 0, reques
5a70: 74 20 3d 20 31 3b 0a 0a 20 20 20 20 64 70 72 69 t = 1;.. dpri
5a80: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
5a90: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
5aa0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
5ab0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
5ac0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
5ad0: 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e 65 64 SSL2) && defined
5ae0: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66 (NO_TLS1) && def
5af0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
5b00: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
5b10: 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64 S1_2) && defined
5b20: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 64 (NO_TLS1_3) && d
5b30: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
5b40: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 && !defined(NO_S
5b50: 53 4c 32 29 0a 20 20 20 20 73 73 6c 32 20 3d 20 SL2). ssl2 =
5b60: 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 1;.#endif.#if !d
5b70: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
5b80: 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 66 69 6e O_SSL3) && defin
5b90: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 ed(NO_TLS1) && d
5ba0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
5bb0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f ) && defined(NO_
5bc0: 54 4c 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e TLS1_2) && defin
5bd0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 ed(NO_TLS1_3) &&
5be0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 defined(NO_SSL2
5bf0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f ) && !defined(NO
5c00: 5f 53 53 4c 33 29 0a 20 20 20 20 73 73 6c 33 20 _SSL3). ssl3
5c10: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 1;.#endif.#if
5c20: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
5c30: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
5c40: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 SSL_NO_TLS1).
5c50: 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 tls1 = 0;.#endi
5c60: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
5c70: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
5c80: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
5c90: 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f LS1_1). tls1_
5ca0: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 1 = 0;.#endif.#i
5cb0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
5cc0: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
5cd0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
5ce0: 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 2). tls1_2 =
5cf0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
5d00: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
5d10: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
5d20: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
5d30: 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 tls1_3 = 0;.#
5d40: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f endif.. if (o
5d50: 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f bjc < 2) {..Tcl_
5d60: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
5d70: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
5d80: 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f hannel ?options?
5d90: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
5da0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
5db0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
5dc0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
5dd0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
5de0: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 mObj(objv[1], NU
5df0: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 LL), NULL);.
5e00: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
5e10: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
5e20: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
5e30: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
5e40: 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 /*. * Make s
5e50: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f ure to operate o
5e60: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 n the topmost ch
5e70: 61 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 annel. */.
5e80: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
5e90: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
5ea0: 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 ;.. for (idx
5eb0: 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b = 2; idx < objc;
5ec0: 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 idx++) {..char
5ed0: 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 *opt = Tcl_GetSt
5ee0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
5ef0: 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 [idx], NULL);...
5f00: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d if (opt[0] != '-
5f10: 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a ').. break;..
5f20: 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 .OPTSTR("-cadir"
5f30: 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 , CAdir);..OPTST
5f40: 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 R("-cafile", CAf
5f50: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
5f60: 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 certfile", certf
5f70: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
5f80: 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 cipher", ciphers
5f90: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 );..OPTSTR("-cip
5fa0: 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b hers", ciphers);
5fb0: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 ..OPTSTR("-ciphe
5fc0: 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 rsuites", cipher
5fd0: 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a suites);..OPTOBJ
5fe0: 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 ("-command", scr
5ff0: 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ipt);..OPTSTR("-
6000: 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 dhparams", DHpar
6010: 61 6d 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ams);..OPTSTR("-
6020: 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c keyfile", keyfil
6030: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f e);..OPTSTR("-mo
6040: 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f del", model);..O
6050: 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 PTOBJ("-password
6060: 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f ", password);..O
6070: 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 PTBOOL("-require
6080: 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 ", require);..OP
6090: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 TBOOL("-request"
60a0: 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 , request);..OPT
60b0: 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 6c 65 INT("-securityle
60c0: 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f vel", level);..O
60d0: 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 PTBOOL("-server"
60e0: 2c 20 73 65 72 76 65 72 29 3b 0a 23 69 66 6e 64 , server);.#ifnd
60f0: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ef OPENSSL_NO_TL
6100: 53 45 58 54 0a 09 4f 50 54 53 54 52 28 22 2d 73 SEXT..OPTSTR("-s
6110: 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 ervername", serv
6120: 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 4f 42 4a ername);..OPTOBJ
6130: 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b ("-alpn", alpn);
6140: 0a 23 65 6e 64 69 66 0a 0a 09 4f 50 54 42 4f 4f .#endif...OPTBOO
6150: 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 L("-ssl2", ssl2)
6160: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c ;..OPTBOOL("-ssl
6170: 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 3", ssl3);..OPTB
6180: 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 OOL("-tls1", tls
6190: 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 1);..OPTBOOL("-t
61a0: 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b ls1.1", tls1_1);
61b0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 ..OPTBOOL("-tls1
61c0: 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f .2", tls1_2);..O
61d0: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 PTBOOL("-tls1.3"
61e0: 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 42 , tls1_3);..OPTB
61f0: 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 YTE("-cert", cer
6200: 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f t, cert_len);..O
6210: 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b PTBYTE("-key", k
6220: 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 0a 09 ey, key_len);...
6230: 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c OPTBAD("option",
6240: 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c "-alpn, -cadir,
6250: 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c -cafile, -cert,
6260: 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 -certfile, -cip
6270: 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 her, -ciphersuit
6280: 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 es, -command, -d
6290: 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d hparams, -key, -
62a0: 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c keyfile, -model,
62b0: 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 72 65 71 -password, -req
62c0: 75 69 72 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 uire, -request,
62d0: 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c 2c 20 -securitylevel,
62e0: 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 -server, -server
62f0: 6e 61 6d 65 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 name, -ssl2, -ss
6300: 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 l3, -tls1, -tls1
6310: 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 6f 72 20 .1, -tls1.2, or
6320: 2d 74 6c 73 31 2e 33 22 29 3b 0a 0a 09 72 65 74 -tls1.3");...ret
6330: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
6340: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 }. if (req
6350: 75 65 73 74 29 09 20 20 20 20 76 65 72 69 66 79 uest). verify
6360: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 |= SSL_VERIFY_C
6370: 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c LIENT_ONCE | SSL
6380: 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 _VERIFY_PEER;.
6390: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 if (request &&
63a0: 20 72 65 71 75 69 72 65 29 20 76 65 72 69 66 79 require) verify
63b0: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 |= SSL_VERIFY_F
63c0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 AIL_IF_NO_PEER_C
63d0: 45 52 54 3b 0a 20 20 20 20 69 66 20 28 76 65 72 ERT;. if (ver
63e0: 69 66 79 20 3d 3d 20 30 29 09 76 65 72 69 66 79 ify == 0).verify
63f0: 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f = SSL_VERIFY_NO
6400: 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c NE;.. proto |
6410: 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 = (ssl2 ? TLS_PR
6420: 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 OTO_SSL2 : 0);.
6430: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c proto |= (ssl
6440: 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 3 ? TLS_PROTO_SS
6450: 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f L3 : 0);. pro
6460: 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c to |= (tls1 ? TL
6470: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 S_PROTO_TLS1 : 0
6480: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
6490: 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 (tls1_1 ? TLS_PR
64a0: 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b OTO_TLS1_1 : 0);
64b0: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 . proto |= (t
64c0: 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 ls1_2 ? TLS_PROT
64d0: 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 O_TLS1_2 : 0);.
64e0: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 proto |= (tls
64f0: 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 1_3 ? TLS_PROTO_
6500: 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 TLS1_3 : 0);..
6510: 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 /* reset to NU
6520: 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 LL if blank stri
6530: 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 ng provided */.
6540: 20 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 if (cert && !
6550: 2a 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 *cert)..
6560: 63 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e cert. = N
6570: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 ULL;. if (key
6580: 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 && !*key)..
6590: 20 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 key.
65a0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
65b0: 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 certfile && !*ce
65c0: 72 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 rtfile)
65d0: 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b certfile.= NULL;
65e0: 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 . if (keyfile
65f0: 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 && !*keyfile)..
6600: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 keyfile.
6610: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
6620: 63 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 ciphers && !*cip
6630: 68 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 hers). ci
6640: 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 phers. =
6650: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 NULL;. if (ci
6660: 70 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a phersuites && !*
6670: 63 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 ciphersuites) ci
6680: 70 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 phersuites =
6690: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 NULL;. if (CA
66a0: 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 file && !*CAfile
66b0: 29 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 ). CAfile
66c0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
66d0: 0a 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26 . if (CAdir &
66e0: 26 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 & !*CAdir).
66f0: 20 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20 CAdir.
6700: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
6710: 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 (DHparams && !*D
6720: 48 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 Hparams).
6730: 20 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 DHparams
6740: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a = NULL;.. /*
6750: 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a new SSL state *
6760: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 /. statePtr..
6770: 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c = (State *) ckal
6780: 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 loc((unsigned) s
6790: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 izeof(State));.
67a0: 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 memset(stateP
67b0: 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 tr, 0, sizeof(St
67c0: 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 ate));.. stat
67d0: 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c ePtr->flags.= fl
67e0: 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 ags;. statePt
67f0: 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 r->interp.= inte
6800: 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 rp;. statePtr
6810: 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 ->vflags.= verif
6820: 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d y;. statePtr-
6830: 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 >err.= "";..
6840: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 /* allocate scri
6850: 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 pt */. if (sc
6860: 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 ript) {..(void)
6870: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
6880: 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 mObj(script, &le
6890: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
68a0: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 . statePtr->c
68b0: 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 allback = script
68c0: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 ;.. Tcl_IncrR
68d0: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
68e0: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a ->callback);..}.
68f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c }.. /* al
6900: 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 locate password
6910: 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 */. if (passw
6920: 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 ord) {..(void) T
6930: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
6940: 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c Obj(password, &l
6950: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b en);..if (len) {
6960: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
6970: 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 password = passw
6980: 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e ord;.. Tcl_In
6990: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
69a0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a Ptr->password);.
69b0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 .}. }.. if
69c0: 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 (model != NULL)
69d0: 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f {..int mode;../
69e0: 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c * Get the "model
69f0: 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 " context */..ch
6a00: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
6a10: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 nel(interp, mode
6a20: 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 l, &mode);..if (
6a30: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
6a40: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 nnel) NULL) {..
6a50: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
6a60: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
6a70: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
6a80: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 ERROR;..}.../*..
6a90: 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 * Make sure to
6aa0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
6ab0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 opmost channel..
6ac0: 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f */..chan = Tcl_
6ad0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
6ae0: 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 an);..if (Tcl_Ge
6af0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
6b00: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
6b10: 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 lType()) {..
6b20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
6b30: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
6b40: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
6b50: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
6b60: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 an),..."\": not
6b70: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 a TLS channel",
6b80: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
6b90: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
6ba0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
6bb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6bc0: 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 .}..ctx = ((Stat
6bd0: 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e e *)Tcl_GetChann
6be0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 elInstanceData(c
6bf0: 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 han))->ctx;.
6c00: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 } else {..if ((c
6c10: 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 tx = CTX_Init(st
6c20: 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 atePtr, server,
6c30: 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 proto, keyfile,
6c40: 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 certfile, key, c
6c50: 65 72 74 2c 0a 09 20 20 20 20 6b 65 79 5f 6c 65 ert,.. key_le
6c60: 6e 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 n, cert_len, CAd
6c70: 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 ir, CAfile, ciph
6c80: 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 ers, ciphersuite
6c90: 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 s, level, DHpara
6ca0: 6d 73 29 29 20 3d 3d 20 28 53 53 4c 5f 43 54 58 ms)) == (SSL_CTX
6cb0: 2a 29 30 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f *)0) {.. Tls_
6cc0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
6cd0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
6ce0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6cf0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 .}. }.. st
6d00: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 atePtr->ctx = ct
6d10: 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 x;.. /*.
6d20: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b * We need to mak
6d30: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 e sure that the
6d40: 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e channel works in
6d50: 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65 binary (for the
6d60: 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69 . * encrypti
6d70: 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f on not to get go
6d80: 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a ofed up).. *
6d90: 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f We only want to
6da0: 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66 adjust the buff
6db0: 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 ering in pre-v2
6dc0: 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a channels, where.
6dd0: 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e * each chan
6de0: 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b nel in the stack
6df0: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20 maintained its
6e00: 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20 own buffers..
6e10: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 */. Tcl_DSt
6e20: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
6e30: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
6e40: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 n);. Tcl_DStr
6e50: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
6e60: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a annelBlocking);.
6e70: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
6e80: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
6e90: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 lEOFChar);. T
6ea0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
6eb0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
6ec0: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 ding);. Tcl_G
6ed0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
6ee0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
6ef0: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 eofchar", &upper
6f00: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
6f10: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
6f20: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
6f30: 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 , chan, "-encodi
6f40: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e ng", &upperChann
6f50: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 elEncoding);.
6f60: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
6f70: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
6f80: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f an, "-translatio
6f90: 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 n", &upperChanne
6fa0: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 lTranslation);.
6fb0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
6fc0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
6fd0: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 chan, "-blocking
6fe0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
6ff0: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 Blocking);. T
7000: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
7010: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
7020: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
7030: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 , "binary");.
7040: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
7050: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
7060: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c an, "-blocking",
7070: 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 "true");. dp
7080: 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 rintf("Consuming
7090: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 Tcl channel %s"
70a0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
70b0: 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 Name(chan));.
70c0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 statePtr->self
70d0: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e = Tcl_StackChann
70e0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 el(interp, Tls_C
70f0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 hannelType(), (C
7100: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
7110: 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 Ptr, (TCL_READAB
7120: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c LE | TCL_WRITABL
7130: 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 E), chan);. d
7140: 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 printf("Created
7150: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 channel named %s
7160: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
7170: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
7180: 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 self));. if (
7190: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
71a0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
71b0: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 NULL) {../*.. *
71c0: 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 No use of Tcl_Ev
71d0: 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 entuallyFree bec
71e0: 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 ause no possible
71f0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 Tcl_Preserve...
7200: 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 */..Tls_Free((c
7210: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
7220: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
7230: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
7240: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
7250: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
7260: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 tePtr->self, "-t
7270: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c ranslation", Tcl
7280: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
7290: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
72a0: 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 lation));. Tc
72b0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
72c0: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 on(interp, state
72d0: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 Ptr->self, "-enc
72e0: 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 oding", Tcl_DStr
72f0: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 ingValue(&upperC
7300: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 hannelEncoding))
7310: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
7320: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
7330: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
7340: 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 f, "-eofchar", T
7350: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
7360: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
7370: 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f Char));. Tcl_
7380: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
7390: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
73a0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b r->self, "-block
73b0: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e ing", Tcl_DStrin
73c0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
73d0: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a nnelBlocking));.
73e0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 . /*. * S
73f0: 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f SL Initializatio
7400: 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 n. */. st
7410: 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 atePtr->ssl = SS
7420: 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e L_new(statePtr->
7430: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 ctx);. if (!s
7440: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a tatePtr->ssl) {.
7450: 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 ./* SSL library
7460: 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 error */..Tcl_Ap
7470: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
7480: 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e p, "couldn't con
7490: 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 struct ssl sessi
74a0: 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c on: ", REASON(),
74b0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
74c0: 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 ..Tls_Free((char
74d0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
74e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
74f0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 ;. }..#ifndef
7500: 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 45 OPENSSL_NO_TLSE
7510: 58 54 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 XT. if (serve
7520: 72 6e 61 6d 65 29 20 7b 0a 09 69 66 20 28 21 53 rname) {..if (!S
7530: 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f SL_set_tlsext_ho
7540: 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 st_name(statePtr
7550: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d ->ssl, servernam
7560: 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b e) && require) {
7570: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
7580: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
7590: 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f 73 74 setting TLS host
75a0: 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20 name extension
75b0: 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a failed", (char *
75c0: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 ) NULL);.
75d0: 20 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 Tls_Free((c
75e0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
75f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 ;. re
7600: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7610: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a }. }.
7620: 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a if (alpn) {.
7630: 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 63 ./* Convert a Tc
7640: 6c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 l list into a pr
7650: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 otocol-list in w
7660: 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 ire-format */..u
7670: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 nsigned char *pr
7680: 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 otos, *p;..unsig
7690: 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c ned int protos_l
76a0: 65 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 en = 0;..int i,
76b0: 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f len, cnt;..Tcl_O
76c0: 62 6a 20 2a 2a 6c 69 73 74 3b 0a 09 69 66 20 28 bj **list;..if (
76d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c Tcl_ListObjGetEl
76e0: 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 ements(interp, a
76f0: 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 lpn, &cnt, &list
7700: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
7710: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
7720: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
7730: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
7740: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 2f 2a 20 44 _ERROR;..}../* D
7750: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d etermine the mem
7760: 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 ory required for
7770: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 the protocol-li
7780: 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 st */..for (i =
7790: 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 0; i < cnt; i++)
77a0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 {.. Tcl_GetS
77b0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 tringFromObj(lis
77c0: 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 t[i], &len);..
77d0: 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 if (len > 255)
77e0: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 {...Tcl_AppendR
77f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 esult(interp, "a
7800: 6c 70 6e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d lpn protocol nam
7810: 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 e too long", (ch
7820: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 ar *) NULL);...T
7830: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
7840: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 statePtr);...re
7850: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7860: 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 . }.. prot
7870: 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 os_len += 1 + le
7880: 6e 3b 0a 09 7d 0a 09 2f 2a 20 42 75 69 6c 64 20 n;..}../* Build
7890: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f the complete pro
78a0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 tocol-list */..p
78b0: 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 rotos = ckalloc(
78c0: 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a protos_len);../*
78d0: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 protocol-lists
78e0: 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 consist of 8-bit
78f0: 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 length-prefixed
7900: 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a , byte strings *
7910: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 70 /..for (i = 0, p
7920: 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63 = protos; i < c
7930: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 nt; i++) {..
7940: 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f char *str = Tcl_
7950: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
7960: 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b (list[i], &len);
7970: 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e .. *p++ = len
7980: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c ;.. memcpy(p,
7990: 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20 str, len);..
79a0: 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 09 2f p += len;..}../
79b0: 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e * Note: This fun
79c0: 63 74 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 ctions reverses
79d0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 the return value
79e0: 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 convention */..
79f0: 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e if (SSL_set_alpn
7a00: 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 _protos(statePtr
7a10: 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 ->ssl, protos, p
7a20: 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 rotos_len)) {..
7a30: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
7a40: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 ult(interp, "fai
7a50: 6c 65 64 20 74 6f 20 73 65 74 20 61 6c 70 6e 20 led to set alpn
7a60: 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 protocols", (cha
7a70: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
7a80: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
7a90: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
7aa0: 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 ckfree(protos
7ab0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
7ac0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 2f 2a CL_ERROR;..}../*
7ad0: 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 SSL_set_alpn_pr
7ae0: 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 otos makes a cop
7af0: 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f y of the protoco
7b00: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 63 6b 66 72 65 l-list */..ckfre
7b10: 65 28 70 72 6f 74 6f 73 29 3b 0a 20 20 20 20 7d e(protos);. }
7b20: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 0a .#endif.. /*.
7b30: 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 * SSL Callb
7b40: 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 acks. */.
7b50: 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 SSL_set_app_dat
7b60: 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c a(statePtr->ssl,
7b70: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
7b80: 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 r);./* point bac
7b90: 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 k to us */. S
7ba0: 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 SL_set_verify(st
7bb0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 atePtr->ssl, ver
7bc0: 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 ify, VerifyCallb
7bd0: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 ack);. SSL_CT
7be0: 58 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 X_set_info_callb
7bf0: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ack(statePtr->ct
7c00: 78 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 x, InfoCallback)
7c10: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 ;.. /* Create
7c20: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f Tcl_Channel BIO
7c30: 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 Handler */.
7c40: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 statePtr->p_bio.
7c50: 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 = BIO_new_tcl(st
7c60: 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c atePtr, BIO_NOCL
7c70: 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 OSE);. stateP
7c80: 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 tr->bio.= BIO_ne
7c90: 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a w(BIO_f_ssl());.
7ca0: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 29 . if (server)
7cb0: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c {..statePtr->fl
7cc0: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 ags |= TLS_TCL_S
7cd0: 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f ERVER;..SSL_set_
7ce0: 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 accept_state(sta
7cf0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
7d00: 20 7d 20 65 6c 73 65 20 7b 0a 09 53 53 4c 5f 73 } else {..SSL_s
7d10: 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 et_connect_state
7d20: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
7d30: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 . }. SSL_s
7d40: 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d et_bio(statePtr-
7d50: 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e >ssl, statePtr->
7d60: 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d p_bio, statePtr-
7d70: 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f >p_bio);. BIO
7d80: 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 _set_ssl(statePt
7d90: 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 r->bio, statePtr
7da0: 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f ->ssl, BIO_NOCLO
7db0: 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 SE);.. /*.
7dc0: 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 * End of SSL I
7dd0: 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 nit. */.
7de0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
7df0: 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 ng %s", Tcl_GetC
7e00: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
7e10: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 Ptr->self));.
7e20: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
7e30: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 nterp, (char *)
7e40: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
7e50: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
7e60: 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 f), TCL_VOLATILE
7e70: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
7e80: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
7e90: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
7ea0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
7eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
7ef0: 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 . * UnimportObjC
7f00: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 md --. *. *.This
7f10: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
7f20: 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 voked to remove
7f30: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
7f40: 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 nel filter.. *.
7f50: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
7f60: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
7f70: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
7f80: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
7f90: 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 modify the behav
7fa0: 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 ior of an IO cha
7fb0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nnel.. *. *-----
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
8000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e */.static int.Un
8010: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 importObjCmd(Cli
8020: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
8030: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
8040: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
8050: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
8060: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
8070: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
8080: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c ../* The channel
8090: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
80a0: 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e n. */.. dprin
80b0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
80c0: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 if (objc != 2
80d0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
80e0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
80f0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 objv, "channel"
8100: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
8110: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
8120: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
8130: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
8140: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
8150: 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 v[1]), NULL);.
8160: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 if (chan == (T
8170: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
8180: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
8190: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
81a0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 /*. * Make
81b0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
81c0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
81d0: 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a channel. */.
81e0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
81f0: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
8200: 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c n);.. if (Tcl
8210: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
8220: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
8230: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
8240: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8250: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
8260: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
8270: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
8280: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 n),..."\": not a
8290: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
82a0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
82b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
82c0: 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 if (Tcl_Unst
82d0: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 ackChannel(inter
82e0: 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f p, chan) == TCL_
82f0: 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e ERROR) {..return
8300: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8310: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }.. return TC
8320: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 L_OK;..clientDat
8330: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a a = clientData;.
8340: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
8350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
8390: 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 * CTX_Init -- c
83a0: 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 onstruct a SSL_C
83b0: 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 TX instance. *.
83c0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
83d0: 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e valid SSL_CTX in
83e0: 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a stance or NULL..
83f0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
8400: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 ts:. *.construct
8410: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 s SSL context (C
8420: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d TX). *. *-------
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
8470: 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 .static SSL_CTX
8480: 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 *.CTX_Init(State
8490: 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 *statePtr, int
84a0: 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 isServer, int pr
84b0: 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 oto, char *keyfi
84c0: 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69 le, char *certfi
84d0: 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 le,. unsigned
84e0: 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 char *key, unsi
84f0: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c gned char *cert,
8500: 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e int key_len, in
8510: 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72 t cert_len, char
8520: 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 63 68 61 *CAdir,. cha
8530: 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20 r *CAfile, char
8540: 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a *ciphers, char *
8550: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e ciphersuites, in
8560: 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 t level, char *D
8570: 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 Hparams) {. T
8580: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
8590: 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p = statePtr->in
85a0: 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 terp;. SSL_CT
85b0: 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 X *ctx = NULL;.
85c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 Tcl_DString d
85d0: 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 s;. Tcl_DStri
85e0: 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 ng ds1;. int
85f0: 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 off = 0;. int
8600: 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 load_private_ke
8610: 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c y;. const SSL
8620: 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b _METHOD *method;
8630: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
8640: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
8650: 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c (!proto) {..Tcl
8660: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
8670: 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 terp, "no valid
8680: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 protocol selecte
8690: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 d", NULL);..retu
86a0: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b rn (SSL_CTX *)0;
86b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 . }.. /* c
86c0: 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 reate SSL contex
86d0: 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c t */.#if OPENSSL
86e0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
86f0: 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c >= 0x10100000L |
8700: 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c | defined(NO_SSL
8710: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
8720: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 ENSSL_NO_SSL2).
8730: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
8740: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
8750: 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 SSL2)) {..Tcl_Ap
8760: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
8770: 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f p, "SSL2 protoco
8780: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
8790: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
87a0: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 (SSL_CTX *)0;.
87b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
87c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
87d0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
87e0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 SSL_NO_SSL3).
87f0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
8800: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 to, TLS_PROTO_SS
8810: 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 L3)) {..Tcl_Appe
8820: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
8830: 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 "SSL3 protocol
8840: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
8850: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 NULL);..return (
8860: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 SSL_CTX *)0;.
8870: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
8880: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c fined(NO_TLS1) |
8890: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
88a0: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 L_NO_TLS1). i
88b0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
88c0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
88d0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
88e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
88f0: 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c TLS 1.0 protocol
8900: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
8910: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
8920: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 (SSL_CTX *)0;.
8930: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 }.#endif.#if d
8940: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
8950: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
8960: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a NSSL_NO_TLS1_1).
8970: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 if (ENABLED(
8980: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
8990: 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c _TLS1_1)) {..Tcl
89a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
89b0: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 terp, "TLS 1.1 p
89c0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
89d0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
89e0: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
89f0: 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 *)0;. }.#endi
8a00: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
8a10: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
8a20: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
8a30: 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 LS1_2). if (E
8a40: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
8a50: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 S_PROTO_TLS1_2))
8a60: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
8a70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
8a80: 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.2 protocol n
8a90: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
8aa0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 ULL);..return (S
8ab0: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 SL_CTX *)0;.
8ac0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 }.#endif.#if def
8ad0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
8ae0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
8af0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
8b00: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
8b10: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
8b20: 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 LS1_3)) {..Tcl_A
8b30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
8b40: 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f rp, "TLS 1.3 pro
8b50: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
8b60: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ted", NULL);..re
8b70: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 turn (SSL_CTX *)
8b80: 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0;. }.#endif.
8b90: 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f . switch (pro
8ba0: 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 to) {.#if OPENSS
8bb0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
8bc0: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 < 0x10100000L &
8bd0: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 & !defined(NO_SS
8be0: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L2) && !defined(
8bf0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
8c00: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
8c10: 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f OTO_SSL2:..metho
8c20: 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f 64 d = SSLv2_method
8c30: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
8c40: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
8c50: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
8c60: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8c70: 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20 54 SSL3). case T
8c80: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 LS_PROTO_SSL3:..
8c90: 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d method = SSLv3_m
8ca0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
8cb0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
8cc0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 ined(NO_TLS1) &&
8cd0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
8ce0: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 63 L_NO_TLS1). c
8cf0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
8d00: 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c S1:..method = TL
8d10: 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 Sv1_method();..b
8d20: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
8d30: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
8d40: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
8d50: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
8d60: 5f 31 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 _1). case TLS
8d70: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 _PROTO_TLS1_1:..
8d80: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 method = TLSv1_1
8d90: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
8da0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
8db0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
8dc0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8dd0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
8de0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
8df0: 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 OTO_TLS1_2:..met
8e00: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 hod = TLSv1_2_me
8e10: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
8e20: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
8e30: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
8e40: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
8e50: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
8e60: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
8e70: 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 0a 09 20 2a _TLS1_3:../*.. *
8e80: 20 54 68 65 20 76 65 72 73 69 6f 6e 20 72 61 6e The version ran
8e90: 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 ge is constraine
8ea0: 64 20 62 65 6c 6f 77 2c 0a 09 20 2a 20 61 66 74 d below,.. * aft
8eb0: 65 72 20 74 68 65 20 63 6f 6e 74 65 78 74 20 69 er the context i
8ec0: 73 20 63 72 65 61 74 65 64 2e 20 20 55 73 65 20 s created. Use
8ed0: 74 68 65 0a 09 20 2a 20 67 65 6e 65 72 69 63 20 the.. * generic
8ee0: 6d 65 74 68 6f 64 20 68 65 72 65 2e 0a 09 20 2a method here... *
8ef0: 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f /..method = TLS_
8f00: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
8f10: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 ;.#endif. def
8f20: 61 75 6c 74 3a 0a 23 69 66 20 4f 50 45 4e 53 53 ault:.#if OPENSS
8f30: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
8f40: 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 0a >= 0x10100000L.
8f50: 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69 ./* Negotiate hi
8f60: 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20 ghest available
8f70: 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 SSL/TLS version
8f80: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 */..method = TLS
8f90: 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 65 6c 73 65 _method();.#else
8fa0: 0a 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 ..method = SSLv2
8fb0: 33 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 65 6e 64 3_method();.#end
8fc0: 69 66 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 if.#if OPENSSL_V
8fd0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
8fe0: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 0x10100000L && !
8ff0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
9000: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
9010: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f NSSL_NO_SSL2)..o
9020: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
9030: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
9040: 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53 SSL2) ? 0 : SS
9050: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a L_OP_NO_SSLv2);.
9060: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
9070: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 ned(NO_SSL3) &&
9080: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
9090: 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c _NO_SSL3)..off |
90a0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
90b0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 , TLS_PROTO_SSL3
90c0: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 ) ? 0 : SSL_OP
90d0: 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 _NO_SSLv3);.#end
90e0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
90f0: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 NO_TLS1) && !def
9100: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
9110: 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 TLS1)..off |= (E
9120: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
9130: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 S_PROTO_TLS1)
9140: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
9150: 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 TLSv1);.#endif.#
9160: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
9170: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
9180: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
9190: 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 S1_1)..off |= (E
91a0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
91b0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 S_PROTO_TLS1_1)
91c0: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
91d0: 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 TLSv1_1);.#endif
91e0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
91f0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
9200: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
9210: 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 TLS1_2)..off |=
9220: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
9230: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 TLS_PROTO_TLS1_2
9240: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ) ? 0 : SSL_OP_N
9250: 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 O_TLSv1_2);.#end
9260: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
9270: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
9280: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
9290: 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c O_TLS1_3)..off |
92a0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
92b0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
92c0: 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 _3) ? 0 : SSL_OP
92d0: 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 _NO_TLSv1_3);.#e
92e0: 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 ndif..break;.
92f0: 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 }.. ctx = SS
9300: 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 L_CTX_new(method
9310: 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 63 74 78 );.. if (!ctx
9320: 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c ) {..return(NULL
9330: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
9340: 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c (getenv(SSLKEYL
9350: 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f OGFILE)) {..SSL_
9360: 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 CTX_set_keylog_c
9370: 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 allback(ctx, Key
9380: 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 LogCallback);.
9390: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 }..#if !define
93a0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 d(NO_TLS1_3) &&
93b0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
93c0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
93d0: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 if (proto == TLS
93e0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b _PROTO_TLS1_3) {
93f0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 ..SSL_CTX_set_mi
9400: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 n_proto_version(
9410: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 ctx, TLS1_3_VERS
9420: 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ION);..SSL_CTX_s
9430: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 et_max_proto_ver
9440: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 sion(ctx, TLS1_3
9450: 5f 56 45 52 53 49 4f 4e 29 3b 0a 0a 09 69 66 20 _VERSION);...if
9460: 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 20 (!isServer) {..
9470: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f SSL_CTX_set_o
9480: 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f ptions(ctx, SSL_
9490: 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 OP_CIPHER_SERVER
94a0: 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 09 7d _PREFERENCE);..}
94b0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 . }.#endif..
94c0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 SSL_CTX_set_a
94d0: 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76 6f pp_data(ctx, (vo
94e0: 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 id*)interp);./*
94f0: 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 remember the int
9500: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 erpreter */.
9510: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
9520: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f ons(ctx, SSL_OP_
9530: 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c ALL);./* all SSL
9540: 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 bug workarounds
9550: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f */. SSL_CTX_
9560: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c set_options(ctx,
9570: 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 off);../* disab
9580: 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 le protocol vers
9590: 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e ions */.#if OPEN
95a0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
95b0: 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c ER < 0x10101000L
95c0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
95d0: 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d _mode(ctx, SSL_M
95e0: 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b ODE_AUTO_RETRY);
95f0: 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 ./* handle new h
9600: 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63 andshakes in bac
9610: 6b 67 72 6f 75 6e 64 20 2a 2f 0a 23 65 6e 64 69 kground */.#endi
9620: 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 f. SSL_CTX_se
9630: 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a ss_set_cache_siz
9640: 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 e(ctx, 128);..
9650: 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 /* Set user de
9660: 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 fined ciphers, c
9670: 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e ipher suites, an
9680: 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c d security level
9690: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 28 63 69 */. if (((ci
96a0: 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 phers != NULL) &
96b0: 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 & !SSL_CTX_set_c
96c0: 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 ipher_list(ctx,
96d0: 63 69 70 68 65 72 73 29 29 20 7c 7c 20 5c 0a 09 ciphers)) || \..
96e0: 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21 ((ciphersuites !
96f0: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f = NULL) && !SSL_
9700: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 CTX_set_ciphersu
9710: 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 ites(ctx, cipher
9720: 73 75 69 74 65 73 29 29 29 20 7b 0a 09 20 20 20 suites))) {..
9730: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
9740: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 t(interp, "Set c
9750: 69 70 68 65 72 73 20 66 61 69 6c 65 64 22 2c 20 iphers failed",
9760: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
9770: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 . SSL_CTX_fre
9780: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 e(ctx);.. ret
9790: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
97a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
97b0: 53 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 Set security lev
97c0: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 el */. if (le
97d0: 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 vel > -1 && leve
97e0: 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c l < 6) {../* SSL
97f0: 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _set_security_le
9800: 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f vel */..SSL_CTX_
9810: 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 set_security_lev
9820: 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a el(ctx, level);.
9830: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 }.. /* se
9840: 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 t some callbacks
9850: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f */. SSL_CTX_
9860: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 set_default_pass
9870: 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77 wd_cb(ctx, Passw
9880: 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 23 ordCallback);..#
9890: 69 66 6e 64 65 66 20 42 53 41 46 45 0a 20 20 20 ifndef BSAFE.
98a0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 SSL_CTX_set_def
98b0: 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 ault_passwd_cb_u
98c0: 73 65 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f serdata(ctx, (vo
98d0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
98e0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 72 #endif.. /* r
98f0: 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c ead a Diffie-Hel
9900: 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 lman parameters
9910: 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 file, or use the
9920: 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f built-in one */
9930: 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f .#ifdef OPENSSL_
9940: 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 NO_DH. if (DH
9950: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 params != NULL)
9960: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
9970: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 ult(interp, "DH
9980: 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 parameter suppor
9990: 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 t not available"
99a0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
99b0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
99c0: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 ctx);..return (S
99d0: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 SL_CTX *)0;.
99e0: 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 }.#else. {..D
99f0: 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61 H* dh;..if (DHpa
9a00: 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a rams != NULL) {.
9a10: 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 . BIO *bio;..
9a20: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
9a30: 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20 62 nit(&ds);.. b
9a40: 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c io = BIO_new_fil
9a50: 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 e(F2N(DHparams,
9a60: 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 &ds), "r");..
9a70: 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 if (!bio) {...T
9a80: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
9a90: 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e ds);...Tcl_Appen
9aa0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
9ab0: 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 "Could not find
9ac0: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 DH parameters fi
9ad0: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 le", (char *) NU
9ae0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
9af0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
9b00: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b rn (SSL_CTX *)0;
9b10: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 .. }... dh
9b20: 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f = PEM_read_bio_
9b30: 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 DHparams(bio, NU
9b40: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b LL, NULL, NULL);
9b50: 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 .. BIO_free(b
9b60: 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 io);.. Tcl_DS
9b70: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
9b80: 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a . if (!dh) {.
9b90: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
9ba0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c lt(interp, "Coul
9bb0: 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 d not read DH pa
9bc0: 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 rameters from fi
9bd0: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 le", (char *) NU
9be0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
9bf0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
9c00: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b rn (SSL_CTX *)0;
9c10: 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 .. }..} else
9c20: 7b 0a 09 20 20 20 20 64 68 20 3d 20 67 65 74 5f {.. dh = get_
9c30: 64 68 50 61 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 dhParams();..}..
9c40: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f SSL_CTX_set_tmp_
9c50: 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 44 48 dh(ctx, dh);..DH
9c60: 5f 66 72 65 65 28 64 68 29 3b 0a 20 20 20 20 7d _free(dh);. }
9c70: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
9c80: 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 set our certific
9c90: 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f ate */. load_
9ca0: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b private_key = 0;
9cb0: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c . if (certfil
9cc0: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f e != NULL) {..lo
9cd0: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d ad_private_key =
9ce0: 20 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 1;...Tcl_DStrin
9cf0: 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 gInit(&ds);...if
9d00: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 (SSL_CTX_use_ce
9d10: 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 rtificate_file(c
9d20: 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65 tx, F2N(certfile
9d30: 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 , &ds), SSL_FILE
9d40: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 TYPE_PEM) <= 0)
9d50: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 {.. Tcl_DStri
9d60: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 ngFree(&ds);..
9d70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
9d80: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 lt(interp, "unab
9d90: 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 le to set certif
9da0: 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 icate file ", ce
9db0: 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 rtfile, ": ",...
9dc0: 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 . REASON(),
9dd0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
9de0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 . SSL_CTX_fre
9df0: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 e(ctx);.. ret
9e00: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
9e10: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
9e20: 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c if (cert != NULL
9e30: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 ) {..load_privat
9e40: 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 e_key = 1;..if (
9e50: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 SSL_CTX_use_cert
9e60: 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 ificate_ASN1(ctx
9e70: 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 , cert_len, cert
9e80: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) <= 0) {.. T
9e90: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
9ea0: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 ds);.. Tcl_Ap
9eb0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
9ec0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
9ed0: 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 t certificate: "
9ee0: 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e ,.... REASON
9ef0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
9f00: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
9f10: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
9f20: 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 return (SSL_CTX
9f30: 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 *)0;..}. } e
9f40: 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 lse {..certfile
9f50: 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 = (char*)X509_ge
9f60: 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 t_default_cert_f
9f70: 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c ile();...if (SSL
9f80: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 _CTX_use_certifi
9f90: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 cate_file(ctx, c
9fa0: 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c ertfile, SSL_FIL
9fb0: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 ETYPE_PEM) <= 0)
9fc0: 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 {.#if 0.. Tc
9fd0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
9fe0: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 s);.. Tcl_App
9ff0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
a000: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 , "unable to use
a010: 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 default certifi
a020: 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 cate file ", cer
a030: 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 tfile, ": ",....
a040: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 REASON(), (
a050: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
a060: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
a070: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 (ctx);.. retu
a080: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b rn (SSL_CTX *)0;
a090: 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d .#endif..}. }
a0a0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 .. /* set our
a0b0: 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a private key */.
a0c0: 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 if (load_pri
a0d0: 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 vate_key) {..if
a0e0: 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c (keyfile == NULL
a0f0: 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 && key == NULL)
a100: 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20 {.. keyfile
a110: 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a = certfile;..}..
a120: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 .if (keyfile !=
a130: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 NULL) {.. /*
a140: 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 20 get the private
a150: 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 key associated w
a160: 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 69 ith this certifi
a170: 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 cate */.. if
a180: 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c (keyfile == NULL
a190: 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 ) {...keyfile =
a1a0: 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d certfile;.. }
a1b0: 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 ... if (SSL_C
a1c0: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 TX_use_PrivateKe
a1d0: 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 y_file(ctx, F2N(
a1e0: 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 keyfile, &ds), S
a1f0: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 SL_FILETYPE_PEM)
a200: 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 <= 0) {...Tcl_D
a210: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
a220: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 .../* flush the
a230: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 passphrase which
a240: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 might be left i
a250: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a n the result */.
a260: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 ..Tcl_SetResult(
a270: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 interp, NULL, TC
a280: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c L_STATIC);...Tcl
a290: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
a2a0: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
a2b0: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 set public key
a2c0: 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c file ", keyfile,
a2d0: 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20 20 20 " ",....
a2e0: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 REASON(), (cha
a2f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
a300: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
a310: 0a 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 ...return (SSL_C
a320: 54 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 TX *)0;.. }..
a330: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
a340: 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c ree(&ds);...} el
a350: 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 se if (key != NU
a360: 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 LL) {.. if (S
a370: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 SL_CTX_use_Priva
a380: 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 teKey_ASN1(EVP_P
a390: 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 KEY_RSA, ctx, ke
a3a0: 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 y,key_len) <= 0)
a3b0: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 {...Tcl_DString
a3c0: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 Free(&ds);.../*
a3d0: 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 flush the passph
a3e0: 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 rase which might
a3f0: 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 be left in the
a400: 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f result */...Tcl_
a410: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
a420: 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 , NULL, TCL_STAT
a430: 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e IC);...Tcl_Appen
a440: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
a450: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 "unable to set p
a460: 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 ublic key: ", RE
a470: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
a480: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
a490: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
a4a0: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
a4b0: 29 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f )0;.. }..}../
a4c0: 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 * Now we know th
a4d0: 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 at a key and cer
a4e0: 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 t have been set
a4f0: 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 against.. * the
a500: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 SSL context */..
a510: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 if (!SSL_CTX_che
a520: 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 ck_private_key(c
a530: 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f tx)) {.. Tcl_
a540: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
a550: 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 erp, "private ke
a560: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 y does not match
a570: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
a580: 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 public key",...
a590: 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e . (char *) N
a5a0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
a5b0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
a5c0: 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 return (SSL_C
a5d0: 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 7d TX *)0;..}. }
a5e0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 76 65 72 .. /* Set ver
a5f0: 69 66 69 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f ification CAs */
a600: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
a610: 49 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20 54 Init(&ds);. T
a620: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
a630: 64 73 31 29 3b 0a 20 20 20 20 69 66 20 28 21 53 ds1);. if (!S
a640: 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 SL_CTX_load_veri
a650: 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 fy_locations(ctx
a660: 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 , F2N(CAfile, &d
a670: 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 26 s), F2N(CAdir, &
a680: 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 ds1)) ||..!SSL_C
a690: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 TX_set_default_v
a6a0: 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 erify_paths(ctx)
a6b0: 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 ) {.#if 0..Tcl_D
a6c0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
a6d0: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
a6e0: 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e e(&ds1);../* Don
a6f0: 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 't currently car
a700: 65 20 69 66 20 74 68 69 73 20 66 61 69 6c 73 20 e if this fails
a710: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 */..Tcl_AppendRe
a720: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 sult(interp, "SS
a730: 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69 66 79 L default verify
a740: 20 70 61 74 68 73 3a 20 22 2c 20 52 45 41 53 4f paths: ", REASO
a750: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
a760: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 LL);..SSL_CTX_fr
a770: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e ee(ctx);..return
a780: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 23 (SSL_CTX *)0;.#
a790: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 endif. }..
a7a0: 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 /* https://sour
a7b0: 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c ceforge.net/p/tl
a7c0: 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 s/bugs/57/ */.
a7d0: 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c /* XXX:TODO: L
a7e0: 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70 70 et the user supp
a7f0: 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 69 ly values here i
a800: 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 nstead of someth
a810: 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 20 ing that exists
a820: 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 on the filesyste
a830: 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 66 m */. if (CAf
a840: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile != NULL) {..
a850: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 STACK_OF(X509_NA
a860: 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d ME) *certNames =
a870: 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 SSL_load_client
a880: 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 _CA_file(F2N(CAf
a890: 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 20 ile, &ds));..if
a8a0: 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 (certNames != NU
a8b0: 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 LL) {.. SSL_C
a8c0: 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 TX_set_client_CA
a8d0: 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e _list(ctx, certN
a8e0: 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a ames);..}. }.
a8f0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
a900: 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 54 Free(&ds);. T
a910: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
a920: 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ds1);. return
a930: 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d ctx;.}.../*. *-
a940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a980: 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f --. *. * StatusO
a990: 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 bjCmd -- return
a9a0: 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 certificate for
a9b0: 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a connected peer..
a9c0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
a9d0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
a9e0: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
a9f0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
aa00: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
aa10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aa20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aa30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aa40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
aa50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 */.static int.St
aa60: 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e atusObjCmd(Clien
aa70: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
aa80: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
aa90: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
aaa0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
aab0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 bjv[]) {. Sta
aac0: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 te *statePtr;.
aad0: 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 X509 *peer;.
aae0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
aaf0: 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e r;. Tcl_Chann
ab00: 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 el chan;. cha
ab10: 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 r *channelName,
ab20: 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e *ciphers;. in
ab30: 74 20 6d 6f 64 65 3b 0a 23 69 66 6e 64 65 66 20 t mode;.#ifndef
ab40: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 45 58 OPENSSL_NO_TLSEX
ab50: 54 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 T. const unsi
ab60: 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f gned char *proto
ab70: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 ;. unsigned i
ab80: 6e 74 20 6c 65 6e 3b 0a 23 65 6e 64 69 66 0a 0a nt len;.#endif..
ab90: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
aba0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 77 69 74 led");.. swit
abb0: 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73 ch (objc) {..cas
abc0: 65 20 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65 e 2:.. channe
abd0: 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 lName = Tcl_GetS
abe0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
abf0: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 v[1], NULL);..
ac00: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 break;...case
ac10: 33 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 72 3:.. if (!str
ac20: 63 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 69 cmp (Tcl_GetStri
ac30: 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d ng (objv[1]), "-
ac40: 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 61 local")) {...cha
ac50: 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 nnelName = Tcl_G
ac60: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
ac70: 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a objv[2], NULL);.
ac80: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a ..break;.. }.
ac90: 09 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c . /* else fal
aca0: 6c 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20 2a 2f l-through ... */
acb0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 .#if defined(__G
acc0: 4e 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 74 NUC__).. __at
acd0: 74 72 69 62 75 74 65 5f 5f 28 28 66 61 6c 6c 74 tribute__((fallt
ace0: 68 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64 69 66 hrough));.#endif
acf0: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 ..default:..
ad00: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
ad10: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
ad20: 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e , "?-local? chan
ad30: 6e 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74 75 nel");.. retu
ad40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
ad50: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
ad60: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
ad70: 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 nterp, channelNa
ad80: 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 me, &mode);.
ad90: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
ada0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
adb0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
adc0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f ROR;. }. /
add0: 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 *. * Make su
ade0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
adf0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
ae00: 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20 nnel. */.
ae10: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
ae20: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
ae30: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
ae40: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
ae50: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
ae60: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
ae70: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
ae80: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
ae90: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
aea0: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
aeb0: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 .."\": not a TLS
aec0: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 channel", NULL)
aed0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
aee0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 ROR;. }. s
aef0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
af00: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e *) Tcl_GetChann
af10: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 elInstanceData(c
af20: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 han);. if (ob
af30: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 jc == 2) {..peer
af40: 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f = SSL_get_peer_
af50: 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 certificate(stat
af60: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
af70: 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d } else {..peer =
af80: 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 SSL_get_certifi
af90: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 cate(statePtr->s
afa0: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 sl);. }. i
afb0: 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 f (peer) {..objP
afc0: 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 tr = Tls_NewX509
afd0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 Obj(interp, peer
afe0: 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 );..if (objc ==
aff0: 32 29 20 7b 20 58 35 30 39 5f 66 72 65 65 28 70 2) { X509_free(p
b000: 65 65 72 29 3b 20 7d 0a 20 20 20 20 7d 20 65 6c eer); }. } el
b010: 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 se {..objPtr = T
b020: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
b030: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 NULL);. }..
b040: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
b050: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
b060: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
b070: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 62 NewStringObj("sb
b080: 69 74 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 its", -1));.
b090: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
b0a0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
b0b0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
b0c0: 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 IntObj(SSL_get_c
b0d0: 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 ipher_bits(state
b0e0: 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 Ptr->ssl, NULL))
b0f0: 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 );.. ciphers
b100: 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 = (char*)SSL_get
b110: 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 _cipher(statePtr
b120: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 ->ssl);. if (
b130: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c (ciphers != NULL
b140: 29 20 26 26 20 28 73 74 72 63 6d 70 28 63 69 70 ) && (strcmp(cip
b150: 68 65 72 73 2c 20 22 28 4e 4f 4e 45 29 22 29 20 hers, "(NONE)")
b160: 21 3d 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 != 0)) {..Tcl_Li
b170: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
b180: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
b190: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
b1a0: 4f 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 Obj("cipher", -1
b1b0: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
b1c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
b1d0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
b1e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 l_NewStringObj(S
b1f0: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 SL_get_cipher(st
b200: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 atePtr->ssl), -1
b210: 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 ));. }..#ifnd
b220: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ef OPENSSL_NO_TL
b230: 53 45 58 54 0a 20 20 20 20 2f 2a 20 52 65 70 6f SEXT. /* Repo
b240: 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 rt the selected
b250: 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 protocol as a re
b260: 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f sult of the nego
b270: 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 tiation */. S
b280: 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c SL_get0_alpn_sel
b290: 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e ected(statePtr->
b2a0: 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 ssl, &proto, &le
b2b0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 n);. Tcl_List
b2c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
b2d0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
b2e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
b2f0: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a j("alpn", -1));.
b300: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
b310: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
b320: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
b330: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 _NewStringObj((c
b340: 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e har *)proto, (in
b350: 74 29 6c 65 6e 29 29 3b 0a 23 65 6e 64 69 66 0a t)len));.#endif.
b360: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
b370: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
b380: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
b390: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 _NewStringObj("v
b3a0: 65 72 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 ersion", -1));.
b3b0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
b3c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
b3d0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
b3e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c NewStringObj(SSL
b3f0: 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 _get_version(sta
b400: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 tePtr->ssl), -1)
b410: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f );.. Tcl_SetO
b420: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
b430: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
b440: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
b450: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
b460: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a tData;.}.../*. *
b470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b4b0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 ---. *. * Connec
b4c0: 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d tionInfoObjCmd -
b4d0: 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 - return connect
b4e0: 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 ion info from Op
b4f0: 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 enSSL.. *. * Res
b500: 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 ults:. *.A list
b510: 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e of connection in
b520: 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d fo. *. *-------
b530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
b570: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e ..static int Con
b580: 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d nectionInfoObjCm
b590: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
b5a0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
b5b0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
b5c0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
b5d0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
b5e0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
b5f0: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 chan;../* The ch
b600: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
b610: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 ode on. */. S
b620: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 tate *statePtr;.
b630: 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 ./* client state
b640: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 for ssl socket
b650: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a */. Tcl_Obj *
b660: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 objPtr;. cons
b670: 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 t SSL *ssl;.
b680: 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 const SSL_CIPHER
b690: 20 2a 63 69 70 68 65 72 3b 0a 0a 23 69 66 20 21 *cipher;..#if !
b6a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
b6b0: 4e 4f 5f 54 4c 53 45 58 54 29 20 26 26 20 4f 50 NO_TLSEXT) && OP
b6c0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
b6d0: 4d 42 45 52 20 3e 3d 20 30 78 31 30 30 30 32 30 MBER >= 0x100020
b6e0: 30 30 4c 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 00L. const un
b6f0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f signed char *pro
b700: 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 to;. unsigned
b710: 20 69 6e 74 20 6c 65 6e 3b 0a 23 65 6e 64 69 66 int len;.#endif
b720: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 .#if defined(HAV
b730: 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f E_SSL_COMPRESSIO
b740: 4e 29 20 26 26 20 4f 50 45 4e 53 53 4c 5f 56 45 N) && OPENSSL_VE
b750: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 RSION_NUMBER >=
b760: 30 78 31 30 30 30 32 30 30 30 4c 0a 20 20 20 20 0x10002000L.
b770: 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f const COMP_METHO
b780: 44 20 2a 63 6f 6d 70 3b 0a 23 65 6e 64 69 66 0a D *comp;.#endif.
b790: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
b7a0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
b7b0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
b7c0: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
b7d0: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c l");..return(TCL
b7e0: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a _ERROR);. }..
b7f0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
b800: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
b810: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 , Tcl_GetStringF
b820: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 romObj(objv[1],
b830: 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 NULL), NULL);.
b840: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 if (chan == (T
b850: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
b860: 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f ) {..return(TCL_
b870: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 ERROR);. }..
b880: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b /*. * Mak
b890: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
b8a0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
b8b0: 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f channel. */
b8c0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
b8d0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
b8e0: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c an);. if (Tcl
b8f0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
b900: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
b910: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
b920: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
b930: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
b940: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
b950: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
b960: 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 n), "\": not a T
b970: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
b980: 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f L);..return(TCL_
b990: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 ERROR);. }..
b9a0: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
b9b0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
b9c0: 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 LL);.. /* Get
b9d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 connection stat
b9e0: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 e */. statePt
b9f0: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c r = (State *)Tcl
ba00: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
ba10: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 nceData(chan);.
ba20: 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 ssl = statePt
ba30: 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 54 63 6c 5f r->ssl;. Tcl_
ba40: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
ba50: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
ba60: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
ba70: 6e 67 4f 62 6a 28 22 73 74 61 74 65 22 2c 20 2d ngObj("state", -
ba80: 31 29 29 3b 0a 20 20 20 20 69 66 20 28 53 53 4c 1));. if (SSL
ba90: 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 _is_init_finishe
baa0: 64 28 73 73 6c 29 29 20 7b 0a 09 54 63 6c 5f 4c d(ssl)) {..Tcl_L
bab0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
bac0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
bad0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
bae0: 67 4f 62 6a 28 22 65 73 74 61 62 6c 69 73 68 65 gObj("establishe
baf0: 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 d", -1));. }
bb00: 65 6c 73 65 20 69 66 20 28 53 53 4c 5f 69 6e 5f else if (SSL_in_
bb10: 69 6e 69 74 28 73 73 6c 29 29 20 7b 0a 09 54 63 init(ssl)) {..Tc
bb20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
bb30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
bb40: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
bb50: 72 69 6e 67 4f 62 6a 28 22 68 61 6e 64 73 68 61 ringObj("handsha
bb60: 6b 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d ke", -1));. }
bb70: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 else {..Tcl_Lis
bb80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
bb90: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
bba0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
bbb0: 62 6a 28 22 69 6e 69 74 69 61 6c 69 7a 69 6e 67 bj("initializing
bbc0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a ", -1));. }..
bbd0: 20 20 20 20 2f 2a 20 47 65 74 20 73 65 72 76 65 /* Get serve
bbe0: 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 63 r name */. Tc
bbf0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
bc00: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
bc10: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
bc20: 72 69 6e 67 4f 62 6a 28 22 73 65 72 76 65 72 6e ringObj("servern
bc30: 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ame", -1));.
bc40: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
bc50: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
bc60: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
bc70: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 StringObj(SSL_ge
bc80: 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c t_servername(ssl
bc90: 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 , TLSEXT_NAMETYP
bca0: 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 E_host_name), -1
bcb0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 ));.. /* Get
bcc0: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 protocol */.
bcd0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
bce0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
bcf0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
bd00: 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f StringObj("proto
bd10: 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 col", -1));.
bd20: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
bd30: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
bd40: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
bd50: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 StringObj(SSL_ge
bd60: 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 t_version(ssl),
bd70: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 -1));.. /* Ge
bd80: 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c t security level
bd90: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 */. Tcl_List
bda0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
bdb0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
bdc0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
bdd0: 6a 28 22 73 65 63 75 72 69 74 79 6c 65 76 65 6c j("securitylevel
bde0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
bdf0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
be00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
be10: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 jPtr, Tcl_NewInt
be20: 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 63 75 Obj(SSL_get_secu
be30: 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 rity_level(ssl))
be40: 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 );.. /* Get c
be50: 69 70 68 65 72 20 2a 2f 0a 20 20 20 20 63 69 70 ipher */. cip
be60: 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 her = SSL_get_cu
be70: 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c rrent_cipher(ssl
be80: 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 );. if (ciphe
be90: 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 r != NULL) {..ch
bea0: 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d ar buf[BUFSIZ] =
beb0: 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c {0};..int bits,
bec0: 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 54 63 6c alg_bits;...Tcl
bed0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
bee0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
bef0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
bf00: 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22 2c ingObj("cipher",
bf10: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
bf20: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
bf30: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
bf40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
bf50: 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 j(SSL_CIPHER_get
bf60: 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d _name(cipher), -
bf70: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
bf80: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
bf90: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
bfa0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
bfb0: 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c "standard_name",
bfc0: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
bfd0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
bfe0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
bff0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
c000: 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 j(SSL_CIPHER_sta
c010: 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 ndard_name(ciphe
c020: 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 62 69 74 73 r), -1));...bits
c030: 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 = SSL_CIPHER_ge
c040: 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 t_bits(cipher, &
c050: 61 6c 67 5f 62 69 74 73 29 3b 0a 09 54 63 6c 5f alg_bits);..Tcl_
c060: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
c070: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
c080: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
c090: 6e 67 4f 62 6a 28 22 62 69 74 73 22 2c 20 2d 31 ngObj("bits", -1
c0a0: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
c0b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
c0c0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
c0d0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 62 69 74 73 l_NewIntObj(bits
c0e0: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
c0f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
c100: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
c110: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
c120: 73 65 63 72 65 74 5f 62 69 74 73 22 2c 20 2d 31 secret_bits", -1
c130: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
c140: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
c150: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
c160: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6c 67 5f l_NewIntObj(alg_
c170: 62 69 74 73 29 29 3b 0a 09 2f 2a 20 61 6c 67 5f bits));../* alg_
c180: 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b bits is actual k
c190: 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 ey secret bits.
c1a0: 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 If use bits and
c1b0: 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 secret (algorith
c1c0: 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a m) bits differ,.
c1d0: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 the r
c1e0: 65 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 est of the bits
c1f0: 61 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 are fixed, i.e.
c200: 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f for limited expo
c210: 72 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73 rt ciphers (bits
c220: 20 3c 20 35 36 29 20 2a 2f 0a 09 54 63 6c 5f 4c < 56) */..Tcl_L
c230: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
c240: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
c250: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
c260: 67 4f 62 6a 28 22 6d 69 6e 5f 76 65 72 73 69 6f gObj("min_versio
c270: 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c n", -1));..Tcl_L
c280: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
c290: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
c2a0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
c2b0: 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f gObj(SSL_CIPHER_
c2c0: 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 get_version(ciph
c2d0: 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 69 66 20 er), -1));...if
c2e0: 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 (SSL_CIPHER_desc
c2f0: 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 ription(cipher,
c300: 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 buf, sizeof(buf)
c310: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 ) != NULL) {..
c320: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
c330: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
c340: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
c350: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 64 65 73 ewStringObj("des
c360: 63 72 69 70 74 69 6f 6e 22 2c 20 2d 31 29 29 3b cription", -1));
c370: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
c380: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
c390: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
c3a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
c3b0: 62 75 66 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 buf, -1));..}.
c3c0: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 }.. Tcl_Lis
c3d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
c3e0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
c3f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
c400: 62 6a 28 22 72 65 6e 65 67 6f 74 69 61 74 69 6f bj("renegotiatio
c410: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 n", -1));. Tc
c420: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
c430: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
c440: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
c450: 72 69 6e 67 4f 62 6a 28 0a 09 53 53 4c 5f 67 65 ringObj(..SSL_ge
c460: 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 t_secure_renegot
c470: 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 iation_support(s
c480: 73 6c 29 20 3f 20 22 61 6c 6c 6f 77 65 64 22 20 sl) ? "allowed"
c490: 3a 20 22 64 69 73 61 6c 6c 6f 77 65 64 22 2c 20 : "disallowed",
c4a0: 2d 31 29 29 3b 0a 0a 23 69 66 20 21 64 65 66 69 -1));..#if !defi
c4b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
c4c0: 4c 53 45 58 54 29 20 26 26 20 4f 50 45 4e 53 53 LSEXT) && OPENSS
c4d0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
c4e0: 20 3e 3d 20 30 78 31 30 30 30 32 30 30 30 4c 0a >= 0x10002000L.
c4f0: 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 /* Report th
c500: 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
c510: 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
c520: 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 of the negotiati
c530: 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 on */. SSL_ge
c540: 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 t0_alpn_selected
c550: 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c (ssl, &proto, &l
c560: 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 en);. Tcl_Lis
c570: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
c580: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
c590: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
c5a0: 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b bj("alpn", -1));
c5b0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
c5c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
c5d0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
c5e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 l_NewStringObj((
c5f0: 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 char *)proto, (i
c600: 6e 74 29 6c 65 6e 29 29 3b 0a 23 65 6e 64 69 66 nt)len));.#endif
c610: 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e .. /* Session
c620: 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 54 63 6c info */. Tcl
c630: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
c640: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
c650: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
c660: 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f ingObj("session_
c670: 72 65 75 73 65 64 22 2c 20 2d 31 29 29 3b 0a 20 reused", -1));.
c680: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
c690: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
c6a0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
c6b0: 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 73 65 NewIntObj(SSL_se
c6c0: 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c ssion_reused(ssl
c6d0: 29 29 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 )));..#if define
c6e0: 64 28 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 d(HAVE_SSL_COMPR
c6f0: 45 53 53 49 4f 4e 29 20 26 26 20 4f 50 45 4e 53 ESSION) && OPENS
c700: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
c710: 52 20 3e 3d 20 30 78 31 30 30 30 32 30 30 30 4c R >= 0x10002000L
c720: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 . /* Compress
c730: 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ion info */.
c740: 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 comp = SSL_get_c
c750: 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 urrent_compressi
c760: 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 on(ssl);. if
c770: 28 63 6f 6d 70 20 21 3d 20 4e 55 4c 4c 29 20 7b (comp != NULL) {
c780: 0a 09 65 78 70 61 6e 73 69 6f 6e 20 3d 20 53 53 ..expansion = SS
c790: 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 L_get_current_ex
c7a0: 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 54 pansion(ssl);..T
c7b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
c7c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
c7d0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
c7e0: 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 tringObj("compre
c7f0: 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 ssion", -1));..T
c800: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
c810: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
c820: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
c830: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 4f 4d tringObj(SSL_COM
c840: 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 P_get_name(comp)
c850: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
c860: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
c870: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
c880: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
c890: 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 bj("expansion",
c8a0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
c8b0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
c8c0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
c8d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
c8e0: 28 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 (SSL_COMP_get_na
c8f0: 6d 65 28 65 78 70 61 6e 73 69 6f 6e 29 2c 20 2d me(expansion), -
c900: 31 29 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 1));. }.#endi
c910: 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 f.. Tcl_SetOb
c920: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
c930: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
c940: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
c950: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
c960: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
c970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c9b0: 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e --. *. * Version
c9c0: 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
c9d0: 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 version string
c9e0: 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a from OpenSSL.. *
c9f0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
ca00: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
ca10: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
ca20: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
ca30: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
ca40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
ca80: 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 .static int.Vers
ca90: 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 ionObjCmd(Client
caa0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
cab0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
cac0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
cad0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
cae0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
caf0: 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 Obj *objPtr;..
cb00: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
cb10: 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 d");.. objPtr
cb20: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 = Tcl_NewString
cb30: 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 Obj(OPENSSL_VERS
cb40: 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 ION_TEXT, -1);.
cb50: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
cb60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
cb70: 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e tr);.. return
cb80: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
cb90: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
cba0: 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b a;..objc = objc;
cbb0: 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d ..objv = objv;.}
cbc0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
cbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
cc10: 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 * MiscObjCmd --
cc20: 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a misc commands. *
cc30: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
cc40: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
cc50: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
cc60: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
cc70: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
cc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ccb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
ccc0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 .static int.Misc
ccd0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
cce0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
ccf0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
cd00: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
cd10: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
cd20: 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 ]) {. static
cd30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d const char *comm
cd40: 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 ands [] = { "req
cd50: 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c ", "strreq", NUL
cd60: 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f L };. enum co
cd70: 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 mmand { C_REQ, C
cd80: 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 _STRREQ, C_DUMMY
cd90: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c };. int cmd,
cda0: 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 isStr;. char
cdb0: 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a buffer[16384];.
cdc0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
cdd0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
cde0: 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 (objc < 2) {..Tc
cdf0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
ce00: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
ce10: 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 "subcommand ?arg
ce20: 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 s?");..return TC
ce30: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
ce40: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
ce50: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
ce60: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d p, objv[1], comm
ce70: 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c ands, "command",
ce80: 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 0,&cmd) != TCL_
ce90: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
cea0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
ceb0: 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 isStr = (cmd
cec0: 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 == C_STRREQ);.
ced0: 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d switch ((enum
cee0: 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b command) cmd) {
cef0: 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 ..case C_REQ:..c
cf00: 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a ase C_STRREQ: {.
cf10: 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 . EVP_PKEY *p
cf20: 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 key=NULL;.. X
cf30: 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 509 *cert=NULL;.
cf40: 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a . X509_NAME *
cf50: 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 name=NULL;..
cf60: 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b Tcl_Obj **listv;
cf70: 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 74 63 2c .. int listc,
cf80: 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 i;... BIO *ou
cf90: 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 t=NULL;... ch
cfa0: 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 ar *k_C="",*k_ST
cfb0: 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f ="",*k_L="",*k_O
cfc0: 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f ="",*k_OU="",*k_
cfd0: 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 CN="",*k_Email="
cfe0: 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 ";.. char *ke
cff0: 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 yout,*pemout,*st
d000: 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 r;.. int keys
d010: 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 ize,serial=0,day
d020: 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e s=365;..#if OPEN
d030: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
d040: 45 52 20 3c 3d 20 30 78 31 30 31 30 30 30 30 30 ER <= 0x10100000
d050: 4c 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 L.. RSA *rsa
d060: 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 69 66 20 4f 50 = NULL;.#elif OP
d070: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
d080: 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
d090: 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 0L.. BIGNUM *
d0a0: 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 bne = NULL;..
d0b0: 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c RSA *rsa = NULL
d0c0: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 ;.#else.. EVP
d0d0: 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d _PKEY_CTX *ctx =
d0e0: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 NULL;.#endif...
d0f0: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 if ((objc<5)
d100: 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a || (objc>6)) {.
d110: 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
d120: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 gs(interp, 2, ob
d130: 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 jv, "keysize key
d140: 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 file certfile ?i
d150: 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e nfo?");...return
d160: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 TCL_ERROR;..
d170: 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c }... if (Tcl
d180: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 _GetIntFromObj(i
d190: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 nterp, objv[2],
d1a0: 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c &keysize) != TCL
d1b0: 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 _OK) {...return
d1c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
d1d0: 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 }.. keyout=Tc
d1e0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
d1f0: 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 [3]);.. pemou
d200: 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 t=Tcl_GetString(
d210: 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 objv[4]);.. i
d220: 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 f (isStr) {...Tc
d230: 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
d240: 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 keyout,"",0);...
d250: 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 Tcl_SetVar(inter
d260: 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a p,pemout,"",0);.
d270: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
d280: 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 (objc>=6) {...if
d290: 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 (Tcl_ListObjGet
d2a0: 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c Elements(interp,
d2b0: 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 6c 69 objv[5],....&li
d2c0: 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 stc, &listv) !=
d2d0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 TCL_OK) {...
d2e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
d2f0: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 ;...}....if ((li
d300: 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 stc%2) != 0) {..
d310: 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
d320: 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 lt(interp,"Infor
d330: 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 mation list must
d340: 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 have even numbe
d350: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c r of arguments",
d360: 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 NULL);... ret
d370: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
d380: 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 .}...for (i=0; i
d390: 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a <listc; i+=2) {.
d3a0: 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 .. str=Tcl_Ge
d3b0: 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d tString(listv[i]
d3c0: 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 );... if (str
d3d0: 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d cmp(str,"days")=
d3e0: 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c =0) {....if (Tcl
d3f0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 _GetIntFromObj(i
d400: 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d nterp,listv[i+1]
d410: 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 ,&days)!=TCL_OK)
d420: 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 .... return T
d430: 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 CL_ERROR;...
d440: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
d450: 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d p(str,"serial")=
d460: 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c =0) {....if (Tcl
d470: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 _GetIntFromObj(i
d480: 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d nterp,listv[i+1]
d490: 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f ,&serial)!=TCL_O
d4a0: 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e K).... return
d4b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 TCL_ERROR;...
d4c0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
d4d0: 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 cmp(str,"C")==0)
d4e0: 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 {....k_C=Tcl_Ge
d4f0: 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
d500: 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
d510: 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
d520: 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 ,"ST")==0) {....
d530: 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 k_ST=Tcl_GetStri
d540: 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
d550: 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
d560: 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 (strcmp(str,"L")
d570: 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 ==0) {....k_L=Tc
d580: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
d590: 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
d5a0: 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
d5b0: 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a (str,"O")==0) {.
d5c0: 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 ...k_O=Tcl_GetSt
d5d0: 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
d5e0: 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
d5f0: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f f (strcmp(str,"O
d600: 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f U")==0) {....k_O
d610: 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 U=Tcl_GetString(
d620: 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
d630: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
d640: 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d rcmp(str,"CN")==
d650: 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 0) {....k_CN=Tcl
d660: 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
d670: 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
d680: 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
d690: 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 str,"Email")==0)
d6a0: 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 {....k_Email=Tc
d6b0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
d6c0: 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
d6d0: 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 else {....Tcl_S
d6e0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
d6f0: 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 "Unknown paramet
d700: 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 er",NULL);....re
d710: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
d720: 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 .. }...}..
d730: 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f }..#if OPENSSL_
d740: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
d750: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 0a 09 20 = 0x10100000L..
d760: 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b pkey = EVP_PK
d770: 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 EY_new();.. r
d780: 73 61 20 3d 20 52 53 41 5f 67 65 6e 65 72 61 74 sa = RSA_generat
d790: 65 5f 6b 65 79 28 6b 65 79 73 69 7a 65 2c 20 30 e_key(keysize, 0
d7a0: 78 31 30 30 30 31 2c 20 4e 55 4c 4c 2c 20 4e 55 x10001, NULL, NU
d7b0: 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b LL);.. if (pk
d7c0: 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 ey == NULL || rs
d7d0: 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 a == NULL || !EV
d7e0: 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 P_PKEY_assign_RS
d7f0: 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a A(pkey, rsa)) {.
d800: 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 ..EVP_PKEY_free(
d810: 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f pkey);.../* RSA_
d820: 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 free(rsa); freed
d830: 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 by EVP_PKEY_fre
d840: 65 20 2a 2f 0a 23 65 6c 69 66 20 4f 50 45 4e 53 e */.#elif OPENS
d850: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
d860: 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
d870: 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 . bne = BN_ne
d880: 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 w();.. rsa =
d890: 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 RSA_new();..
d8a0: 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f pkey = EVP_PKEY_
d8b0: 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 new();.. if (
d8c0: 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 bne == NULL || r
d8d0: 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b sa == NULL || pk
d8e0: 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 ey == NULL || !B
d8f0: 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 N_set_word(bne,R
d900: 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 SA_F4) ||...!RSA
d910: 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 _generate_key_ex
d920: 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 (rsa, keysize, b
d930: 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 ne, NULL) || !EV
d940: 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 P_PKEY_assign_RS
d950: 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a A(pkey, rsa)) {.
d960: 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 ..EVP_PKEY_free(
d970: 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f pkey);.../* RSA_
d980: 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 free(rsa); freed
d990: 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 by EVP_PKEY_fre
d9a0: 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 e */...BN_free(b
d9b0: 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ne);.#else..
d9c0: 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 pkey = EVP_RSA_g
d9d0: 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 en((unsigned int
d9e0: 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 ) keysize);..
d9f0: 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f ctx = EVP_PKEY_
da00: 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c CTX_new(pkey,NUL
da10: 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 L);.. if (pke
da20: 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 y == NULL || ctx
da30: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 == NULL || !EVP
da40: 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 _PKEY_keygen_ini
da50: 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 t(ctx) ||...!EVP
da60: 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 _PKEY_CTX_set_rs
da70: 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 a_keygen_bits(ct
da80: 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 x, keysize) || !
da90: 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 EVP_PKEY_keygen(
daa0: 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 ctx, &pkey)) {..
dab0: 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 .EVP_PKEY_free(p
dac0: 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 key);...EVP_PKEY
dad0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
dae0: 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 #endif...Tcl_Set
daf0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 Result(interp,"E
db00: 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 rror generating
db10: 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c private key",NUL
db20: 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c L);...return TCL
db30: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 _ERROR;.. } e
db40: 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 lse {...if (isSt
db50: 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 r) {... out=B
db60: 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d IO_new(BIO_s_mem
db70: 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ());... PEM_w
db80: 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 rite_bio_Private
db90: 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c Key(out,pkey,NUL
dba0: 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 L,NULL,0,NULL,NU
dbb0: 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f LL);... i=BIO
dbc0: 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 _read(out,buffer
dbd0: 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d ,sizeof(buffer)-
dbe0: 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 1);... i=(i<0
dbf0: 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 ) ? 0 : i;...
dc00: 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b buffer[i]='\0';
dc10: 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 ... Tcl_SetVa
dc20: 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c r(interp,keyout,
dc30: 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 buffer,0);...
dc40: 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b BIO_flush(out);
dc50: 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 ... BIO_free(
dc60: 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b out);...} else {
dc70: 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e ... out=BIO_n
dc80: 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 ew(BIO_s_file())
dc90: 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 ;... BIO_writ
dca0: 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b e_filename(out,k
dcb0: 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 eyout);... PE
dcc0: 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 M_write_bio_Priv
dcd0: 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c ateKey(out,pkey,
dce0: 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c NULL,NULL,0,NULL
dcf0: 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a ,NULL);... /*
dd00: 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 PEM_write_bio_R
dd10: 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 SAPrivateKey(out
dd20: 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c , rsa, NULL, NUL
dd30: 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c L, 0, NULL, NULL
dd40: 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f ); */... BIO_
dd50: 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 free_all(out);..
dd60: 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 .}....if ((cert
dd70: 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 =X509_new())==NU
dd80: 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f LL) {... Tcl_
dd90: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
dda0: 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 ,"Error generati
ddb0: 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 ng certificate r
ddc0: 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 equest",NULL);..
ddd0: 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 . EVP_PKEY_fr
dde0: 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 ee(pkey);.#if OP
ddf0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
de00: 4d 42 45 52 20 3e 20 30 78 31 30 31 30 30 30 30 MBER > 0x1010000
de10: 30 4c 20 26 26 20 4f 50 45 4e 53 53 4c 5f 56 45 0L && OPENSSL_VE
de20: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
de30: 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 x30000000L...
de40: 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 BN_free(bne);.#
de50: 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 endif... retu
de60: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 rn(TCL_ERROR);..
de70: 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 .}....X509_set_v
de80: 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a ersion(cert,2);.
de90: 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 ..ASN1_INTEGER_s
dea0: 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 et(X509_get_seri
deb0: 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 alNumber(cert),s
dec0: 65 72 69 61 6c 29 3b 0a 23 69 66 20 4f 50 45 4e erial);.#if OPEN
ded0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
dee0: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c ER < 0x10100000L
def0: 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 ...X509_gmtime_a
df00: 64 6a 28 58 35 30 39 5f 67 65 74 5f 6e 6f 74 42 dj(X509_get_notB
df10: 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a efore(cert),0);.
df20: 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 ..X509_gmtime_ad
df30: 6a 28 58 35 30 39 5f 67 65 74 5f 6e 6f 74 41 66 j(X509_get_notAf
df40: 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 ter(cert),(long)
df50: 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 60*60*24*days);.
df60: 23 65 6c 73 65 0a 09 09 58 35 30 39 5f 67 6d 74 #else...X509_gmt
df70: 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 ime_adj(X509_get
df80: 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 m_notBefore(cert
df90: 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 ),0);...X509_gmt
dfa0: 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 ime_adj(X509_get
dfb0: 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 m_notAfter(cert)
dfc0: 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a ,(long)60*60*24*
dfd0: 64 61 79 73 29 3b 0a 23 65 6e 64 69 66 0a 09 09 days);.#endif...
dfe0: 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 X509_set_pubkey(
dff0: 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e cert,pkey);....n
e000: 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 ame=X509_get_sub
e010: 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b ject_name(cert);
e020: 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ....X509_NAME_ad
e030: 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
e040: 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e ame,"C", MBSTRIN
e050: 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
e060: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
e070: 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a _C, -1, -1, 0);.
e080: 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
e090: 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
e0a0: 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 e,"ST", MBSTRING
e0b0: 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
e0c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
e0d0: 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a ST, -1, -1, 0);.
e0e0: 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
e0f0: 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
e100: 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f e,"L", MBSTRING_
e110: 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
e120: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c gned char *) k_L
e130: 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
e140: 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
e150: 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
e160: 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 "O", MBSTRING_AS
e170: 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
e180: 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 ed char *) k_O,
e190: 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
e1a0: 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
e1b0: 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f y_by_txt(name,"O
e1c0: 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 U", MBSTRING_ASC
e1d0: 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
e1e0: 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 d char *) k_OU,
e1f0: 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
e200: 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
e210: 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 y_by_txt(name,"C
e220: 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 N", MBSTRING_ASC
e230: 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
e240: 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 d char *) k_CN,
e250: 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
e260: 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
e270: 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 y_by_txt(name,"E
e280: 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f mail", MBSTRING_
e290: 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
e2a0: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 gned char *) k_E
e2b0: 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 mail, -1, -1, 0)
e2c0: 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 ;....X509_set_su
e2d0: 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c bject_name(cert,
e2e0: 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 name);....if (!X
e2f0: 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 509_sign(cert,pk
e300: 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 ey,EVP_sha256())
e310: 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 ) {... X509_f
e320: 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 ree(cert);...
e330: 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 EVP_PKEY_free(p
e340: 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 key);.#if OPENSS
e350: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
e360: 20 3e 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 > 0x10100000L &
e370: 26 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f & OPENSSL_VERSIO
e380: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
e390: 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 00000L... BN_
e3a0: 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 free(bne);.#endi
e3b0: 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 f... Tcl_SetR
e3c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 esult(interp,"Er
e3d0: 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74 ror signing cert
e3e0: 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a ificate",NULL);.
e3f0: 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
e400: 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 _ERROR;...}....i
e410: 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 f (isStr) {...
e420: 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
e430: 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 O_s_mem());...
e440: 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
e450: 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a X509(out,cert);.
e460: 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 .. i=BIO_read
e470: 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 (out,buffer,size
e480: 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 of(buffer)-1);..
e490: 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 . i=(i<0) ? 0
e4a0: 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 : i;... buff
e4b0: 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 er[i]='\0';...
e4c0: 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 Tcl_SetVar(int
e4d0: 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 erp,pemout,buffe
e4e0: 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f r,0);... BIO_
e4f0: 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 flush(out);...
e500: 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b BIO_free(out);
e510: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 ...} else {...
e520: 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
e530: 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 O_s_file());...
e540: 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c BIO_write_fil
e550: 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 ename(out,pemout
e560: 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 );... PEM_wri
e570: 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c te_bio_X509(out,
e580: 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f cert);... BIO
e590: 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a _free_all(out);.
e5a0: 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 ..}....X509_free
e5b0: 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b (cert);...EVP_PK
e5c0: 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 EY_free(pkey);.#
e5d0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
e5e0: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 20 30 78 31 30 ON_NUMBER > 0x10
e5f0: 31 30 30 30 30 30 4c 20 26 26 20 4f 50 45 4e 53 100000L && OPENS
e600: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
e610: 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
e620: 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a ..BN_free(bne);.
e630: 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d #endif.. }..}
e640: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 ..break;. def
e650: 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 ault:..break;.
e660: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }. return T
e670: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
e680: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
e690: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
e6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
e6e0: 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a . * Tls_Free --.
e6f0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
e700: 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 dure cleans up w
e710: 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 hen a SSL socket
e720: 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 based channel.
e730: 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 *.is closed and
e740: 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f its reference co
e750: 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 unt falls below
e760: 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 1. *. * Results:
e770: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.none. *. * S
e780: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
e790: 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 Frees all the st
e7a0: 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ate. *. *-------
e7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
e7f0: 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 .void.Tls_Free(c
e800: 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b har *blockPtr) {
e810: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
e820: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
e830: 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 blockPtr;.. d
e840: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
e850: 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e ;.. Tls_Clean
e860: 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 (statePtr);.
e870: 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 ckfree(blockPtr)
e880: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
e890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e8b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
e8d0: 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d *. * Tls_Clean -
e8e0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
e8f0: 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 cedure cleans up
e900: 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b when a SSL sock
e910: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c et based channel
e920: 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e . *.is closed an
e930: 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 d its reference
e940: 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f count falls belo
e950: 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c w 1. This shoul
e960: 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 d. *.be called s
e970: 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 ynchronously by
e980: 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e the CloseProc, n
e990: 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 ot in the. *.Eve
e9a0: 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c ntuallyFree call
e9b0: 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 back.. *. * Resu
e9c0: 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a lts:. *.none. *.
e9d0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
e9e0: 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 . *.Frees all th
e9f0: 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d e state. *. *---
ea00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ea10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ea20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ea30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ea40: 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c . */.void Tls_Cl
ea50: 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 ean(State *state
ea60: 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e Ptr) {. dprin
ea70: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
ea80: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 /*. * we'
ea90: 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 re assuming here
eaa0: 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 that we're sing
eab0: 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 le-threaded.
eac0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
ead0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 ePtr->timer != (
eae0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 Tcl_TimerToken)
eaf0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c NULL) {..Tcl_Del
eb00: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 eteTimerHandler(
eb10: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 statePtr->timer)
eb20: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d ;..statePtr->tim
eb30: 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d er = NULL;. }
eb40: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
eb50: 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 tr->bio) {../* T
eb60: 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 his will call SS
eb70: 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 L_shutdown. Bug
eb80: 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 1414045 */..dpri
eb90: 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c ntf("BIO_free_al
eba0: 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 l(%p)", statePtr
ebb0: 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 ->bio);..BIO_fre
ebc0: 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e e_all(statePtr->
ebd0: 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d bio);..statePtr-
ebe0: 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 >bio = NULL;.
ebf0: 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
ec00: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 Ptr->ssl) {..dpr
ec10: 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 intf("SSL_free(%
ec20: 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 p)", statePtr->s
ec30: 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 sl);..SSL_free(s
ec40: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 tatePtr->ssl);..
ec50: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 statePtr->ssl =
ec60: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
ec70: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 if (statePtr->ct
ec80: 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 x) {..SSL_CTX_fr
ec90: 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ee(statePtr->ctx
eca0: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 );..statePtr->ct
ecb0: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a x = NULL;. }.
ecc0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
ecd0: 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 ->callback) {..T
ece0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
ecf0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
ed00: 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e ck);..statePtr->
ed10: 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b callback = NULL;
ed20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
ed30: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
ed40: 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 d) {..Tcl_DecrRe
ed50: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
ed60: 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 >password);..sta
ed70: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 tePtr->password
ed80: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 = NULL;. }..
ed90: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
eda0: 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a rning");.}.../*.
edb0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
edc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
edd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ede0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
edf0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
ee00: 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Init --. *. *.Th
ee10: 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 is is a package
ee20: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 initialization p
ee30: 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 rocedure, which
ee40: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 is called. *.by
ee50: 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 Tcl when this pa
ee60: 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 ckage is to be a
ee70: 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 dded to an inter
ee80: 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 preter.. *. * Re
ee90: 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 sults: Ssl conf
eea0: 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 igured and loade
eeb0: 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 d. *. * Side eff
eec0: 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 ects:. *. create
eed0: 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 the ssl command
eee0: 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c , initialize ssl
eef0: 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d context. *. *--
ef00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ef10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ef20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ef30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ef40: 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 -. */.DLLEXPORT
ef50: 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c int Tls_Init(Tcl
ef60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 _Interp *interp)
ef70: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 {. const cha
ef80: 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 r tlsTclInitScri
ef90: 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 pt[] = {.#includ
efa0: 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 e "tls.tcl.h"..0
efb0: 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 x00. };..
efc0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
efd0: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 );.. /*.
efe0: 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 * We only suppor
eff0: 74 20 54 63 6c 20 38 2e 34 20 6f 72 20 6e 65 77 t Tcl 8.4 or new
f000: 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 er. */. i
f010: 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 5f 54 f (.#ifdef USE_T
f020: 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c 5f 49 6e CL_STUBS..Tcl_In
f030: 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 itStubs(interp,
f040: 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c 73 65 0a "8.4", 0).#else.
f050: 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 .Tcl_PkgRequire(
f060: 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 22 interp, "Tcl", "
f070: 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e 64 69 66 8.4-", 0).#endif
f080: 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 .. == NULL) {..r
f090: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
f0a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
f0b0: 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d TlsLibInit(0) !=
f0c0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f TCL_OK) {..Tcl_
f0d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f0e0: 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 erp, "could not
f0f0: 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c initialize SSL l
f100: 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a ibrary", NULL);.
f110: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
f120: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 R;. }.. Tc
f130: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
f140: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
f150: 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 :ciphers", Ciphe
f160: 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e rsObjCmd, (Clien
f170: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
f180: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
f190: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
f1a0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
f1b0: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f interp, "tls::co
f1c0: 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 nnection", Conne
f1d0: 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c ctionInfoObjCmd,
f1e0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
f1f0: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
f200: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
f210: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
f220: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
f230: 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c tls::handshake",
f240: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 HandshakeObjCmd
f250: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
f260: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
f270: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
f280: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
f290: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
f2a0: 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 "tls::import", I
f2b0: 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c mportObjCmd, (Cl
f2c0: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
f2d0: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
f2e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
f2f0: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
f300: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
f310: 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d :unimport", Unim
f320: 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 portObjCmd, (Cli
f330: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
f340: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
f350: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
f360: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
f370: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
f380: 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f status", StatusO
f390: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
f3a0: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
f3b0: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
f3c0: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
f3d0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
f3e0: 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 erp, "tls::versi
f3f0: 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 on", VersionObjC
f400: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
f410: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
f420: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
f430: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
f440: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
f450: 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d , "tls::misc", M
f460: 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 iscObjCmd, (Clie
f470: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
f480: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
f490: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
f4a0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
f4b0: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 (interp, "tls::p
f4c0: 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f rotocols", Proto
f4d0: 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 colsObjCmd, (Cli
f4e0: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
f4f0: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
f500: 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 ) NULL);.. if
f510: 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c (interp) {..Tcl
f520: 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c _Eval(interp, tl
f530: 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 3b sTclInitScript);
f540: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 . }.. retu
f550: 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 rn(Tcl_PkgProvid
f560: 65 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 22 2c e(interp, "tls",
f570: 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e PACKAGE_VERSION
f580: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ));.}../*. *----
f590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f5c0: 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 --*. *. *.Tls_Sa
f5d0: 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 feInit --. *. *.
f5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f610: 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 *. *.Standard pr
f620: 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65 64 ocedure required
f630: 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 by 'load'.. *.I
f640: 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20 nitializes this
f650: 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 extension for a
f660: 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 safe interpreter
f670: 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *.-----------
f680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f6a0: 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 -----*. *. *.Sid
f6b0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 e effects:. *..A
f6c0: 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a s of 'Tls_Init'.
f6d0: 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a *. *.Result:. *
f6e0: 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c ..A standard Tcl
f6f0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a error code.. *.
f700: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
f710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f730: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c --------*. */.DL
f740: 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f LEXPORT int Tls_
f750: 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 SafeInit(Tcl_Int
f760: 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 erp *interp) {.
f770: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
f780: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ed");. return
f790: 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 (Tls_Init(interp
f7a0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ));.}../*. *----
f7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f7e0: 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 --*. *. *.TlsLib
f7f0: 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d Init --. *. *.--
f800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
f830: 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 *.Initializes S
f840: 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 SL library once
f850: 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a per application.
f860: 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.-------------
f870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f890: 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 ---*. *. *.Side
f8a0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 effects:. *..ini
f8b0: 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 tializes SSL lib
f8c0: 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c rary. *. *.Resul
f8d0: 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 t:. *..none. *.
f8e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
f8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f910: 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 -------*. */.sta
f920: 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e tic int TlsLibIn
f930: 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c it(int uninitial
f940: 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69 ize) {. stati
f950: 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 c int initialize
f960: 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 d = 0;. int s
f970: 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a tatus = TCL_OK;.
f980: 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
f990: 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
f9a0: 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
f9b0: 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 ADS). size_t
f9c0: 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 num_locks;.#endi
f9d0: 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69 f.. if (unini
f9e0: 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 20 tialize) {.
f9f0: 20 20 20 69 66 20 28 21 69 6e 69 74 69 61 6c 69 if (!initiali
fa00: 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 zed) {.
fa10: 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 dprintf("Aske
fa20: 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a d to uninitializ
fa30: 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f e, but we are no
fa40: 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b t initialized");
fa50: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 .. re
fa60: 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 turn(TCL_OK);.
fa70: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 }..
fa80: 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 dprintf("Asked
fa90: 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 to uninitialize"
faa0: 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 );..#if defined(
fab0: 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
fac0: 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
fad0: 54 48 52 45 41 44 53 29 0a 20 20 20 20 20 20 20 THREADS).
fae0: 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 Tcl_MutexLock(&
faf0: 69 6e 69 74 5f 6d 78 29 3b 0a 0a 23 69 66 20 4f init_mx);..#if O
fb00: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
fb10: 55 4d 42 45 52 20 3c 20 30 78 31 30 30 30 30 30 UMBER < 0x100000
fb20: 30 30 4c 0a 20 20 20 20 20 20 20 20 43 52 59 50 00L. CRYP
fb30: 54 4f 5f 73 65 74 5f 6c 6f 63 6b 69 6e 67 5f 63 TO_set_locking_c
fb40: 61 6c 6c 62 61 63 6b 28 4e 55 4c 4c 29 3b 0a 20 allback(NULL);.
fb50: 20 20 20 20 20 20 20 43 52 59 50 54 4f 5f 73 65 CRYPTO_se
fb60: 74 5f 69 64 5f 63 61 6c 6c 62 61 63 6b 28 4e 55 t_id_callback(NU
fb70: 4c 4c 29 3b 0a 23 65 6c 69 66 20 4f 50 45 4e 53 LL);.#elif OPENS
fb80: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
fb90: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 0a R < 0x10100000L.
fba0: 20 20 20 20 20 20 20 20 43 52 59 50 54 4f 5f 73 CRYPTO_s
fbb0: 65 74 5f 6c 6f 63 6b 69 6e 67 5f 63 61 6c 6c 62 et_locking_callb
fbc0: 61 63 6b 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 ack(NULL);.
fbd0: 20 20 20 43 52 59 50 54 4f 5f 54 48 52 45 41 44 CRYPTO_THREAD
fbe0: 49 44 5f 73 65 74 5f 63 61 6c 6c 62 61 63 6b 28 ID_set_callback(
fbf0: 4e 55 4c 4c 29 0a 23 65 6e 64 69 66 0a 0a 20 20 NULL).#endif..
fc00: 20 20 20 20 20 20 69 66 20 28 6c 6f 63 6b 73 29 if (locks)
fc10: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 {. f
fc20: 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 ree(locks);.
fc30: 20 20 20 20 20 20 20 20 6c 6f 63 6b 73 20 3d 20 locks =
fc40: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 NULL;.
fc50: 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 locksCount = 0
fc60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 ;. }.#end
fc70: 69 66 0a 20 20 20 20 20 20 20 20 69 6e 69 74 69 if. initi
fc80: 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 alized = 0;..#if
fc90: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
fca0: 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
fcb0: 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
fcc0: 29 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4d 75 ). Tcl_Mu
fcd0: 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f texUnlock(&init_
fce0: 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 mx);.#endif..
fcf0: 20 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f return(TCL_
fd00: 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OK);. }..
fd10: 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 if (initialized)
fd20: 20 7b 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e {. dprin
fd30: 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 tf("Called, but
fd40: 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c using cached val
fd50: 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 ue");. re
fd60: 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 turn(status);.
fd70: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
fd80: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 ("Called");..#if
fd90: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
fda0: 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
fdb0: 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
fdc0: 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c ). Tcl_MutexL
fdd0: 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 ock(&init_mx);.#
fde0: 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 endif. initia
fdf0: 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 lized = 1;..#if
fe00: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
fe10: 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
fe20: 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
fe30: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
fe40: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
fe50: 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 6e 75 10100000L. nu
fe60: 6d 5f 6c 6f 63 6b 73 20 3d 20 43 52 59 50 54 4f m_locks = CRYPTO
fe70: 5f 6e 75 6d 5f 6c 6f 63 6b 73 28 29 3b 0a 23 65 _num_locks();.#e
fe80: 6c 73 65 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b lse. num_lock
fe90: 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 s = 1;.#endif.
fea0: 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 locksCount = (
feb0: 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a int) num_locks;.
fec0: 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c locks = mall
fed0: 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 oc(sizeof(*locks
fee0: 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a ) * num_locks);.
fef0: 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 memset(locks
ff00: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 , 0, sizeof(*loc
ff10: 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 ks) * num_locks)
ff20: 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 ;..#if OPENSSL_V
ff30: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
ff40: 30 78 31 30 30 30 30 30 30 30 4c 0a 20 20 20 20 0x10000000L.
ff50: 43 52 59 50 54 4f 5f 73 65 74 5f 6c 6f 63 6b 69 CRYPTO_set_locki
ff60: 6e 67 5f 63 61 6c 6c 62 61 63 6b 28 43 72 79 70 ng_callback(Cryp
ff70: 74 6f 54 68 72 65 61 64 4c 6f 63 6b 43 61 6c 6c toThreadLockCall
ff80: 62 61 63 6b 29 3b 0a 20 20 20 20 43 52 59 50 54 back);. CRYPT
ff90: 4f 5f 73 65 74 5f 69 64 5f 63 61 6c 6c 62 61 63 O_set_id_callbac
ffa0: 6b 28 43 72 79 70 74 6f 54 68 72 65 61 64 49 64 k(CryptoThreadId
ffb0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6c 69 66 Callback);.#elif
ffc0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
ffd0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
ffe0: 30 30 30 30 4c 0a 20 20 20 20 43 52 59 50 54 4f 0000L. CRYPTO
fff0: 5f 73 65 74 5f 6c 6f 63 6b 69 6e 67 5f 63 61 6c _set_locking_cal
10000 6c 62 61 63 6b 28 43 72 79 70 74 6f 54 68 72 65 lback(CryptoThre
10010 61 64 4c 6f 63 6b 43 61 6c 6c 62 61 63 6b 29 3b adLockCallback);
10020 0a 20 20 20 20 43 52 59 50 54 4f 5f 54 48 52 45 . CRYPTO_THRE
10030 41 44 49 44 5f 73 65 74 5f 63 61 6c 6c 62 61 63 ADID_set_callbac
10040 6b 28 43 72 79 70 74 6f 54 68 72 65 61 64 49 64 k(CryptoThreadId
10050 43 61 6c 6c 62 61 63 6b 29 0a 23 65 6e 64 69 66 Callback).#endif
10060 0a 23 65 6e 64 69 66 0a 0a 23 20 69 66 20 4f 50 .#endif..# if OP
10070 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
10080 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
10090 30 4c 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 6c 0L. if (SSL_l
100a0 69 62 72 61 72 79 5f 69 6e 69 74 28 29 20 21 3d ibrary_init() !=
100b0 20 31 29 20 7b 0a 20 20 20 20 20 20 20 20 73 74 1) {. st
100c0 61 74 75 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52 atus = TCL_ERROR
100d0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 ;. goto d
100e0 6f 6e 65 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 one;. }.#else
100f0 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 . /* Initiali
10100 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 ze BOTH libcrypt
10110 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f o and libssl. */
10120 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 . OPENSSL_ini
10130 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e t_ssl(OPENSSL_IN
10140 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 IT_LOAD_SSL_STRI
10150 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e NGS | OPENSSL_IN
10160 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 IT_LOAD_CRYPTO_S
10170 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 TRINGS..| OPENSS
10180 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 L_INIT_ADD_ALL_C
10190 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c IPHERS | OPENSSL
101a0 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 _INIT_ADD_ALL_DI
101b0 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 23 65 GESTS, NULL);.#e
101c0 6e 64 69 66 0a 0a 23 20 69 66 20 4f 50 45 4e 53 ndif..# if OPENS
101d0 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
101e0 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 0a R < 0x10100000L.
101f0 20 20 20 20 53 53 4c 5f 6c 6f 61 64 5f 65 72 72 SSL_load_err
10200 6f 72 5f 73 74 72 69 6e 67 73 28 29 3b 0a 20 20 or_strings();.
10210 20 20 45 52 52 5f 6c 6f 61 64 5f 63 72 79 70 74 ERR_load_crypt
10220 6f 5f 73 74 72 69 6e 67 73 28 29 3b 0a 23 65 6c o_strings();.#el
10230 73 65 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 69 se. /* Only i
10240 6e 69 74 69 61 6c 69 7a 65 20 6c 69 62 63 72 79 nitialize libcry
10250 70 74 6f 20 20 2a 2f 0a 20 20 20 20 4f 50 45 4e pto */. OPEN
10260 53 53 4c 5f 69 6e 69 74 5f 63 72 79 70 74 6f 28 SSL_init_crypto(
10270 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 OPENSSL_INIT_LOA
10280 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 D_CRYPTO_STRINGS
10290 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a , NULL);.#endif.
102a0 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c . BIO_new_tcl
102b0 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 (NULL, 0);..#if
102c0 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 0. /*. *
102d0 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 XXX:TODO: Remove
102e0 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64 20 72 this code and r
102f0 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 eplace it with a
10300 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f check. * fo
10310 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79 r enough entropy
10320 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 79 20 and do not try
10330 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 to create our ow
10340 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69 62 6c n. * terribl
10350 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a e entropy. *
10360 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 /. /*. *
10370 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 Seed the random
10380 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 number generator
10390 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72 in the SSL libr
103a0 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e ary,. * usin
103b0 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20 63 g the do/while c
103c0 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 73 65 onstruct because
103d0 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74 65 of the bug note
103e0 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 4f in the. * O
103f0 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68 74 penSSL FAQ at ht
10400 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c tp://www.openssl
10410 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61 71 .org/support/faq
10420 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20 20 .html#USER1.
10430 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63 72 *. * The cr
10440 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c 65 ux of the proble
10450 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72 69 m is that Solari
10460 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 s 7 does not hav
10470 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f e a. * /dev/
10480 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 random or /dev/u
10490 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 73 6f random device so
104a0 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 68 65 it cannot gathe
104b0 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20 r enough. *
104c0 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68 65 entropy from the
104d0 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 68 65 RAND_seed() whe
104e0 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65 n TLS initialize
104f0 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a 20 20 s and refuses.
10500 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 * to go furth
10510 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 72 73 er. Earlier vers
10520 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20 ions of OpenSSL
10530 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 61 72 carried on regar
10540 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 dless.. */.
10550 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 67 6e srand((unsign
10560 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 74 69 ed int) time((ti
10570 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a me_t *) NULL));.
10580 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69 do {..for (i
10590 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b = 0; i < 16; i+
105a0 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65 +) {.. rnd_se
105b0 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68 61 ed[i] = 1 + (cha
105c0 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 6e 64 r) (255.0 * rand
105d0 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 ()/(RAND_MAX+1.0
105e0 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65 ));..}..RAND_see
105f0 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65 d(rnd_seed, size
10600 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20 of(rnd_seed));.
10610 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e 44 } while (RAND
10620 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 29 3b _status() != 1);
10630 0a 23 65 6e 64 69 66 0a 0a 23 20 69 66 20 4f 50 .#endif..# if OP
10640 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
10650 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
10660 30 4c 0a 64 6f 6e 65 3a 0a 23 65 6e 64 69 66 0a 0L.done:.#endif.
10670 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
10680 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
10690 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
106a0 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 ADS)..Tcl_MutexU
106b0 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b nlock(&init_mx);
106c0 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e .#endif...return
106d0 28 73 74 61 74 75 73 29 3b 0a 7d 0a (status);.}.